Samza概念

2018-08-23 09:32 更新

本頁介紹了 Samza 的高級概念。

 Samza 處理流。流由相似類型或類別的不可變消息組成。例如,流可以是網(wǎng)站上的所有點擊,或特定數(shù)據(jù)庫表的所有更新,或服務生成的所有日志,或任何其他類型的事件數(shù)據(jù)。消息可以附加到流或從流中讀取。流可以具有任何數(shù)量的消費者,并且從流讀取不會刪除消息(因此每個消息被有效地廣播給所有消費者)。消息可以可選地具有用于分區(qū)的關聯(lián)密鑰,我們將在一秒鐘內(nèi)討論。

Samza 支持實現(xiàn)流抽象的可插拔系統(tǒng):在 Kafka 中,一個流是一個主題,在數(shù)據(jù)庫中,我們可以通過在 Hadoop 中消耗更新來讀取流,我們可能會拖放 HDFS 中的文件目錄。

job

工作

Samza 作業(yè)是對一組輸入流執(zhí)行邏輯變換以將輸出消息附加到輸出流集合的代碼。

如果可擴展性不是一個問題,流和工作就是我們所需要的。然而,為了縮小流處理器的吞吐量,我們將流和作業(yè)分解成更小的并行單元:分區(qū)和任務。

分區(qū)

每個流被分解成一個或多個分區(qū)。流中的每個分區(qū)是完全有序的消息序列。

該序列中的每個消息都有一個稱為偏移量的標識符,每個分區(qū)是唯一的。取決于底層的系統(tǒng)實現(xiàn),偏移量可以是順序整數(shù),字節(jié)偏移量或字符串。

當一條消息附加到流中時,它只會附加到流的一個分區(qū)。消息分配到其分區(qū)是由寫入器選擇的一個關鍵字來完成的。例如,如果使用用戶ID作為密鑰,則可確保與特定用戶相關的所有消息都在同一分區(qū)中。

stream

任務

通過將作業(yè)分解成多個任務來縮放作業(yè)。該任務是任務并行的單位,就像分區(qū)到流。每個任務從每個作業(yè)的輸入流的一個分區(qū)中消耗數(shù)據(jù)。

一個任務按照消息偏移的順序來順序處理每個輸入分區(qū)的消息。分區(qū)之間沒有定義的排序。這允許每個任務獨立運行。YARN 調(diào)度程序?qū)⒚總€任務分配給一臺機器,因此整個作業(yè)可以分布在許多機器上。

作業(yè)中的任務數(shù)量由輸入分區(qū)的數(shù)量決定(不能比輸入分區(qū)更多的任務,或沒有輸入的任務)。但是,您可以更改分配給作業(yè)的計算資源(內(nèi)存量,CPU內(nèi)核數(shù)量等)以滿足作業(yè)的需要。請參見下面的容器說明。

分區(qū)到任務的分配永遠不會改變:如果任務在失敗的計算機上,則任務在別處重新啟動,仍然占用相同的流分區(qū)。

dag

數(shù)據(jù)流圖

我們可以組合多個作業(yè)來創(chuàng)建數(shù)據(jù)流圖,其中邊是包含數(shù)據(jù)的流,并且節(jié)點是執(zhí)行轉(zhuǎn)換的作業(yè)。這個組合完全是通過作業(yè)作為輸入和輸出的流完成的。作業(yè)完全解耦:它們不需要在相同的代碼庫中實現(xiàn),并且添加,刪除或重新啟動下游作業(yè)不會影響上游作業(yè)。

這些圖表通常是非循環(huán)的,也就是說,數(shù)據(jù)通常不會通過其他作業(yè)流向自己。但是,如果需要,可以創(chuàng)建循環(huán)圖。


集裝箱

分區(qū)和任務都是并行性的邏輯單元,它們不對應于計算資源(CPU,內(nèi)存,磁盤空間等)的任何特定分配。容器是物理并行的單元,容器本質(zhì)上是 Unix 進程(或 Linux cgroup)。每個容器運行一個或多個任務。任務數(shù)量根據(jù)輸入中的分區(qū)數(shù)量自動確定,并被固定,但容器數(shù)量(以及與它們相關聯(lián)的 CPU 和內(nèi)存資源)數(shù)量由用戶在運行時指定,并且可以隨時更改。

結構 ?

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號