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

做者:簡鋒html

引言

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

Flink生態的現狀

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

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

Flink生態的挑戰和機遇

Flink致力於做爲一個批流統一的大數據計算平臺,還有不少潛力沒有發揮出來,要徹底發揮出它的潛力,就須要一個強大的生態系統。總的來講咱們能夠從2個維度來看這個生態系統:架構

  1. 橫向維度。 橫向維度的生態主要是爲構建一個端到端的解決方案。好比鏈接上下游數據源的各類connector,與下游機器學習框架的整合,與下游BI工具的整合,方便提交和運維Flink Job的工具,提供更好交互式分析體驗的Notebook。併發

  2. 縱向維度。縱向維度是指更加抽象化Flink的計算引擎以適應各類計算場景。好比批流計算的統一,更高計算抽象層Table API,復瑣事件處理引擎(CEP),更高機器學習計算框架(Flink ML),對各類集羣框架的適配等等。框架

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

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

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個連接

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生態圈。

更多資訊請訪問 Apache Flink 中文社區網站

相關文章
相關標籤/搜索