Apache Flink®生態所面臨的機遇與挑戰

引言

在談生態之前,我們來聊聊什麼是生態。生態是指在某個特定領域,以某個組件為核心衍生出來其他多個組件,這些組件可以間接或者直接用到這個核心組件,然後輔助這個核心組件共同完成一個更大或者更特殊的任務。Flink生態圈就是指以Flink為核心的生態圈,Flink屬於大數據生態裡的計算環節,只做計算,不做存儲。但是在實際工作當中,你會發現往往單獨用Flink是不夠的。比如你的數據是從哪裡讀出來,Flink計算完之後數據又將存到哪裡,又怎麼消費這些數據。如何利用Flink來完成某個垂直領域的特殊任務等等。這些涉及到上下游,或者更高抽象的任務都需要一個強大的生態圈來完成。

Flink生態的現狀

在講清楚了什麼是生態之後,我們來聊聊目前Flink生態的現狀。整體而言Flink生態還處於相對初級的階段。Flink生態目前主要側重於各種上下游的connector和對各種集群的支持。

截至目前Flink支持的connector有:Kafka,Cassandra,Elasticsearch,Kinesis,RabbitMQ,JDBC,HDFS等等,基本支持所有主流數據源。在集群支持方面,目前Flink支持Standalone和YARN。基於目前生態的狀況,Flink仍然主要應用於流數據的計算。如果要用Flink要做其他一些場景(機器學習,交互式分析)就會比較複雜,用戶體驗上還有很大的提升空間。這也正是Flink生態所面臨的挑戰和機遇。

Flink生態的挑戰和機遇

Flink致力於作為一個批流統一的大數據計算平臺,還有很多潛力沒有發揮出來,要完全發揮出它的潛力,就需要一個強大的生態系統。總的來說我們可以從2個維度來看這個生態系統:

  1. 橫向維度。 橫向維度的生態主要是為構建一個端到端的解決方案。比如連接上下游數據源的各種connector,與下游機器學習框架的整合,與下游BI工具的整合,方便提交和運維Flink Job的工具,提供更好交互式分析體驗的Notebook。
  2. 縱向維度。縱向維度是指更加抽象化Flink的計算引擎以適應各種計算場景。比如批流計算的統一,更高計算抽象層Table API,複雜事件處理引擎(CEP),更高機器學習計算框架(Flink ML),對各種集群框架的適配等等。

下圖是對整個Flink生態在橫向和縱向2個維度的描述。

Apache Flink®生態所面臨的機遇與挑戰

接下來我會對幾個主要的生態點進行逐個闡述

Flink對Hive的集成和支持

Apache Hive是一個有將近10年曆史的Apache頂級項目。項目最初在MapReduce引擎的基礎上封裝了SQL,用戶不再需要寫複雜的MapReduce Job,而只需寫簡單熟悉的SQL語句,用戶的SQL會被翻譯成一個或多個MapReduce Job。隨著項目的不斷演進,Hive的計算引擎發展成可以插拔式,比如,現在Hive就支持MR, Tez, Spark 3種計算引擎。Apache Hive現在已經成為Hadoop生態圈中事實上數據倉庫的標準,很多公司的數據倉庫系統已經在Hive上運轉了很多年。

Flink作為一個批流統一的計算框架,與Hive的集成就變得很自然了。比如通過Flink來做實時ETL,構建實時數據倉庫,然後用Hive SQL做實時數據的查詢。

Flink社區已經創建了 FLINK-10556 來對Hive更好的集成和支持。主要實現的功能有以下幾點:

  • 允許Flink訪問Hive的元數據
  • 允許Flink訪問Hive的表數據
  • Flink兼容Hive的數據類型
  • Flink可以使用Hive UDF
  • 可以在Flink裡使用Hive SQL(包括DML和DDL)

Flink社區正在逐漸實現以上功能。如果你想提前體驗以上功能,可以試用阿里巴巴開源的Blink。開源的Blink已經在元數據(meta data)和數據層將Flink和Hive對接和打通, 用戶可以直接用Flink SQL去查詢Hive的數據,真正能夠做到在Hive引擎和Flink引擎之間的自由切換。為了打通元數據,Blink重構了Flink catalog的實現,並且增加了兩種catalog,一個是基於內存存儲的FlinkInMemoryCatalog,另外一個是能夠橋接Hive MetaStore的HiveCatalog。有了這個HiveCatalog,Flink作業就能讀取Hive的MetaData。為了打通數據,Blink實現了HiveTableSource,使得Flink job可以直接讀取Hive中普通表和分區表的數據。因此,通過這個版本,用戶可以使用Flink SQL讀取已有的Hive meta和data,做數據處理。未來阿里巴巴將在Flink上繼續加大對Hive兼容性的支持,包括支持Hive特有的query,data type,和Hive UDF等等,這些改進都會陸續回饋到Flink社區。

Flink對交互式分析的支持

批處理是流處理之外另一個更大的應用場景。而交互式分析又是批處理的一個大類,特別對於數據分析師和數據科學家,交互式分析尤為重要。

對於交互式分析,Flink本身需要做進一步的改進,以提高Flink在交互式分析方面的性能要求。比如 FLINK-11199,現在在同一個Flink App中的多個Job之間是沒法共享數據的,每個Job的DAG是獨立的,FLINK-11199 就是要解決這個問題,從而對交互式分析提供更友好的支持。

此外,我們需要提供一個交互式分析的平臺讓數據分析師/數據科學家更高效得使用Flink。在這方面Apache Zeppelin已經做了很多工作。 Apache Zeppelin也是Apache的頂級項目,Zeppelin提供一個交互式開發環境,支持Scala,Python,SQL等多種語言,此外Zeppelin天然具有極強的可擴展性,支持多種大數據引擎,比如Spark,Hive,Pig等等。阿里巴巴做了大量的工作讓Zeppelin能夠更好的支持Flink。用戶可以直接在Zeppelin裡面寫Flink代碼(Scala或者SQL),而不用在本地打包,然後用bin/flink腳本來手動提交Job,在Zeppelin裡你可以直接提交Job,然後看到Job的結果,Job結果既可以是文本形式,也可以是可視化出來,特別對於SQL的結果,可視化尤為顯得重要。下面這些是Zeppelin對Flink支持的一些要點:

  • 支持3種運行模式:Local, Remote和Yarn
  • 支持運行Scala,Batch Sql和Stream Sql
  • 支持可視化靜態table和動態table
  • 自動關聯Job URL
  • 支持Cancel Job
  • 支持Flink job的savepoint
  • 支持ZeppelinContext的高級功能,比如創建控件
  • 提供3個tutorial notes: Streaming ETL, Flink Batch Tutorial, Flink Stream Tutorial

這些改動有些是在Flink上的,有些是在Zeppelin上的。在這些改動全部推回Flink和Zeppelin社區之前,大家可以使用這個Zeppelin Docker Image (Blink開源文檔裡的examples中有具體如何下載安裝的細節)來測試和使用這些功能。為了方便用戶試用,我們在這一版zeppelin中提供3個built-in的Flink tutorial的例子: 一個是做Streaming ETL的例子, 另外兩個分別是做Flink Batch, Flink Stream的基礎樣例。具體如何使用,可以參考以下2個鏈接

  • https://flink-china.org/doc/blink/ops/zeppelin.html
  • https://flink-china.org/doc/blink/quickstart/zeppelin_quickstart.html

Flink對機器學習的支持

Apache Flink®生態所面臨的機遇與挑戰

Flink作為一個大數據架構中最重要的計算引擎組件,目前主要的應用場景還是在做傳統的數據計算和處理,也就是傳統的BI(比如實時數據倉庫,實時統計報表等等)。而21世紀將是一個AI爆發的世紀,越來越多的企業和行業開始啟用AI技術來重新革命自己的行業。Flink作為一個大數據計算引擎在這一革命中不可或缺。雖然Flink並不是為機器學習而生的,但是在機器學習中也將扮演不可或缺的角色。未來Flink在機器學習領域主要有3件大事可以做

  • 機器學習Pipeline的構建
  • 傳統機器學習算法的支持
  • 與其他深度學習框架的整合

機器學習主要分2個階段:Training和Predication。但Training和Predication只是做機器學習的一小部分,在Training之前要做數據的清洗,轉換以及Normalization等等,Training之後要做Model的Evaluation。Predication階段也是如此。對於一個複雜的機器學習系統,如何將每個步驟很好的整合起來對於一個系統的健壯性和可擴展性顯得尤為重要。FLINK-11095 就是社區為此正在做的努力。

目前Flink有個flink-ml的模塊實現了一些傳統的機器學習方法,但是仍然需要進一步的改進。

對於深度學習的支持,Flink社區也在這個領域也在積極努力。阿里巴巴內部有TensorFlow on Flink的項目,用戶可以在Flink Job中運行Tensorflow,Flink做數據處理,然後將處理完之後的數據發送給Tensorflow的Python進程做深度學習訓練。在語言層面,Flink正在做對Python的支持。目前Flink只支持Java和Scala的API。這2種語言都是基於JVM的語言,比較適合做系統的大數據工程師,而不適合做數據分析的Data Analyst和做機器學習的Data Scientist。做數據分析和機器學習的人一般會比較喜歡用Python和R等這類更高級的語言。目前Flink社區也在這方面努力,首先Flink會支持Python, 社區已經在這塊開始討論,因為Python在近幾年發展的特別快,這主要得益於AI和Deep Learning的發展。目前流行的Deep Learning的library都提供Python的API,比如TensorFlow,Pytorch,Keras等等。通過對Python語言的支持,用戶可以用一種語言將整個機器學習的Pipeline串接起來,從而提高開發的效率。

Flink Job的提交和運維

在開發環境裡,一般是通過執行shell 命令 bin/flink run 來提交Flink Job。但在真正生產環境裡面,這種方式就會有很多問題。比如如何跟蹤管理Job的狀態,在Job失敗的情況下如何重試,如何併發啟動多個Flink Job,如何方便修改提交Job的參數等等。這些問題雖然可以通過人工干預來解決,但在生產環境里人工干預是最危險的,能自動化的操作我們都要將其自動化。在Flink生態圈裡目前的確缺少這樣一個工具。阿里巴巴內部已經有了這樣一個工具,而且在生產環境裡穩定運行了很長時間,已經被實踐證明是一個可靠穩定的提交和運維Flink Job的工具。目前阿里巴巴正在準備開源這個項目,剝離一些阿里巴巴內部依賴的組件,預計2019年上半年會開源。

總的來說,Flink生態目前問題很多,機會也很多。Apache Flink社區在不斷努力去構建一個更加強大的Flink生態來發揮其強大的計算引擎能力,希望有志參與其中的人可以積極參與,讓我們一起努力來構建一個健康強大的Flink生態圈。


分享到:


相關文章: