Flink學習之環境搭建,項目結構

1.Flink安裝準備

  1. Flink 是一個以 Java 及 Scala 作爲開發語言的開源大數據項目,代碼開源在 GitHub 上,並使用 Maven 來編譯和構建項目。對於大部分使用 Flink 的同學來說,Java、Maven 和 Git 這三個工具是必不可少的,另外一個強大的 IDE 有助於我們更快的閱讀代碼、開發新功能以及修復 Bug。因爲篇幅所限,我們不會詳述每個工具的安裝細節,但會給出必要的安裝建議。

  2. 關於開發測試環境,Mac OS、Linux 系統或者 Windows 都可以。如果使用的是 Windows 10 系統,建議使用 Windows 10 系統的 Linux 子系統來編譯和運行。

  3. 工具 註釋
    Java Java8以上
    Maven 必須使用Maven3以上版本
    Git Flink 的代碼倉庫是: https://github.com/apache/flink

2.Flink代碼編譯,安裝

  1. 可以在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 包
  2. 目前公司環境是從官網下載的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-userstandalonesession{user}-standalonesession-{id}-${hostname}.log:代碼中的日誌輸出
  • flink-userstandalonesession{user}-standalonesession-{id}-${hostname}.out:進程執行時的stdout輸出
  • flink-userstandalonesession{user}-standalonesession-{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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章