1.1 初步認識Apache Flink

流處理技術的演變

在開源世界裏,Apache Storm項目是流處理的先鋒。Storm最先由Nathan Marz和創業公司BackType的一個團隊開發,後來才被Apache基金會接納。Storm提供了低延遲的流處理,可是它爲實時性付出了一些代價:很難實現高吞吐,而且其正確性沒能達到一般所需的水平,換句話說,它並不能保證exactly-once,即使是它可以保證的正確性級別,其開銷也至關大。數據結構

在低延遲和高吞吐的流處理系統中維持良好的容錯性是很是困難的,可是爲了獲得有保障的準確狀態,人們想到了一種替代方法:將連續時間中的流數據分割成一系列微小的批量做業。若是分割得足夠小(即所謂的微批處理做業),計算就幾乎能夠實現真正的流處理。由於存在延遲,因此不可能作到徹底實時,可是每一個簡單的應用程序均可以實現僅有幾秒甚至幾亞秒的延遲。這就是在Spark批處理引擎上運行的Spark Streaming所使用的方法。架構

更重要的是,使用微批處理方法,能夠實現exactly-once語義,從而保障狀態的一致性。若是一個微批處理失敗了,它能夠從新運行,這比連續的流處理方法更容易。Storm Trident是對Storm的延伸,它的底層流處理引擎就是基於微批處理方法來進行計算的,從而實現了exactly-once語義,可是在延遲性方面付出了很大的代價。框架

對於Storm Trident以及Spark Streaming等微批處理策略,只能根據批量做業時間的倍數進行分割,沒法根據實際狀況分割事件數據,而且,對於一些對延遲比較敏感的做業,每每須要開發者在寫業務代碼時花費大量精力來提高性能。這些靈活性和表現力方面的缺陷,使得這些微批處理策略開發速度變慢,運維成本變高。運維

因而,Flink出現了,這一技術框架能夠避免上述弊端,而且擁有所需的諸多功能,還能按照連續事件高效地處理數據,Flink的部分特性以下圖所示:機器學習

圖 Flink的部分特性

初識Flink

Flink起源於Stratosphere項目,Stratosphere是在2010~2014年由3所地處柏林的大學和歐洲的一些其餘的大學共同進行的研究項目,2014年4月Stratosphere的代碼被複制並捐贈給了Apache軟件基金會,參加這個孵化項目的初始成員是Stratosphere系統的核心開發人員,2014年12月,Flink一躍成爲Apache軟件基金會的頂級項目。分佈式

在德語中,Flink一詞表示快速和靈巧,項目採用一隻松鼠的彩色圖案做爲logo,這不只是由於松鼠具備快速和靈巧的特色,還由於柏林的松鼠有一種迷人的紅棕色,而Flink的松鼠logo擁有可愛的尾巴,尾巴的顏色與Apache軟件基金會的logo顏色相呼應,也就是說,這是一隻Apache風格的松鼠。ide

圖 Flink Logo

Flink主頁在其頂部展現了該項目的理念:「Apache Flink是爲分佈式、高性能、隨時可用以及準確的流處理應用程序打造的開源流處理框架」。性能

Apache Flink是一個框架和分佈式處理引擎,用於對無界和有界數據流進行有狀態計算。Flink被設計在全部常見的集羣環境中運行,之內存執行速度和任意規模來執行計算。學習

批處理與流處理

批處理的特色是有界、持久、大量,批處理很是適合須要訪問全套記錄才能完成的計算工做,通常用於離線統計。流處理的特色是無界、實時,流處理方式無需針對整個數據集執行操做,而是對經過系統傳輸的每一個數據項執行操做,通常用於實時統計。設計

在Spark生態體系中,對於批處理和流處理採用了不一樣的技術框架,批處理由SparkSQL實現,流處理由Spark Streaming實現,這也是大部分框架採用的策略,使用獨立的處理器實現批處理和流處理,而Flink能夠同時實現批處理和流處理。

Flink是如何同時實現批處理與流處理的呢?答案是,Flink將批處理(即處理有限的靜態數據)視做一種特殊的流處理。

Flink的核心計算架構是下圖中的Flink Runtime執行引擎,它是一個分佈式系統,可以接受數據流程序並在一臺或多臺機器上以容錯方式執行。

Flink Runtime執行引擎能夠做爲YARN(Yet Another Resource Negotiator)的應用程序在集羣上運行,也能夠在Mesos集羣上運行,還能夠在單機上運行(這對於調試Flink應用程序來講很是有用)。

圖 Flink計算架構

上圖爲Flink技術棧的核心組成部分,值得一提的是,Flink分別提供了面向流式處理的接口(DataStream API)和麪向批處理的接口(DataSet API)。所以,Flink既能夠完成流處理,也能夠完成批處理。Flink支持的拓展庫涉及機器學習(FlinkML)、復瑣事件處理(CEP)、以及圖計算(Gelly),還有分別針對流處理和批處理的Table API。

能被Flink Runtime執行引擎接受的程序很強大,可是這樣的程序有着冗長的代碼,編寫起來也很費力,基於這個緣由,Flink提供了封裝在Runtime執行引擎之上的API,以幫助用戶方便地生成流式計算程序。Flink 提供了用於流處理的DataStream API和用於批處理的DataSet API。值得注意的是,儘管Flink Runtime執行引擎是基於流處理的,可是DataSet API先於DataStream API被開發出來,這是由於工業界對無限流處理的需求在Flink誕生之初並不大。

DataStream API能夠流暢地分析無限數據流,而且能夠用Java或者Scala來實現。開發人員須要基於一個叫DataStream的數據結構來開發,這個數據結構用於表示永不中止的分佈式數據流。

Flink的分佈式特色體如今它可以在成百上千臺機器上運行,它將大型的計算任務分紅許多小的部分,每一個機器執行一部分。Flink可以自動地確保發生機器故障或者其餘錯誤時計算可以持續進行,或者在修復bug或進行版本升級後有計劃地再執行一次。這種能力使得開發人員不須要擔憂運行失敗。Flink本質上使用容錯性數據流,這使得開發人員能夠分析持續生成且永遠不結束的數據(即流處理)。

相關文章
相關標籤/搜索