Apache Beam -- 簡介

概述

在大數據的浪潮之下,技術的更新迭代十分頻繁。受技術開源的影響,大數據開發者提供了十分豐富的工具。但也因爲如此,增加了開發者選擇合適工具的難度。在大數據處理一些問題的時候,往往使用的技術是多樣化的。這完全取決於業務需求,比如進行批處理的MapReduce,實時流處理的Flink,以及SQL交互的Spark SQL等等。而把這些開源框架,工具,類庫,平臺整合到一起,所需要的工作量以及複雜度,可想而知。這也是大數據開發者比較頭疼的問題。而今天要分享的就是整合這些資源的一個解決方案,它就是 Apache Beam。

Beam是一個統一的編程框架,支持批處理和流處理,並可以將用Beam編程模型構造出來的程序,在多個計算引擎(Apache ApexApache FlinkApache SparkGoogle Cloud Dataflow等)上運行。

Apache Beam 是什麼?

Apache Beam是大數據的編程模型,定義了數據處理的編程範式接口,它並不涉及具體的執行引擎的實現,但是,基於Beam開發的數據處理程序可以執行在任意的分佈式計算引擎上,目前Dataflow、Spark、Flink、Apex提供了對批處理和流處理的支持,GearPump提供了流處理的支持,Storm的支持也在開發中。

綜上所述,Apache Beam的目標是:

  1. 提供統一批處理流處理的編程範式
  2. 能運行在任何可執行的引擎之上

爲無限、亂序、互聯網級別的數據集處理提供簡單靈活、功能豐富以及表達能力十分強大的SDK。

那 Apache Beam到底能解決哪些問題,它的應用場景是什麼,下面我們可以通過一張圖來說明,如下圖所示:

通過上圖,我們可以很清晰的看到整個技術的發展流向;一部分是谷歌派系,另一部分則是Apache派系。在開發大數據應用時,我們有時候使用谷歌的框架,API,類庫,平臺等,而有時候我們則使用Apache的,比如:HBase,Flink,Spark等。而我們要整合這些資源則是一個比較頭疼的問題,Apache Beam 的問世,整合這些資源提供了很方便的解決方案。

Beam構成

下面,我們通過一張流程圖來看Beam的運行流程,如下圖所示:

通過上圖,我們可以清楚的知道,執行一個流程分以下步驟:

  1. End Users:選擇一種你熟悉的編程語言提交應用
  2. SDK Writers:該編程語言必須是 Beam 模型支持的
  3. Library Writers:轉換成Beam模型的格式
  4. Runner Writers:在分佈式環境下處理並支持Beam的數據處理管道
  5. IO Providers:在Beam的數據處理管道上運行所有的應用
  6. DSL Writers:創建一個高階的數據處理管道

Beam編程模型

Beam的編程模型是Google的工程師從MapReduceFlumeJava, 和Millwheel等多個大數據處理項目中抽象出來的,如果想詳細瞭解可以參考相關的報考和論文,Streaming 101Streaming 102 和VLDB 2015 paper.。這個編程模型主要包括如下幾個核心概念:

  1. PCollection:數據集,代表了將要被處理的數據集合,可以是有限的數據集,也可以是無限的數據流。
  2. PTransform:計算過程,代表了將輸入數據集處理成輸出數據集中間的計算過程,
  3. Pipeline:管道,代表了處理數據的執行任務,可視作一個有向無環圖(DAG),PCollections是節點,Transforms是邊。
  4. PipelineRunner:執行器,指定了Pipeline將要在哪裏,怎樣的運行。

其中PTransform還包括很多操作,如:

  • ParDo:通用的並行處理的PTranform, 相當於Map/Shuffle/Reduce-style 中的Map,可用於過濾 、類型轉換 、抽取部分數據 、 對數據中的每一個元素做計算等
  • GroupByKey:用來聚合key/value對,相當於Map/Shuffle/Reduce-style中的Shuffle, 聚合那些擁有同一個key的value
  • CoGroupByKey:用來聚合多個集合,功能和GroupByKey類似
  • Combine:處理集合裏的數據,如sum, min, and max(sdk預定義),也可以自建新類
  • Flatten:用來把多個數據集合併成一個數據集
  • Partition:用來把一個數據集分割成多個小數據集

此外還有一些核心概念,如:

  • Windowing:把PCollections數據集中元素通過時間戳分成多個子集
  • Watermark:標記了多久時間後的延遲數據直接拋棄
  • Triggers:用來決定什麼時候發送每個window的聚合結果

Beam的編程模型可簡單概括爲

[Output PCollection] = [Input PCollection].apply([Transform])

數據輸入+數據集+數據處理+數據輸出=數據處理流程。

核心問題

Apache Beam的核心圍繞着4個問題:

  • What 計算的結果是什麼? 
          Pipeline中的轉換來決定結果。例如計算總和,構建直方圖,訓練機器學習模型等等。它也是經典批處理回答的問題。
    對應的抽象概念爲PTransform。

  • Where 在事件時間中的哪個位置計算結果? 
          這個問題是通過在Pipeline中使用事件時間窗口來回答的。這包括從Streaming 101(固定,滑動和會話)窗口的常見示例,似乎沒有窗口概念的用例(例如,Streaming 101中描述的時間不可知處理;經典批處理也通常屬於此類別)和其他更復雜的窗口類型,如時間有限的拍賣。還要注意,它可以包括處理時間窗口,如果在記錄到達系統時將入口時間指定爲記錄的事件時間。對應的抽象概念爲Window

  • When 在處理時間中的哪個時刻觸發計算結果? 
          通過使用Watermark和觸發器來回答的這個問題。這個主題有無窮的變化,但最常見的模式是在給定窗口的輸入完成時使用Watermak來描繪,觸發器允許提前計算結果(對於在窗口完成之前發出的推測性的、部分的結果)和延遲計算結果(Watermark只是預估窗口的數據全部到達,並不是100%確定,在Watermark聲明給定窗口的全部到達之後,也有可能會有隸屬於該窗口的數據到達)。
    對應的抽象概念爲WatermarksTriggers

  • How 如何修正結果? 
          這個問題由所使用的累積類型回答:丟棄(其中結果是相互獨立和不同的),累加(後來的結果建立在先前的結果上),累加和撤銷(當前的累加值和上次觸發的值撤銷一起發送)。
    對應的抽象概念爲Accumulation

總結

Apache Beam 主要針對理想並行的數據處理任務,並通過把數據集拆分多個子數據集,讓每個子數據集能夠被單獨處理,從而實現整體數據集的並行化處理。當然,也可以用 Beam 來處理抽取,轉換和加載任務和數據集成任務(一個ETL過程)。進一步將數據從不同的存儲介質中或者數據源中讀取,轉換數據格式,最後加載到新的系統中。


End

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章