嚐嚐 Blink
期待 Flink 1.9 整合 Flink 和 Blink 的版本。突然心血來潮,打算自己編一版 Blink 玩玩,這篇文章分為兩個部分:
-
介紹如何編譯Blink,這部分非常簡單的入門
-
介紹一下,我關注blink的點
編譯Blink
首先,clone倉庫
https://github.com/apache/flink.git
切換到 Blink 分支
git checkout blink
看程式碼的話,牆裂推薦使用 VS Code , 管理 git 相當舒服
開POM 註釋掉,這個是為了避免編譯失敗
<module>flink-yarn-tests</module> <module>flink-fs-tests</module>
如果你上網不夠科學,加上阿里雲的倉庫吧
<repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository>
執行編譯
mvn clean install -Dmaven.test.skip -Dcheckstyle.skip -Dlicense.skip=true -Drat.ignoreErrors=true
經過漫長的等待
[INFO] Reactor Summary: [INFO] [INFO] force-shading ...................................... SUCCESS [3.950 s] [INFO] flink .............................................. SUCCESS [01:03 min] [INFO] flink-annotations .................................. SUCCESS [2.049 s] [INFO] flink-shaded-hadoop ................................ SUCCESS [0.103 s] [INFO] flink-shaded-hadoop2 ............................... SUCCESS [ 12.594 s] [INFO] flink-shaded-hadoop2-uber .......................... SUCCESS [ 14.808 s] [INFO] flink-shaded-yarn-tests ............................ SUCCESS [ 13.040 s] [INFO] flink-shaded-curator ............................... SUCCESS [0.921 s] [INFO] flink-test-utils-parent ............................ SUCCESS [0.124 s] [INFO] flink-test-utils-junit ............................. SUCCESS [0.902 s] [INFO] flink-metrics ...................................... SUCCESS [0.124 s] [INFO] flink-metrics-core ................................. SUCCESS [3.522 s] [INFO] flink-core ......................................... SUCCESS [ 15.602 s] [INFO] flink-java ......................................... SUCCESS [9.191 s] [INFO] flink-queryable-state .............................. SUCCESS [0.962 s] [INFO] flink-queryable-state-client-java .................. SUCCESS [3.069 s] [INFO] flink-filesystems .................................. SUCCESS [0.103 s] [INFO] flink-hadoop-fs .................................... SUCCESS [4.955 s] [INFO] flink-metrics-dropwizard ........................... SUCCESS [1.979 s] [INFO] flink-runtime ...................................... SUCCESS [ 57.828 s] [INFO] flink-optimizer .................................... SUCCESS [3.709 s] [INFO] flink-clients ...................................... SUCCESS [3.399 s] [INFO] flink-streaming-java ............................... SUCCESS [8.376 s] [INFO] flink-scala ........................................ SUCCESS [ 27.133 s] [INFO] flink-examples ..................................... SUCCESS [0.598 s] [INFO] flink-examples-batch ............................... SUCCESS [ 16.918 s] [INFO] flink-test-utils ................................... SUCCESS [5.793 s] [INFO] flink-state-backends ............................... SUCCESS [0.108 s] [INFO] flink-statebackend-rocksdb ......................... SUCCESS [2.727 s] [INFO] flink-libraries .................................... SUCCESS [0.100 s] [INFO] flink-cep .......................................... SUCCESS [2.149 s] [INFO] flink-java8 ........................................ SUCCESS [2.744 s] [INFO] flink-mapr-fs ...................................... SUCCESS [2.738 s] [INFO] flink-s3-fs-hadoop ................................. SUCCESS [ 17.525 s] [INFO] flink-s3-fs-presto ................................. SUCCESS [ 19.891 s] [INFO] flink-swift-fs-hadoop .............................. SUCCESS [ 17.337 s] [INFO] flink-runtime-web .................................. SUCCESS [01:42 min] [INFO] flink-connectors ................................... SUCCESS [0.077 s] [INFO] flink-hadoop-compatibility ......................... SUCCESS [6.473 s] [INFO] flink-yarn ......................................... SUCCESS [8.879 s] [INFO] flink-yarn-shuffle ................................. SUCCESS [6.237 s] [INFO] flink-tests ........................................ SUCCESS [2.834 s] [INFO] flink-streaming-scala .............................. SUCCESS [8.994 s] [INFO] flink-table-common ................................. SUCCESS [1.497 s] [INFO] flink-python ....................................... SUCCESS [1.887 s] [INFO] flink-service ...................................... SUCCESS [0.696 s] [INFO] flink-table ........................................ SUCCESS [01:58 min] [INFO] flink-orc .......................................... SUCCESS [2.527 s] [INFO] flink-jdbc ......................................... SUCCESS [1.426 s] [INFO] flink-hbase ........................................ SUCCESS [8.836 s] [INFO] flink-hcatalog ..................................... SUCCESS [6.174 s] [INFO] flink-formats ...................................... SUCCESS [0.102 s] [INFO] flink-avro ......................................... SUCCESS [3.269 s] [INFO] flink-json ......................................... SUCCESS [1.709 s] [INFO] flink-metrics-jmx .................................. SUCCESS [1.229 s] [INFO] flink-connector-kafka-base ......................... SUCCESS [5.958 s] [INFO] flink-connector-kafka-0.8 .......................... SUCCESS [6.160 s] [INFO] flink-connector-kafka-0.9 .......................... SUCCESS [6.833 s] [INFO] flink-connector-kafka-0.10 ......................... SUCCESS [5.851 s] [INFO] flink-connector-kafka-0.11 ......................... SUCCESS [9.838 s] [INFO] flink-connector-elasticsearch-base ................. SUCCESS [9.183 s] [INFO] flink-connector-elasticsearch ...................... SUCCESS [ 11.425 s] [INFO] flink-connector-elasticsearch2 ..................... SUCCESS [ 16.474 s] [INFO] flink-connector-elasticsearch5 ..................... SUCCESS [ 12.188 s] [INFO] flink-connector-rabbitmq ........................... SUCCESS [1.235 s] [INFO] flink-connector-twitter ............................ SUCCESS [2.843 s] [INFO] flink-connector-nifi ............................... SUCCESS [1.557 s] [INFO] flink-connector-cassandra .......................... SUCCESS [3.526 s] [INFO] flink-connector-filesystem ......................... SUCCESS [2.506 s] [INFO] flink-connector-hive ............................... SUCCESS [ 10.424 s] [INFO] flink-examples-streaming ........................... SUCCESS [ 11.537 s] [INFO] flink-examples-table ............................... SUCCESS [ 10.962 s] [INFO] flink-queryable-state-runtime ...................... SUCCESS [1.331 s] [INFO] flink-end-to-end-tests ............................. SUCCESS [0.097 s] [INFO] flink-parent-child-classloading-test ............... SUCCESS [0.978 s] [INFO] flink-dataset-allround-test ........................ SUCCESS [0.722 s] [INFO] flink-datastream-allround-test ..................... SUCCESS [1.591 s] [INFO] flink-bucketing-sink-test .......................... SUCCESS [1.795 s] [INFO] flink-high-parallelism-iterations-test ............. SUCCESS [7.251 s] [INFO] flink-stream-stateful-job-upgrade-test ............. SUCCESS [3.547 s] [INFO] flink-local-recovery-and-allocation-test ........... SUCCESS [2.437 s] [INFO] flink-elasticsearch1-test .......................... SUCCESS [4.130 s] [INFO] flink-elasticsearch2-test .......................... SUCCESS [3.037 s] [INFO] flink-elasticsearch5-test .......................... SUCCESS [6.161 s] [INFO] flink-distributed-cache-via-blob-test .............. SUCCESS [0.979 s] [INFO] flink-gelly ........................................ SUCCESS [3.699 s] [INFO] flink-gelly-scala .................................. SUCCESS [ 10.951 s] [INFO] flink-gelly-examples ............................... SUCCESS [7.763 s] [INFO] flink-sql-parser ................................... SUCCESS [ 21.362 s] [INFO] flink-sql-client ................................... SUCCESS [5.935 s] [INFO] flink-ml ........................................... SUCCESS [ 31.070 s] [INFO] flink-cep-scala .................................... SUCCESS [5.978 s] [INFO] flink-streaming-python ............................. SUCCESS [5.429 s] [INFO] flink-scala-shell .................................. SUCCESS [6.886 s] [INFO] flink-quickstart ................................... SUCCESS [1.459 s] [INFO] flink-quickstart-java .............................. SUCCESS [0.978 s] [INFO] flink-quickstart-scala ............................. SUCCESS [0.433 s] [INFO] flink-contrib ...................................... SUCCESS [0.099 s] [INFO] flink-connector-wikiedits .......................... SUCCESS [1.367 s] [INFO] flink-container .................................... SUCCESS [0.634 s] [INFO] flink-mesos ........................................ SUCCESS [ 12.866 s] [INFO] flink-metrics-ganglia .............................. SUCCESS [0.779 s] [INFO] flink-metrics-graphite ............................. SUCCESS [0.810 s] [INFO] flink-metrics-prometheus ........................... SUCCESS [1.382 s] [INFO] flink-metrics-statsd ............................... SUCCESS [0.788 s] [INFO] flink-metrics-datadog .............................. SUCCESS [0.563 s] [INFO] flink-metrics-slf4j ................................ SUCCESS [0.739 s] [INFO] flink-kubernetes ................................... SUCCESS [3.697 s] [INFO] flink-docs ......................................... SUCCESS [2.656 s] [INFO] flink-dist ......................................... SUCCESS [ 57.941 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 16:20 min [INFO] Finished at: 2019-04-25T21:35:28+08:00 [INFO] Final Memory: 442M/2717M [INFO] ------------------------------------------------------------------------
終於編譯好了。編譯好的工程在 flink-dist
裡,進入
flink-dist\target\flink-1.5.1-bin\flink-1.5.1\bin
執行
start-cluster.bat
稍微等待一下,web訪問
http://localhost:8081/
關注點
-
SQL/TableAPI
首先,我們對 SQL engine 的架構做了較大的調整。提出了全新的 Query Processor(QP), 它包括了一個優化層(Query Optimizer)和一個運算元層(Query Executor)。這樣一來,流計算和批計算的在這兩層大部分的設計工作就能做到儘可能地複用。另外,SQL 和 TableAPI 的程式最終執行的時候將不會翻譯到 DataStream 和 DataSet 這兩個 API 上,而是直接構建到可執行的 DAG 上來,這樣就使得物理執行運算元的設計不完全依賴底層的 API,有了更大的靈活度,同時執行程式碼也能夠被靈活的 codegen 出來。
唯一的一個影響就是這個版本的 SQL 和 TableAPI 不能和 DataSet 這個 API 進行互相轉換,但仍然保留了和 DataStream API 互相轉換的能力(將 DataStream 註冊成表,或將 Table 轉成 DataStream 後繼續操作)。未來,我們計劃把 dataset 的功能慢慢都在 DataStream 和 TableAPI 上面實現。到那時 DataStream 和 SQL 以及 tableAPI 一樣,是一個可以同時描述 bounded 以及 unbounded processing 的 API。
除了架構上的重構,Blink 還在具體實現上做了較多比較大的重構。 首先,Blink 引入了二進位制的資料結構 BinaryRow,極大的減少了資料儲存上的開銷以及資料在序列化和反序列化上計算的開銷。 其次,在運算元的實現層面,Blink 在更廣範圍內引入了 CodeGen 技術。由於預先知道運算元需要處理的資料的型別,在 QP 層內部就可以直接生成更有針對性更高效的執行程式碼。Blink 的運算元會動態的申請和使用資源,能夠更好的利用資源,提升效率,更加重要的是這些運算元對資源有著比較好的控制,不會發生 OutOfMemory 的問題。 此外,針對流計算場景,Blink 加入了 miniBatch 的執行模式,在 aggregate、join 等需要和 state 頻繁互動且往往又能先做部分 reduce 的場景中,使用 miniBatch 能夠極大的減少 IO,從而成數量級的提升效能。除了上面提到的這些重要的重構和功能點,Blink 還實現了完整的 SQL DDL,帶 emit 策略的流計算 DML,若干重要的 SQL 功能,以及大量的效能優化策略。 有了上面提到的諸多架構和實現上的重構。Blink 的 SQL/tableAPI 在功能和效能方面都取得了脫胎換骨的變化。在批計算方面,首先 Blink batch SQL 能夠完整地跑通 TPC-H 和 TPC-DS,且效能上有了極大的提升。
在扒程式碼的時候,在 flink-libraries
下發現了兩個有意思的新工程,這股市是上面提到部分SQL解析相關的工程,日後可以研讀一下
flink-sql-client flink-sql-parser
-
Zeppelin for Flink
為了提供更好的視覺化和互動式體驗,我們做了大量的工作讓 Zeppelin 能夠更好的支援 Flink。這些改動有些是在 Flink 上的,有些是在 Zeppelin 上的。在這些改動全部推回 Flink 和 Zeppelin 社群之前,大家可以使用這個 Zeppelin image (具體細節請參考 Blink 程式碼裡的 docs/quickstart/zeppelin_quickstart.md) 來測試和使用這些功能。 這個用於測試的 Zeppelin 版本,首先很好地融合和集成了 Flink 的多種執行模式以及運維介面。使用文字 SQL 和 tableAPI 可以自如的查詢 Flink 的 static table 和 dynamic table。此外,針對 Flink 的流計算的特點,這一版 Zeppelin 也很好地支援了 savepoint,使用者可以在介面上暫停作業,然後再從 savepoint 恢復繼續執行作業。 在資料展示方面,除了傳統的資料分析介面,我們也添加了流計算的翻牌器和時間序列展示等等功能。為了方便使用者試用,我們在這一版 zeppelin 中提供 3 個 built-in 的 Flink tutorial 的例子: 一個是做 Streaming ETL 的例子, 另外兩個分別是做 Flink Batch, Flink Stream 的基礎樣例。
zeppelin 一直是我非常欣賞的專案,最近一兩年裡,我總是在構想如何想把他運用到BI或其他領域的產品中,只是一直沒能如願,希望日後有機會能夠完成這個心願。