Apache Beam 剖析

來源:互聯網
上載者:User

標籤:即時   源碼   資料   pex   str   浪潮   pre   平台   taf   

1.概述

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

2.內容

  Apache Beam 最初叫 Apache Dataflow,由Google和其夥伴向Apache捐贈了大量的核心代碼,並創立孵化了該項目。該項目的大部分大碼來自於 Cloud Dataflow SDK,其特點有以下幾點:

  • 統一資料批處理(Batch)和流處理(Stream)編程的範式
  • 能運行在任何可執行檔引擎之上

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

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

2.1 Vision

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

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

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

  Beam SDK 提供了一個統一的編程模型,來處理任意規模的資料集,其中包括有限的資料集,無限的流資料。Apache Beam SDK 使用相同的類來表達有限和無限的資料,同樣使用相同的轉換方法對資料進行操作。Beam 提供了多種 SDK,你可以選擇一種你熟悉的來建立資料處理管道,如上述的 2.1 中的圖,我們可以知道,目前 Beam 支援 Java,Python 以及其他待開發的語言。

2.3 Pipeline Runners

  在 Beam 管道上運行引擎會根據你選擇的分散式處理引擎,其中相容的 API 轉換你的 Beam 程式應用,讓你的 Beam 應用程式可以有效運行在指定的分散式處理引擎上。因而,當運行 Beam 程式的時候,你可以按照自己的需求選擇一種分散式處理引擎。當前 Beam 支援的管道運行引擎有以下幾種:

  • Apache Apex
  • Apache Flink
  • Apache Spark
  • Google Cloud Dataflow
3.樣本

  本樣本通過使用 Java SDK 來完成,你可以嘗試運行在不同的執行引擎上。

3.1 開發環境
  • 下載安裝 JDK 7 或更新的版本,檢測 JAVA_HOME環境變數
  • 下載 Maven 打包環境。

  關於上述的安裝步驟,並不是本篇部落格的重點,這裡筆者就不多贅述了,不明白的可以到官網翻閱文檔進行安裝。

3.2 下載範例程式碼

  Apache Beam 的原始碼在 Github 有託管,可以到 Github 下載對應的源碼,:https://github.com/apache/beam

  然後,將其中的範例程式碼進行打包,命令如下所示:

$ mvn archetype:generate       -DarchetypeRepository=https://repository.apache.org/content/groups/snapshots \      -DarchetypeGroupId=org.apache.beam       -DarchetypeArtifactId=beam-sdks-java-maven-archetypes-examples       -DarchetypeVersion=LATEST       -DgroupId=org.example       -DartifactId=word-count-beam       -Dversion="0.1"       -Dpackage=org.apache.beam.examples       -DinteractiveMode=false

  此時,命令會建立一個檔案夾 word-count-beam,裡麵包含一個 pom.xml 和相關的代碼檔案。命令如下所示:

$ cd word-count-beam/$ lspom.xml    src$ ls src/main/java/org/apache/beam/examples/DebuggingWordCount.java    WindowedWordCount.java    commonMinimalWordCount.java    WordCount.java
3.3 運行 WordCount 範例程式碼

  一個 Beam 程式可以運行在多個 Beam 的可執行引擎上,包括 ApexRunner,FlinkRunner,SparkRunner 或者 DataflowRunner。 另外還有 DirectRunner。不需要特殊的配置就可以在本地執行,方便測試使用。

  下面,你可以按需選擇你想執行程式的引擎:

  1. 對引擎進行相關配置
  2. 使用不同的命令:通過 --runner=<runner>參數指明引擎類型,預設是 DirectRunner;添加引擎相關的參數;指定輸出檔案和輸出目錄,當然這裡需要保證檔案目錄是執行引擎可以訪問到的,比如本地檔案目錄是不能被外部叢集訪問的。
  3. 運行樣本程式
3.3.1 Direct
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--inputFile=pom.xml --output=counts" -Pdirect-runner
3.3.2 Apex
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--inputFile=pom.xml --output=counts --runner=ApexRunner" -Papex-runner
3.3.3 Flink-Local
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--runner=FlinkRunner --inputFile=pom.xml --output=counts" -Pflink-runner
3.3.4 Flink-Cluster
$ mvn package exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--runner=FlinkRunner --flinkMaster=<flink master> --filesToStage=target/word-count-beam-bundled-0.1.jar \                  --inputFile=/path/to/quickstart/pom.xml --output=/tmp/counts" -Pflink-runner

  然後,你可以通過訪問 http://<flink master>:8081 來監測啟動並執行應用程式。

3.3.5 Spark
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--runner=SparkRunner --inputFile=pom.xml --output=counts" -Pspark-runner
3.3.6 Dataflow
$ mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount      -Dexec.args="--runner=DataflowRunner --gcpTempLocation=gs://<your-gcs-bucket>/tmp \                  --inputFile=gs://apache-beam-samples/shakespeare/* --output=gs://<your-gcs-bucket>/counts" \     -Pdataflow-runner
3.4 運行結果

  當程式運行完成後,你可以看到有多個檔案以 count 開頭,個數取決於執行引擎的類型。當你查看檔案的內容的時候,每個唯一的單詞後面會顯示其出現次數,但是前後順序是不固定的,也是分布式引擎為了提高效率的一種常用方式。

3.4.1 Direct
$ ls counts*$ more counts*api: 9bundled: 1old: 4Apache: 2The: 1limitations: 1Foundation: 1...
3.4.2 Apex
$ cat counts*BEAM: 1have: 1simple: 1skip: 4PAssert: 1...
3.4.3 Flink-Local
$ ls counts*$ more counts*The: 1api: 9old: 4Apache: 2limitations: 1bundled: 1Foundation: 1...
3.4.4 Flink-Cluster
$ ls /tmp/counts*$ more /tmp/counts*The: 1api: 9old: 4Apache: 2limitations: 1bundled: 1Foundation: 1...
3.4.5 Spark
$ ls counts*$ more counts*beam: 27SF: 1fat: 1job: 1limitations: 1require: 1of: 11profile: 10...
3.4.6 Dataflow
$ gsutil ls gs://<your-gcs-bucket>/counts*$ gsutil cat gs://<your-gcs-bucket>/counts*feature: 15smother‘st: 1revelry: 1bashfulness: 1Bashful: 1Below: 2deserves: 32barrenly: 1...
4.總結

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

5.結束語

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉! 

Apache Beam 剖析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.