1、Flink1.12.7或1.13.5詳細介紹及本地安裝部署、驗證
一、Flink介紹
官網(wǎng):https://flink.Apache.org/
官網(wǎng)中文:https://flink.Apache.org/zh/
本示例以1.12版本進行介紹,當前版本更新至1.17。
1、1.12版本重要更新
在 DataStream API 上添加了高效的批執(zhí)行模式的支持。這是批處理和流處理實現(xiàn)真正統(tǒng)一的運行時的一個重要里程碑
實現(xiàn)了基于Kubernetes的高可用性(HA)方案,作為生產(chǎn)環(huán)境中,ZooKeeper方案之外的另外一種選擇
擴展了 Kafka SQL connector,使其可以在 upsert 模式下工作,并且支持在 SQL DDL 中處理 connector 的 metadata?,F(xiàn)在,時態(tài)表 Join 可以完全用 SQL 來表示,不再依賴于 Table API 了
PyFlink 中添加了對于 DataStream API 的支持,將 PyFlink 擴展到了更復雜的場景,比如需要對狀態(tài)或者定時器 timer 進行細粒度控制的場景。除此之外,現(xiàn)在原生支持將 PyFlink 作業(yè)部署到 Kubernetes上
Flink 誕生于歐洲的一個大數(shù)據(jù)研究項目 StratoSphere。該項目是柏林工業(yè)大學的一個研究性項目。早期, Flink 是做 Batch 計算的,但是在 2014 年, StratoSphere 里面的核心成員孵化出 Flink,同年將 Flink 捐贈 Apache,并在后來成為 Apache 的頂級大數(shù)據(jù)項目,同時 Flink 計算的主流方向被定位為 Streaming, 即用流式計算來做所有大數(shù)據(jù)的計算。
2014 年 Flink 作為主攻流計算的大數(shù)據(jù)引擎開始在開源大數(shù)據(jù)行業(yè)內(nèi)嶄露頭角。區(qū)別于 Storm、Spark Streaming 以及其他流式計算引擎的是:它不僅是一個高吞吐、低延遲的計算引擎,同時還提供很多高級的功能。比如它提供了有狀態(tài)的計算,支持狀態(tài)管理,支持強一致性的數(shù)據(jù)語義以及支持 基于Event Time的WaterMark對延遲或亂序的數(shù)據(jù)進行處理等。
2015 年阿里巴巴開始使用 Flink 并持續(xù)貢獻社區(qū)(阿里內(nèi)部還基于Flink做了一套Blink),2019年1月8日,阿里巴巴以 9000 萬歐元(7億元人民幣)收購了創(chuàng)業(yè)公司 Data Artisans。
3、編程語言
Flink官方提供了Java、Scala、Python語言接口用以開發(fā)Flink應用程序,但是Flink的源碼是使用Java語言進行開發(fā)的,且Flink被阿里收購后,未來的主要編程語言可能主要會是Java,且GitHub上關于Flink的項目,大多數(shù)是使用Java語言編寫的。
4、組件介紹
1)、Deploy物理部署層
Flink 支持本地運行、能在獨立集群或者在被 YARN 管理的集群上運行, 也能部署在云上。
該層主要涉及Flink的部署模式,目前Flink支持多種部署模式,包括本地、集群(Standalone、YARN)、云(GCE/EC2)、Kubenetes。
Flink能夠通過該層能夠支持不同平臺的部署,用戶可以根據(jù)需要選擇使用對應的部署模式。
2)、Core Runtime核心層
Runtime層提供了支持Flink計算的全部核心實現(xiàn),為上層API層提供基礎服務,該層主要負責對上層不同接口提供基礎服務,也是Flink分布式計算框架的核心實現(xiàn)層。
支持分布式Stream作業(yè)的執(zhí)行、JobGraph到ExecutionGraph的映射轉(zhuǎn)換、任務調(diào)度等。
將DataSteam和DataSet轉(zhuǎn)成統(tǒng)一的可執(zhí)行的Task Operator,達到在流式引擎下同時處理批量計算和流式計算的目的。
3)、API&Libraries層
Flink 首先支持了 Scala 和 Java 的 API、Python 。
DataStream、DataSet、Table、SQL API,作為分布式數(shù)據(jù)處理框架,F(xiàn)link同時提供了支撐計算和批計算的接口,兩者都提供給用戶豐富的數(shù)據(jù)處理高級API,例如Map、FlatMap操作等,也提供比較低級的Process Function API,用戶可以直接操作狀態(tài)和時間等底層數(shù)據(jù)。
4)、擴展庫
Flink 還包括用于復雜事件處理的CEP,機器學習庫FlinkML,圖處理庫Gelly等。
Table 是一種接口化的 SQL 支持,也就是 API 支持(DSL),而不是文本化的SQL 解析和執(zhí)行。
5、四大基石
1)、Checkpoint
這是Flink最重要的一個特性。
Flink基于Chandy-Lamport算法實現(xiàn)了一個分布式的一致性的快照,從而提供了一致性的語義。
2)、State
提供了一致性的語義之后,F(xiàn)link為了讓用戶在編程時能夠更輕松、更容易地去管理狀態(tài),還提供了一套非常簡單明了的State API,包括里面的有ValueState、ListState、MapState、BroadcastState,使用State API能夠自動享受到這種一致性的語義。
3)、Time
Flink實現(xiàn)了Watermark的機制,能夠支持基于事件的時間的處理,能夠容忍遲到/亂序的數(shù)據(jù)。
4)、Window
流計算中一般在對流數(shù)據(jù)進行操作之前都會先進行開窗,即基于一個什么樣的窗口上做這個計算。Flink提供了開箱即用的各種窗口,比如滑動窗口、滾動窗口、會話窗口以及非常靈活的自定義的窗口
6、應用場景
Apache Flink 功能強大,支持開發(fā)和運行多種不同種類的應用程序。它的主要特性包括:批流一體化、精密的狀態(tài)管理、事件時間支持以及精確一次的狀態(tài)一致性保障等。
Flink 不僅可以運行在包括 YARN、 Mesos、Kubernetes 在內(nèi)的多種資源管理框架上,還支持在裸機集群上獨立部署。
在啟用高可用選項的情況下,它不存在單點失效問題。事實證明,F(xiàn)link 已經(jīng)可以擴展到數(shù)千核心,其狀態(tài)可以達到 TB 級別,且仍能保持高吞吐、低延遲的特性。
世界各地有很多要求嚴苛的流處理應用都運行在 Flink 之上。
1)、事件驅(qū)動型應用
事件驅(qū)動型應用是一類具有狀態(tài)的應用,它從一個或多個事件流提取數(shù)據(jù),并根據(jù)到來的事件觸發(fā)計算、狀態(tài)更新或其他外部動作。
事件驅(qū)動型應用是在計算存儲分離的傳統(tǒng)應用基礎上進化而來。在傳統(tǒng)架構(gòu)中,應用需要讀寫遠程事務型數(shù)據(jù)庫。
相反,事件驅(qū)動型應用是基于狀態(tài)化流處理來完成。在該設計中,數(shù)據(jù)和計算不會分離,應用只需訪問本地(內(nèi)存或磁盤)即可獲取數(shù)據(jù)。系統(tǒng)容錯性的實現(xiàn)依賴于定期向遠程持久化存儲寫入 checkpoint。下圖描述了傳統(tǒng)應用和事件驅(qū)動型應用架構(gòu)的區(qū)別。
事件驅(qū)動型應用會受制于底層流處理系統(tǒng)對時間和狀態(tài)的把控能力,F(xiàn)link 諸多優(yōu)秀特質(zhì)都是圍繞這些方面來設計的。它提供了一系列豐富的狀態(tài)操作原語,允許以精確一次的一致性語義合并海量規(guī)模(TB 級別)的狀態(tài)數(shù)據(jù)。此外,F(xiàn)link 還支持事件時間和自由度極高的定制化窗口邏輯,而且它內(nèi)置的 ProcessFunction 支持細粒度時間控制,方便實現(xiàn)一些高級業(yè)務邏輯。同時,F(xiàn)link 還擁有一個復雜事件處理(CEP)類庫,可以用來檢測數(shù)據(jù)流中的模式。
Flink 中針對事件驅(qū)動應用的明星特性當屬 savepoint。Savepoint 是一個一致性的狀態(tài)映像,它可以用來初始化任意狀態(tài)兼容的應用。在完成一次 savepoint 后,即可放心對應用升級或擴容,還可以啟動多個版本的應用來完成 A/B 測試。
典型事件驅(qū)動應用實例:
欺詐檢測(Fraud detection)
異常檢測(Anomaly detection)
基于規(guī)則的告警(Rule-based alerting)
業(yè)務流程監(jiān)控(Business process monitoring)
Web應用程序(社交網(wǎng)絡)
2)、數(shù)據(jù)分析應用
數(shù)據(jù)分析任務需要從原始數(shù)據(jù)中提取有價值的信息和指標。傳統(tǒng)的分析方式通常是利用批查詢,或?qū)⑹录涗浵聛聿⒒诖擞邢迶?shù)據(jù)集構(gòu)建應用來完成。為了得到最新數(shù)據(jù)的分析結(jié)果,必須先將它們加入分析數(shù)據(jù)集并重新執(zhí)行查詢或運行應用,隨后將結(jié)果寫入存儲系統(tǒng)或生成報告。
借助一些先進的流處理引擎,還可以實時地進行數(shù)據(jù)分析。和傳統(tǒng)模式下讀取有限數(shù)據(jù)集不同,流式查詢或應用會接入實時事件流,并隨著事件消費持續(xù)產(chǎn)生和更新結(jié)果。這些結(jié)果數(shù)據(jù)可能會寫入外部數(shù)據(jù)庫系統(tǒng)或以內(nèi)部狀態(tài)的形式維護。儀表展示應用可以相應地從外部數(shù)據(jù)庫讀取數(shù)據(jù)或直接查詢應用的內(nèi)部狀態(tài)。
如下圖所示,Apache Flink 同時支持流式及批量分析應用。
Flink 為持續(xù)流式分析和批量分析都提供了良好的支持。具體而言,它內(nèi)置了一個符合 ANSI 標準的 SQL 接口,將批、流查詢的語義統(tǒng)一起來。無論是在記錄事件的靜態(tài)數(shù)據(jù)集上還是實時事件流上,相同 SQL 查詢都會得到一致的結(jié)果。同時 Flink 還支持豐富的用戶自定義函數(shù),允許在 SQL 中執(zhí)行定制化代碼。如果還需進一步定制邏輯,可以利用 Flink DataStream API 和 DataSet API 進行更低層次的控制。
典型的數(shù)據(jù)分析應用實例
電信網(wǎng)絡質(zhì)量監(jiān)控
移動應用中的產(chǎn)品更新及實驗評估分析
消費者技術中的實時數(shù)據(jù)即席分析
大規(guī)模圖分析
3)、數(shù)據(jù)管道應用
提取-轉(zhuǎn)換-加載(ETL)是一種在存儲系統(tǒng)之間進行數(shù)據(jù)轉(zhuǎn)換和遷移的常用方法。ETL 作業(yè)通常會周期性地觸發(fā),將數(shù)據(jù)從事務型數(shù)據(jù)庫拷貝到分析型數(shù)據(jù)庫或數(shù)據(jù)倉庫。
數(shù)據(jù)管道和 ETL 作業(yè)的用途相似,都可以轉(zhuǎn)換、豐富數(shù)據(jù),并將其從某個存儲系統(tǒng)移動到另一個。但數(shù)據(jù)管道是以持續(xù)流模式運行,而非周期性觸發(fā)。因此它支持從一個不斷生成數(shù)據(jù)的源頭讀取記錄,并將它們以低延遲移動到終點。例如:數(shù)據(jù)管道可以用來監(jiān)控文件系統(tǒng)目錄中的新文件,并將其數(shù)據(jù)寫入事件日志;另一個應用可能會將事件流物化到數(shù)據(jù)庫或增量構(gòu)建和優(yōu)化查詢索引。
下圖描述了周期性 ETL 作業(yè)和持續(xù)數(shù)據(jù)管道的差異。
很多常見的數(shù)據(jù)轉(zhuǎn)換和增強操作可以利用 Flink 的 SQL 接口(或 Table API)及用戶自定義函數(shù)解決。如果數(shù)據(jù)管道有更高級的需求,可以選擇更通用的 DataStream API 來實現(xiàn)。Flink 為多種數(shù)據(jù)存儲系統(tǒng)(如:Kafka、Kinesis、Elasticsearch、JDBC數(shù)據(jù)庫系統(tǒng)等)內(nèi)置了連接器。同時它還提供了文件系統(tǒng)的連續(xù)型數(shù)據(jù)源及數(shù)據(jù)匯,可用來監(jiān)控目錄變化和以時間分區(qū)的方式寫入文件。
典型的數(shù)據(jù)管道應用實例
電子商務中的實時查詢索引構(gòu)建
電子商務中的持續(xù) ETL
7、flink優(yōu)勢
Flink 具備統(tǒng)一的框架處理有界和無界兩種數(shù)據(jù)流的能力
1、部署靈活,F(xiàn)link 底層支持多種資源調(diào)度器,包括Yarn、Kubernetes 等。Flink 自身帶的Standalone 的調(diào)度器,在部署上也十分靈活。
2、極高的可伸縮性,可伸縮性對于分布式系統(tǒng)十分重要。
3、極致的流式處理性能。Flink 相對于Storm 最大的特點是將狀態(tài)語義完全抽象到框架中,支持本地狀態(tài)讀取,避免了大量網(wǎng)絡IO,可以極大提升狀態(tài)存取的性能。
4、同時支持高吞吐、低延遲、高性能。Flink 是目前開源社區(qū)中唯一一套集高吞吐、低延遲、高性能三者于一身的分布式流式數(shù)據(jù)處理框架。Spark 只能兼顧高吞吐和高性能特性,無法做到低延遲保障,因為Spark是用批處理來做流處理。Storm 只能支持低延時和高性能特性,無法滿足高吞吐的要求。
5、支持事件時間(Event Time)概念。在流式計算領域中,窗口計算的地位舉足輕重,但目前大多數(shù)框架窗口計算采用的都是系統(tǒng)時間(Process Time),也就是事件傳輸?shù)接嬎憧蚣芴幚頃r,系統(tǒng)主機的當前時間。Flink 能夠支持基于事件時間(Event Time)語義進行窗口計算。這種基于事件驅(qū)動的機制使得事件即使亂序到達甚至延遲到達,流系統(tǒng)也能夠計算出精確的結(jié)果,保持了事件原本產(chǎn)生時的時序性,盡可能避免網(wǎng)絡傳輸或硬件系統(tǒng)的影響。
6、支持有狀態(tài)計算。Flink1.4開始支持有狀態(tài)計算。所謂狀態(tài)就是在流式計算過程中將算子的中間結(jié)果保存在內(nèi)存或者文件系統(tǒng)中,等下一個事件進入算子后可以從之前的狀態(tài)中獲取中間結(jié)果,計算當前的結(jié)果,從而無須每次都基于全部的原始數(shù)據(jù)來統(tǒng)計結(jié)果,極大的提升了系統(tǒng)性能,狀態(tài)化意味著應用可以維護隨著時間推移已經(jīng)產(chǎn)生的數(shù)據(jù)聚合。
7、支持高度靈活的窗口(Window)操作。Flink 將窗口劃分為基于 Time 、Count 、Session、以及Data-Driven等類型的窗口操作,窗口可以用靈活的觸發(fā)條件定制化來達到對復雜的流傳輸模式的支持,用戶可以定義不同的窗口觸發(fā)機制來滿足不同的需求。
8、基于輕量級分布式快照(Snapshot/Checkpoints)的容錯機制。Flink 能夠分布運行在上千個節(jié)點上,通過基于分布式快照技術的Checkpoints,將執(zhí)行過程中的狀態(tài)信息進行持久化存儲,一旦任務出現(xiàn)異常停止,F(xiàn)link 能夠從 Checkpoints 中進行任務的自動恢復,以確保數(shù)據(jù)處理過程中的一致性。Flink 的容錯能力是輕量級的,允許系統(tǒng)保持高并發(fā),同時在相同時間內(nèi)提供強一致性保證。
9、基于 JVM 實現(xiàn)的獨立的內(nèi)存管理。Flink 實現(xiàn)了自身管理內(nèi)存的機制,通過使用散列,索引,緩存和排序有效地進行內(nèi)存管理,通過序列化/反序列化機制將所有的數(shù)據(jù)對象轉(zhuǎn)換成二進制在內(nèi)存中存儲,降低數(shù)據(jù)存儲大小的同時,更加有效的利用空間。使其獨立于 Java 的默認垃圾收集器,盡可能減少 JVM GC 對系統(tǒng)的影響。
10、SavePoints。對于 7 * 24 小時運行的流式應用,數(shù)據(jù)源源不斷的流入,在一段時間內(nèi)應用的終止有可能導致數(shù)據(jù)的丟失或者計算結(jié)果的不準確。比如集群版本的升級,停機運維操作等。Flink 通過SavePoints 技術將任務執(zhí)行的快照保存在存儲介質(zhì)上,當任務重啟的時候,可以從事先保存的 SavePoints 恢復原有的計算狀態(tài),使得任務繼續(xù)按照停機之前的狀態(tài)運行。Flink 保存點提供了一個狀態(tài)化的版本機制,使得能以無丟失狀態(tài)和最短停機時間的方式更新應用或者回退歷史數(shù)據(jù)。
11、靈活的部署方式,支持大規(guī)模集群。Flink 被設計成能用上千個點在大規(guī)模集群上運行。除了支持獨立集群部署外,F(xiàn)link 還支持 YARN 和Mesos 方式部署。
12、Flink 的程序內(nèi)在是并行和分布式的。數(shù)據(jù)流可以被分區(qū)成 stream partitions,operators 被劃分為operator subtasks;這些 subtasks 在不同的機器或容器中分不同的線程獨立運行;operator subtasks 的數(shù)量就是operator的并行計算數(shù),不同的 operator 階段可能有不同的并行數(shù);如下圖所示,source operator 的并行數(shù)為 2,但最后的 sink operator 為1。
13、豐富的庫。Flink 擁有豐富的庫來進行機器學習,圖形處理,關系數(shù)據(jù)處理等。
二、本地部署及驗證
Flink支持多種安裝模式
Local—本地單機模式,學習測試時使用
Standalone—獨立集群模式,F(xiàn)link自帶集群,開發(fā)測試環(huán)境使用
StandaloneHA—獨立集群高可用模式,F(xiàn)link自帶集群,開發(fā)測試環(huán)境使用
On Yarn—計算資源統(tǒng)一由Hadoop YARN管理,生產(chǎn)環(huán)境使用
部署前提,最新版本1.17要求java 11以上版本,1.12還可以使用java 8版本。
1)、下載安裝文件
下載地址:https://flink.apache.org/downloads/
選擇自己需要的版本下載即可
本示例選擇的是1.13.5版本
2)、解壓
tar -xzf flink-1.13.5-bin-scala_2.11.tgz -C /usr/local/flink-1.13.5
cd /usr/local/flink-1.13.5/bin
[root@server2 bin]# pwd
/usr/local/flink-1.13.5/bin
[root@server2 bin]# ll
總用量 2368
-rw-r–r– 1 1006 1007 2289670 12月 15 2021 bash-java-utils.jar
-rwxr-xr-x 1 1006 1007 20576 12月 14 2021 config.sh
-rwxr-xr-x 1 1006 1007 1318 12月 14 2021 find-flink-home.sh
-rwxr-xr-x 1 1006 1007 2381 12月 14 2021 flink
-rwxr-xr-x 1 1006 1007 4137 12月 14 2021 flink-console.sh
-rwxr-xr-x 1 1006 1007 6584 12月 14 2021 flink-daemon.sh
-rwxr-xr-x 1 1006 1007 1564 12月 14 2021 historyserver.sh
-rwxr-xr-x 1 1006 1007 2295 12月 14 2021 jobmanager.sh
-rwxr-xr-x 1 1006 1007 1650 12月 14 2021 kubernetes-jobmanager.sh
-rwxr-xr-x 1 1006 1007 1717 12月 14 2021 kubernetes-session.sh
-rwxr-xr-x 1 1006 1007 1770 12月 14 2021 kubernetes-taskmanager.sh
-rwxr-xr-x 1 1006 1007 1133 12月 14 2021 mesos-appmaster-job.sh
-rwxr-xr-x 1 1006 1007 1137 12月 14 2021 mesos-appmaster.sh
-rwxr-xr-x 1 1006 1007 1958 12月 14 2021 mesos-jobmanager.sh
-rwxr-xr-x 1 1006 1007 1891 12月 14 2021 mesos-taskmanager.sh
-rwxr-xr-x 1 1006 1007 2994 12月 14 2021 pyflink-shell.sh
-rwxr-xr-x 1 1006 1007 3742 12月 14 2021 sql-client.sh
-rwxr-xr-x 1 1006 1007 2006 12月 14 2021 standalone-job.sh
-rwxr-xr-x 1 1006 1007 1837 12月 14 2021 start-cluster.sh
-rwxr-xr-x 1 1006 1007 3380 12月 14 2021 start-scala-shell.sh
-rwxr-xr-x 1 1006 1007 1854 12月 14 2021 start-zookeeper-quorum.sh
-rwxr-xr-x 1 1006 1007 1617 12月 14 2021 stop-cluster.sh
-rwxr-xr-x 1 1006 1007 1845 12月 14 2021 stop-zookeeper-quorum.sh
-rwxr-xr-x 1 1006 1007 2960 12月 14 2021 taskmanager.sh
-rwxr-xr-x 1 1006 1007 1725 12月 14 2021 yarn-session.sh
-rwxr-xr-x 1 1006 1007 2405 12月 14 2021 zookeeper.sh
3)、啟動集群
start-cluster.sh
[root@server2 bin]# start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host server2.
Starting taskexecutor daemon on host server2.
[root@server2 bin]# jps
26737 Jps
25707 StandaloneSessionClusterEntrypoint
26015 TaskManagerRunner
4)、提交作業(yè)
# 提交任務
flink run ../examples/streaming/WordCount.jar
# 查看運行結(jié)果
tail flink-*-taskexecutor-*.out
[root@server2 bin]# flink run ../examples/streaming/WordCount.jar
Executing WordCount example with default input data set.
Use –input to specify file input.
Printing result to stdout. Use –output to specify output path.
Job has been submitted with JobID c9fd6c83210c067f59ea63ad2b8b2ed1
Program execution finished
Job with JobID c9fd6c83210c067f59ea63ad2b8b2ed1 has finished.
Job Runtime: 718 ms
[root@server2 log]# pwd
/usr/local/flink-1.13.5/log
[root@server2 log]# tail flink-*-taskexecutor-*.out
==> flink-root-taskexecutor-0-localhost.localdomain.out <==
==> flink-root-taskexecutor-0-server2.out <==
(nymph,1)
(in,3)
(thy,1)
(orisons,1)
(be,4)
(all,2)
也可以通過 Flink 的 Web UI 來監(jiān)視集群的狀態(tài)和正在運行的作業(yè),UI界面如下:
查看運行結(jié)果
5)、關閉集群
stop-cluster.sh
[root@server2 bin]# stop-cluster.sh
Stopping taskexecutor daemon (pid: 26015) on host server2.
Stopping standalonesession daemon (pid: 25707) on host server2.
以上,詳細的介紹了flink的背景與優(yōu)勢、應用場景,同時介紹了flink的本地部署及驗證、提交任務等。