1.Flink安裝準備
-
Flink 是一個以 Java 及 Scala 作爲開發語言的開源大數據項目,代碼開源在 GitHub 上,並使用 Maven 來編譯和構建項目。對於大部分使用 Flink 的同學來說,Java、Maven 和 Git 這三個工具是必不可少的,另外一個強大的 IDE 有助於我們更快的閱讀代碼、開發新功能以及修復 Bug。因爲篇幅所限,我們不會詳述每個工具的安裝細節,但會給出必要的安裝建議。
-
關於開發測試環境,Mac OS、Linux 系統或者 Windows 都可以。如果使用的是 Windows 10 系統,建議使用 Windows 10 系統的 Linux 子系統來編譯和運行。
-
工具 註釋 Java Java8以上 Maven 必須使用Maven3以上版本 Git Flink 的代碼倉庫是: https://github.com/apache/flink
2.Flink代碼編譯,安裝
-
可以在Git上下載源碼以後直接用IDE編譯,編譯生成的三個文件需要留意
版本 註釋 flink-1.10.0.tar.gz Binary的壓縮包 flink-1.10.0-bin/flink-1.10.0 解壓後的 Flink binary 目錄 flink-dist_2.11-1.10.0.jar 包含 Flink 核心功能的 jar 包 -
目前公司環境是從官網下載的binary包安裝完成
3.Flink運行
1.單機standalone運行
1.基本啓動流程
2.常用配置需求
conf / slaves
conf / slaves 用於配置 TaskManager 的部署,默認配置下只會啓動一個 TaskManager 進程,如果想增加一個 TaskManager 進程的,只需要文件中追加一行“localhost”。
也可以直接通過“ ./bin/taskmanager.sh start ”這個命令來追加一個新的 TaskManager:
conf/flink-conf.yaml
conf/flink-conf.yaml 用於配置 JM 和 TM 的運行參數
3.日誌查看需求
JobManager 和 TaskManager 的啓動日誌可以在 Flink binary 目錄下的 Log 子目錄中找到。Log 目錄中以“flink-{id}-${hostname}”爲前綴的文件對應的是 JobManager 的輸出,其中有三個文件:
- flink-{id}-${hostname}.log:代碼中的日誌輸出
- flink-{id}-${hostname}.out:進程執行時的stdout輸出
- flink-{id}-${hostname}-gc.log:JVM的GC的日誌
Log 目錄中以“flink-{id}-${hostname}”爲前綴的文件對應的是 TaskManager 的輸出,也包括三個文件,和 JobManager 的輸出一致。
日誌的配置文件在 Flink binary 目錄的 conf 子目錄下,其中:
- log4j-cli.properties:用 Flink 命令行時用的 log 配置,比如執行“ flink run”命令
- log4j-yarn-session.properties:用 yarn-session.sh 啓動時命令行執行時用的 log 配置
- log4j.properties:無論是 Standalone 還是 Yarn 模式,JobManager 和 TaskManager 上用的 log 配置都是 log4j.properties
這三個“log4j.*properties”文件分別有三個“logback.*xml”文件與之對應,如果想使用 Logback 的同學,之需要把與之對應的“log4j.*properties”文件刪掉即可,對應關係如下:
- log4j-cli.properties -> logback-console.xml
- log4j-yarn-session.properties -> logback-yarn.xml
- log4j.properties -> logback.xml
需要注意的是,“flink-{id}-和{user}-taskexecutor-{hostname}”都帶有“,{id}”表示本進程在本機上該角色(JobManager 或 TaskManager)的所有進程中的啓動順序,默認從 0 開始。
2.使用Yarn模式運行FlinkJob
1.優點
相對於 Standalone 模式,Yarn 模式允許 Flink job 的好處有:
-
資源按需使用,提高集羣的資源利用率
-
任務有優先級,根據優先級運行作業
-
基於 Yarn 調度系統,能夠自動化地處理各個角色的 Failover
○ JobManager 進程和 TaskManager 進程都由 Yarn NodeManager 監控
○ 如果 JobManager 進程異常退出,則 Yarn ResourceManager 會重新調度 JobManager 到其他機器
○ 如果 TaskManager 進程異常退出,JobManager 會收到消息並重新向 Yarn ResourceManager 申請資源,重新啓動 TaskManager
2.目前提交方式------Job Cluster 模式
./bin/flink run -m yarn-cluster -yn 2 examples/streaming/WordCount.jar --input hdfs:*****
output hdfs:*******
常用的配置有:
- -yn,–yarncontainer Number of Task Managers
- -yqu,–yarnqueue Specify YARN queue.
- -ys,–yarnslots Number of slots per TaskManager
- -yqu,–yarnqueue Specify YARN queue.
以下爲Flink各個模塊之間的層級關係
作爲軟件堆棧,Flink是一個分層系統。堆棧的不同層構建在彼此之上,並提高它們接受的程序表示的抽象級別:
- 運行層(runtime layer)以JobGraph的形式接收程序。JobGraph是一個通用的並行數據流,具有消費和產生數據流的任意任務。
- DataStream API和DataSet API都通過單獨的編譯過程生成JobGraphs。DataSet API使用優化器來確定程序的最佳計劃,而DataStream API使用流構建器。
- JobGraph根據Flink中提供的各種部署選項執行(例如,本地,遠程,YARN等)
- 與Flink捆綁在一起的庫和API生成DataSet或DataStream API程序。這些是用於基於邏輯表的查詢,用於機器學習的FlinkML和用於圖形處理的Gelly。
新版本支持
Apache Flink 1.10.0 於 2020年02月11日正式發佈。Flink 1.10 是一個歷時非常長、代碼變動非常大的版本,也是 Flink 社區迄今爲止規模最大的一次版本升級,Flink 1.10 容納了超過 200 位貢獻者對超過 1200 個 issue 的開發實現,包含對 Flink 作業的整體性能及穩定性的顯著優化、對原生 Kubernetes 的初步集成以及對 Python 支持(PyFlink)的重大優化。
託管內存擴展
擴展了託管內存,以解決RocksDBStateBackend的內存使用問題。雖然批處理作業可以使用堆上或堆外的內存,但是帶有 RocksDBStateBackend的流作業只能使用堆上的內存。因此,爲了允許用戶在流執行和批處理執行之間切換而不必修改集羣配置,託管內存現在始終處於堆外狀態。
簡化的RocksDB配置
配置像RocksDB這樣的堆外狀態後端曾經需要進行大量的手動調整,例如減小JVM堆大小或將Flink設置爲使用堆外內存。現在可以通過Flink的現成配置來實現,調整“RocksDBStateBackend”的內存預算就像調整託管內存大小一樣簡單。
統一作業提交的邏輯
在Flink 1.10中,作業提交邏輯被抽象到通用的 Executor界面(FLIP-73[2])。附加的 ExecutorCLI(FLIP-81[3])引入了一種統一的方式來爲 任何 執行目標指定配置參數。爲了完善這項工作,結果檢索的過程也與工作提交分離,引入了 JobClient(FLINK-74[4]),負責獲取 JobExecutionResult。
Table API/SQL:生產就緒的Hive集成
Hive集成在Flink 1.9中宣佈爲預覽功能。此第一個實現允許用戶使用SQL DDL將特定於Flink的元數據保留在Hive Metastore中,調用在Hive中定義的UDF,並使用Flink讀取和寫入Hive表。Flink 1.10通過進一步的開發使這項工作更加完善,這些開發使Flink可以進行生產就緒的Hive集成。
批處理SQL的原生分區支持
到目前爲止,僅支持對未分區的Hive表進行寫入。在Flink 1.10中,Flink SQL語法已通過 INSERT OVERWRITE和 PARTITION進行了擴展(FLIP-63),使用戶可以在Hive中寫入靜態和動態分區。
靜態分區寫入
||INSERT
{
INTO
| OVERWRITE }
TABLE
tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
FROM
from_statement;
||
動態分區編寫
||INSERT
{
INTO
| OVERWRITE }
TABLE
tablename1 select_statement1
FROM
from_statement;
||
完全支持的分區表使用戶可以利用讀取時的分區修剪功能,通過減少需要掃描的數據量來顯着提高這些操作的性能。
其他優化
除分區修剪外,Flink 1.10還爲Hive集成引入了更多的讀取優化,例如:
- 投影下推(Projection pushdown) : Flink通過省略表掃描中不必要的字段,利用投影下推來最大程度地減少Flink和Hive表之間的數據傳輸。這對於具有大量列的表尤其有利。
- LIMIT下推(LIMIT pushdown) :對於帶有LIMIT子句的查詢,Flink將盡可能限制輸出記錄的數量,以最大程度地減少通過網絡傳輸的數據量。
- 讀取時進行ORC矢量化(ORC Vectorization on Read) :可以提高ORC文件的讀取性能,Flink現在默認使用本機ORC矢量化閱讀器,用於高於2.0.0的Hive版本和具有非複雜數據類型的列。
Table API / SQL的其他改進
SQL DDL中的水印和計算列
Flink 1.10支持特定於流的語法擴展,以在Flink SQL DDL中定義時間屬性和水印生成(FLIP-66[7])。這允許基於時間的操作(例如加窗)以及表上的水印策略的定義使用DDL語句創建的。
此版本還引入了對虛擬計算列的支持(FLIP-70[8])可以基於同一表中的其他列或確定性表達式(即字面值,UDF和內置函數)派生。在Flink中,計算列可用於定義創建表時的時間屬性。
SQL DDL的其他擴展
現在,temporary/persistent和system/catalog函數之間有明顯的區別(FLIP-57[9])。這不僅消除了函數引用中的歧義,而且允許確定性的函數解析順序(即,在命名衝突的情況下,系統函數將在目錄函數之前,而臨時函數在這兩個維度上都將優先於持久函數)。
遵循FLIP-57的基礎,我們擴展了SQL DDL語法,以支持創建目錄功能,臨時功能和臨時系統功能(FLIP-79[10]):
可插拔模塊作爲Flink系統對象(Beta)
Flink 1.10爲Flink table core中的可插拔模塊引入了一種通用機制,首先着眼於系統功能(FLIP-68[6])。使用模塊,用戶可以擴展Flink的系統對象,例如使用行爲類似於Flink系統功能的Hive內置函數。此版本附帶預先實現的“ HiveModule”,支持多個Hive版本,但用戶也可以編寫自己的可插拔模塊。
4.Flink項目架構
├── flink-annotations 代碼行數:108 Flink裏面的一些註解
├── flink-clients 代碼行數:7838
│ ├── pom.xml
│ └── src
├── flink-connectors 代碼行數:52165 flink所有支持的連接器以及不同版本支持,經常用在source和sink
│ ├── flink-connector-cassandra
│ ├── flink-connector-elasticsearch2
│ ├── flink-connector-elasticsearch5
│ ├── flink-connector-elasticsearch6
│ ├── flink-connector-elasticsearch7
│ ├── flink-connector-elasticsearch-base
│ ├── flink-connector-filesystem
│ ├── flink-connector-gcp-pubsub
│ ├── flink-connector-hive
│ ├── flink-connector-kafka
│ ├── flink-connector-kafka-0.10
│ ├── flink-connector-kafka-0.11
│ ├── flink-connector-kafka-base
│ ├── flink-connector-kinesis
│ ├── flink-connector-nifi
│ ├── flink-connector-rabbitmq
│ ├── flink-connector-twitter
│ ├── flink-hadoop-compatibility
│ ├── flink-hbase
│ ├── flink-hcatalog
│ ├── flink-jdbc
│ ├── flink-sql-connector-elasticsearch6
│ ├── flink-sql-connector-elasticsearch7
│ ├── flink-sql-connector-kafka
│ ├── flink-sql-connector-kafka-0.10
│ ├── flink-sql-connector-kafka-0.11
│ └── pom.xml
├── flink-container flink job部署在Docker和kubernetes 容器上
│ ├── docker
│ ├── kubernetes
│ ├── pom.xml
│ └── src
├── flink-contrib 代碼行數:421 用於新模塊準備或者孵化的區域
│ ├── docker-flink
│ ├── flink-connector-wikiedits
│ ├── pom.xml
│ └── README.md
├── flink-core 代碼行數:80561 api,資源分配,內存管理,配置等核心代碼
│ ├── pom.xml
│ └── src
├── flink-dist 編譯完成的flink在這裏,bin目錄和conf目錄下的腳本配置在這裏指定,比如啓動、停止的一些腳本
│ ├── pom.xml
│ └── src
├── flink-docs 代碼行數:593 創建HTML文件的生成器
│ ├── pom.xml
│ ├── README.md
│ └── src
├── flink-end-to-end-tests 代碼行數:2039 一些例如es、kafka的測試類
│ ├── flink-batch-sql-test
│ ├── flink-bucketing-sink-test
│ ├── flink-cli-test
│ ├── flink-confluent-schema-registry
│ ├── flink-connector-gcp-pubsub-emulator-tests
│ ├── flink-dataset-allround-test
│ ├── flink-dataset-fine-grained-recovery-test
│ ├── flink-datastream-allround-test
│ ├── flink-distributed-cache-via-blob-test
│ ├── flink-elasticsearch5-test
│ ├── flink-elasticsearch6-test
│ ├── flink-elasticsearch7-test
│ ├── flink-end-to-end-tests-common
│ ├── flink-end-to-end-tests-common-kafka
│ ├── flink-heavy-deployment-stress-test
│ ├── flink-high-parallelism-iterations-test
│ ├── flink-local-recovery-and-allocation-test
│ ├── flink-metrics-availability-test
│ ├── flink-metrics-reporter-prometheus-test
│ ├── flink-parent-child-classloading-test-lib-package
│ ├── flink-parent-child-classloading-test-program
│ ├── flink-plugins-test
│ ├── flink-queryable-state-test
│ ├── flink-quickstart-test
│ ├── flink-rocksdb-state-memory-control-test
│ ├── flink-sql-client-test
│ ├── flink-state-evolution-test
│ ├── flink-streaming-file-sink-test
│ ├── flink-streaming-kafka010-test
│ ├── flink-streaming-kafka011-test
│ ├── flink-streaming-kafka-test
│ ├── flink-streaming-kafka-test-base
│ ├── flink-streaming-kinesis-test
│ ├── flink-stream-sql-test
│ ├── flink-stream-stateful-job-upgrade-test
│ ├── flink-stream-state-ttl-test
│ ├── flink-tpcds-test
│ ├── flink-tpch-test
│ ├── pom.xml
│ ├── README.md
│ ├── run-nightly-tests.sh
│ ├── run-pre-commit-tests.sh
│ ├── run-single-test.sh
│ └── test-scripts
├── flink-examples 代碼行數:6018 flink流處理、批處理,table表的demo
│ ├── flink-examples-batch
│ ├── flink-examples-build-helper
│ ├── flink-examples-streaming
│ ├── flink-examples-table
│ └── pom.xml
├── flink-filesystems 代碼行數:7190 flink支持的文件系統 Hadoop,mapr,s3,swift
│ ├── flink-azure-fs-hadoop
│ ├── flink-fs-hadoop-shaded
│ ├── flink-hadoop-fs
│ ├── flink-mapr-fs
│ ├── flink-oss-fs-hadoop
│ ├── flink-s3-fs-base
│ ├── flink-s3-fs-hadoop
│ ├── flink-s3-fs-presto
│ ├── flink-swift-fs-hadoop
│ └── pom.xml
├── flink-formats 代碼行數:9187 flink格式化 avro,json,parquet等數據格式
│ ├── flink-avro
│ ├── flink-avro-confluent-registry
│ ├── flink-compress
│ ├── flink-csv
│ ├── flink-json
│ ├── flink-orc
│ ├── flink-orc-nohive
│ ├── flink-parquet
│ ├── flink-sequence-file
│ └── pom.xml
├── flink-fs-tests 代碼行數:1592 文件系統測試類
│ ├── pom.xml
│ └── src
├── flink-java 代碼行數:30106 flink裏面例如flatMap、reduce等各種聚合計算方法、算子操作、數據格式輸入輸出
│ ├── pom.xml
│ └── src
├── flink-jepsen 一個基於Jepsen框架的Clojure項目,用於查找Apache Flink®分佈式協調中的bug
│ ├── bin
│ ├── docker
│ ├── project.clj
│ ├── README.md
│ ├── src
│ └── test
├── flink-kubernetes 代碼行數:4210 Blink纔會有的,爲了支持Flink在k8s上運行
│ ├── pom.xml
│ └── src
├── flink-libraries 代碼行數:175695
│ ├── flink-cep 複雜時間編程
│ ├── flink-cep-scala
│ ├── flink-gelly Gelly是Flink的圖形API。目前Java和Scala都支持它。Scala方法是作爲基本Java操作之上的包裝器實現的。該API包含一組用於圖數據分析的實用函數,支持迭代圖數據處理,並引入了一個圖數據算法庫
│ ├── flink-gelly-examples
│ ├── flink-gelly-scala
│ ├── flink-state-processing-api Apache Flink的狀態處理器API爲使用Flink的批數據集API讀取、寫入和修改保存點和檢查點提供了強大的功能。由於數據集和表API的互操作性,甚至可以使用關係表API或SQL查詢來分析和處理狀態數據。
│ └── pom.xml
├── flink-mesos 代碼行數:5543 支持flink在mesos運行
│ ├── pom.xml
│ └── src
├── flink-metrics 代碼行數:3292 flink的metric
信息,支持各種dog,dropwizard,ganglia,graphilte,jmx,prometheus,slf4j,如果要對flink做監控,從這裏入手
│ ├── flink-metrics-core
│ ├── flink-metrics-datadog
│ ├── flink-metrics-dropwizard
│ ├── flink-metrics-graphite
│ ├── flink-metrics-influxdb
│ ├── flink-metrics-jmx
│ ├── flink-metrics-prometheus
│ ├── flink-metrics-slf4j
│ ├── flink-metrics-statsd
│ └── pom.xml
├── flink-ml-parent 機器學習
│ ├── flink-ml-api
│ ├── flink-ml-lib
│ └── pom.xml
├── flink-optimizer 代碼行數:25339 flink優化器,優化計算執行效率更高
│ ├── pom.xml
│ └── src
├── flink-python 新支持,python支持
│ ├── bin
│ ├── dev
│ ├── docs
│ ├── lib
│ ├── MANIFEST.in
│ ├── pom.xml
│ ├── pyflink
│ ├── README.md
│ ├── setup.cfg
│ ├── setup.py
│ ├── src
│ └── tox.ini
├── flink-queryable-state 代碼行數:6276 flink狀態管理機制
│ ├── flink-queryable-state-client-java
│ ├── flink-queryable-state-runtime
│ └── pom.xml
├── flink-quickstart 代碼行數:32 在idea快速生成項目
│ ├── flink-quickstart-java
│ ├── flink-quickstart-scala
│ └── pom.xml
├── flink-runtime 270253 Flink RunTime是介於底層部署與DataSteamApi或DataSetApi之間的一層,以JobGraph形式接收程序,將任務task提交到集羣上執行,RunTime層可以適用不同底層部署模式。
│ ├── pom.xml
│ └── src
├── flink-runtime-web 5302 flink任務webUI
│ ├── pom.xml
│ ├── README.md
│ ├── src
│ └── web-dashboard
├── flink-scala
│ ├── pom.xml
│ └── src
├── flink-scala-shell
│ ├── pom.xml
│ ├── src
│ └── start-script
├── flink-state-backends 代碼行數:7992 flink狀態管理存儲位置,支持rocksdb
│ ├── flink-statebackend-heap-spillable
│ ├── flink-statebackend-rocksdb
│ └── pom.xml
├── flink-streaming-java 76105 流計算中的算子操作
│ ├── pom.xml
│ └── src
├── flink-streaming-scala
│ ├── pom.xml
│ └── src
├── flink-table flink sql相關
│ ├── flink-sql-client
│ ├── flink-sql-parser
│ ├── flink-table-api-java
│ ├── flink-table-api-java-bridge
│ ├── flink-table-api-scala
│ ├── flink-table-api-scala-bridge
│ ├── flink-table-common
│ ├── flink-table-planner
│ ├── flink-table-planner-blink
│ ├── flink-table-runtime-blink
│ ├── flink-table-uber
│ ├── flink-table-uber-blink
│ └── pom.xml
├── flink-tests 37499
│ ├── pom.xml
│ └── src
├── flink-test-utils-parent 3374
│ ├── flink-test-utils
│ ├── flink-test-utils-junit
│ └── pom.xml
├── flink-walkthroughs
│ ├── flink-walkthrough-common
│ ├── flink-walkthrough-datastream-java
│ ├── flink-walkthrough-datastream-scala
│ ├── flink-walkthrough-table-java
│ ├── flink-walkthrough-table-scala
│ └── pom.xml
├── flink-yarn 支持flink在yarn上運行
│ ├── pom.xml
│ └── src
├── flink-yarn-tests
│ ├── pom.xml
│ └── src