Apache Beam,批處理和流式處理的融合伸蚯!

1. 概述

在本教程中摩渺,我們將介紹 Apache Beam 并探討其基本概念。
我們將首先演示使用 Apache Beam 的用例和好處剂邮,然后介紹基本概念和術(shù)語摇幻。之后,我們將通過一個簡單的例子來說明 Apache Beam 的所有重要方面挥萌。

2. Apache Beam是個啥?

Apache Beam(Batch+strEAM)是一個用于批處理和流式數(shù)據(jù)處理作業(yè)的統(tǒng)一編程模型绰姻。它提供了一個軟件開發(fā)工具包,用于定義和構(gòu)建數(shù)據(jù)處理管道以及執(zhí)行這些管道的運行程序引瀑。

Apache Beam旨在提供一個可移植的編程層狂芋。事實上,Beam管道運行程序?qū)?shù)據(jù)處理管道轉(zhuǎn)換為與用戶選擇的后端兼容的API憨栽。目前帜矾,支持這些分布式處理后端有:

  • Apache Apex
  • Apache Flink
  • Apache Gearpump (incubating)
  • Apache Samza
  • Apache Spark
  • Google Cloud Dataflow
  • Hazelcast Jet

3. 為啥選擇 Apache Beam

Apache Beam 將批處理和流式數(shù)據(jù)處理融合在一起,而其他組件通常通過單獨的 API 來實現(xiàn)這一點屑柔。因此屡萤,很容易將流式處理更改為批處理,反之亦然掸宛,例如死陆,隨著需求的變化。

Apache Beam 提高了可移植性和靈活性唧瘾。我們關(guān)注的是邏輯措译,而不是底層的細節(jié)迫像。此外,我們可以隨時更改數(shù)據(jù)處理后端瞳遍。

Apache Beam 可以使用 Java闻妓、Python、Go和 Scala等SDK掠械。事實上由缆,團隊中的每個人都可以使用他們選擇的語言。

4. 基本概念

使用 Apache Beam猾蒂,我們可以構(gòu)建工作流圖(管道)并執(zhí)行它們均唉。編程模型中的關(guān)鍵概念是:

  • PCollection–表示可以是固定批處理或數(shù)據(jù)流的數(shù)據(jù)集

  • PTransform–一種數(shù)據(jù)處理操作,它接受一個或多個 PCollections 并輸出零個或多個 PCollections肚菠。

  • Pipeline–表示 PCollection 和 PTransform 的有向無環(huán)圖舔箭,因此封裝了整個數(shù)據(jù)處理作業(yè)。

  • PipelineRunner–在指定的分布式處理后端上執(zhí)行管道蚊逢。

簡單地說层扶,PipelineRunner 執(zhí)行一個管道,管道由 PCollection 和 PTransform 組成烙荷。

5. 字數(shù)統(tǒng)計示例

現(xiàn)在我們已經(jīng)學習了 Apache Beam 的基本概念镜会,讓我們設(shè)計并測試一個單詞計數(shù)任務(wù)。

5.1 建造梁式管道

設(shè)計工作流圖是每個 Apache Beam 作業(yè)的第一步终抽,單詞計數(shù)任務(wù)的步驟定義如下:
1.從原文中讀課文戳表。
2.把課文分成單詞表。
3.所有單詞都小寫昼伴。
4.刪去標點符號匾旭。
5.過濾停止語。
6.統(tǒng)計唯一單詞數(shù)量圃郊。
為了實現(xiàn)這一點价涝,我們需要使用 PCollectionPTransform 抽象將上述步驟轉(zhuǎn)換為 管道

5.2. 依賴

在實現(xiàn)工作流圖之前描沟,先添加 Apache Beam的依賴項 到我們的項目:

<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
    <version>${beam.version}</version>
</dependency>

Beam管道運行程序依賴于分布式處理后端來執(zhí)行任務(wù)飒泻。我們添加 DirectRunner 作為運行時依賴項:

<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-direct-java</artifactId>
    <version>${beam.version}</version>
    <scope>runtime</scope>
</dependency>

與其他管道運行程序不同鞭光,DirectRunner 不需要任何額外的設(shè)置吏廉,這對初學者來說是個不錯的選擇。

5.3. 實現(xiàn)

Apache Beam 使用 Map-Reduce 編程范式 ( 類似 Java Stream)惰许。講下面內(nèi)容之前席覆,最好 對 reduce(), filter(), count(), map(), 和 flatMap() 有個基礎(chǔ)概念和認識。

首先要做的事情就是 創(chuàng)建管道

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);

六步單詞計數(shù)任務(wù):

PCollection<KV<String, Long>> wordCount = p
    .apply("(1) Read all lines", 
      TextIO.read().from(inputFilePath))
    .apply("(2) Flatmap to a list of words", 
      FlatMapElements.into(TypeDescriptors.strings())
      .via(line -> Arrays.asList(line.split("\\s"))))
    .apply("(3) Lowercase all", 
      MapElements.into(TypeDescriptors.strings())
      .via(word -> word.toLowerCase()))
    .apply("(4) Trim punctuations", 
      MapElements.into(TypeDescriptors.strings())
      .via(word -> trim(word)))
    .apply("(5) Filter stopwords", 
      Filter.by(word -> !isStopWord(word)))
    .apply("(6) Count words", 
      Count.perElement());

apply() 的第一個(可選)參數(shù)是一個String汹买,它只是為了提高代碼的可讀性佩伤。下面是上述代碼中每個 apply() 的作用:

  1. 首先聊倔,我們使用 TextIO 逐行讀取輸入文本文件。
  2. 將每一行按空格分開生巡,把它映射到一個單詞表上耙蔑。
  3. 單詞計數(shù)不區(qū)分大小寫,所以我們將所有單詞都小寫孤荣。
  4. 之前甸陌,我們用空格分隔行,但是像“word盐股!“和”word钱豁?"這樣的,就需要刪除標點符號疯汁。
  5. 像“is”和“by”這樣的停止詞在幾乎每一篇英語文章中都很常見牲尺,所以我們將它們刪除。
  6. 最后幌蚊,我們使用內(nèi)置函數(shù) Count.perElement() 計算唯一單詞數(shù)量谤碳。

如前所述,管道是在分布式后端處理的溢豆。不可能在內(nèi)存中的PCollection上迭代估蹄,因為它分布在多個后端。相反沫换,我們將結(jié)果寫入外部數(shù)據(jù)庫或文件臭蚁。

首先,我們將PCollection轉(zhuǎn)換為String讯赏。然后垮兑,使用TextIO編寫輸出:

wordCount.apply(MapElements.into(TypeDescriptors.strings())
    .via(count -> count.getKey() + " --> " + count.getValue()))
    .apply(TextIO.write().to(outputFilePath));

現(xiàn)在管道 已經(jīng)定義好了,接下來做個簡單的測試漱挎。

5.4. 運行測試

到目前為止系枪,我們已為單詞計數(shù)任務(wù)定義了管道,現(xiàn)在運行管道

p.run().waitUntilFinish();

在這行代碼中磕谅,Apache Beam 將把我們的任務(wù)發(fā)送到多個 DirectRunner 實例私爷。因此,最后將生成幾個輸出文件膊夹。它們將包含以下內(nèi)容:

...
apache --> 3
beam --> 5
rocks --> 2
...

在 Apache Beam 中定義和運行分布式作業(yè)是如此地簡單衬浑。為了進行比較,單詞計數(shù)實現(xiàn)在 Apache Spark, Apache Flink 和 Hazelcast-Jet 上也有

6. 結(jié)語

在本教程中放刨,我們了解了 Apache Beam 是什么工秩,以及它為什么比其他選擇更受歡迎。我們還通過一個單詞計數(shù)示例演示了 Apache Beam 的基本概念。
如果你覺得文章還不錯助币,記得關(guān)注公眾號: 鍋外的大佬
鍋外的大佬博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浪听,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眉菱,更是在濱河造成了極大的恐慌迹栓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俭缓,死亡現(xiàn)場離奇詭異迈螟,居然都是意外死亡,警方通過查閱死者的電腦和手機尔崔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門答毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人季春,你說我怎么就攤上這事洗搂。” “怎么了载弄?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵耘拇,是天一觀的道長。 經(jīng)常有香客問我宇攻,道長惫叛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任逞刷,我火速辦了婚禮嘉涌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夸浅。我一直安慰自己仑最,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布帆喇。 她就那樣靜靜地躺著警医,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坯钦。 梳的紋絲不亂的頭發(fā)上预皇,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音婉刀,去河邊找鬼吟温。 笑死,一個胖子當著我的面吹牛路星,可吹牛的內(nèi)容都是我干的溯街。 我是一名探鬼主播诱桂,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼洋丐,長吁一口氣:“原來是場噩夢啊……” “哼呈昔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起友绝,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤堤尾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迁客,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郭宝,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年掷漱,在試婚紗的時候發(fā)現(xiàn)自己被綠了粘室。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卜范,死狀恐怖衔统,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情海雪,我是刑警寧澤锦爵,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奥裸,受9級特大地震影響险掀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湾宙,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一樟氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侠鳄,春花似錦嗡害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至知押,卻和暖如春叹螟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背台盯。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工罢绽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人静盅。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓良价,卻偏偏與公主長得像寝殴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子明垢,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容