Samza 結構

2018-09-20 15:58 更新

Samza 由三層組成:

  1. 流媒體層。
  2. 一個執(zhí)行層。
  3. 處理層。

Samza 為所有三層提供了即時支持。

  1. 流媒體: Kafka
  2. 執(zhí)行: YARN
  3. 處理: Samza API

這三個組合在一起形成Samza:

samza-ecosystem

該架構遵循與 Hadoop 類似的模式(它也使用 YARN 作為執(zhí)行層,用于存儲的 HDFS 和 MapReduce 作為處理 API):

samza-hadoop

在深入分析這三個層次之前,應該注意的是,Samza 的支持不僅限于 Kafka 和 YARN。Samza 的執(zhí)行和流式傳輸層都是可插拔的,并允許開發(fā)人員如果愿意實施替代方案。

Kafka

Kafka 是一個分布式的 pub / sub 和消息隊列系統(tǒng),它提供至少一次消息傳遞保證(即系統(tǒng)保證沒有消息丟失,但在某些故障情況下,消費者可能會多次收到相同的消息),并且高度可用的分區(qū)(即,即使機器掉電,流的分區(qū)仍然可用)。

在 Kafka ,每個流被稱為主題。每個主題都被分割并復制到多臺名為broker(代理)的計算機上。當producer(生產者)向主題發(fā)送消息時,它提供一個密鑰,用于確定消息應發(fā)送到哪個分區(qū)。Kafka代理收到并存儲生產者發(fā)送的消息。然后,Kafka用戶可以通過訂閱主題的所有分區(qū)上的消息來讀取主題。

卡夫卡有一些有趣的屬性:

  • 具有相同密鑰的所有消息都保證位于相同的主題分區(qū)中。這意味著如果您想要讀取特定用戶標識的所有消息,則只需要從包含用戶標識的分區(qū)讀取消息,而不是整個主題(假設用戶ID被用作密鑰)。
  • 主題分區(qū)是到達順序的消息序列,因此您可以使用單調增加的偏移量(如數組中的索引)來引用分區(qū)中的任何消息。這意味著代理不需要跟蹤特定用戶看到哪些消息 - 用戶可以通過存儲其已經處理的最后一個消息的偏移來跟蹤自身。然后知道每個具有比當前偏移量偏移較小的消息已經被處理; 每個具有較高偏移量的消息尚未被處理。

YARN

YARN(另一個資源談判者)是 Hadoop 的下一代群集調度程序。它允許您在一組機器中分配一些容器(進程),并對它們執(zhí)行任意命令。

當應用程序與 YARN 進行交互時,它看起來像這樣:

  1. 應用程序:我想在具有512MB內存的兩臺機器上運行命令 X.
  2. YARN:很酷,你的代碼在哪里?
  3. 應用程序:http://path.to.host/jobs/download/my.tgz
  4. YARN:我在node-1.grid和node-2.grid上運行你的工作。

Samza 使用 YARN 來管理部署,容錯,日志記錄,資源隔離,安全性和局部性。

YARN建筑

YARN 有三個重要的部分:ResourceManager,NodeManager和ApplicationMaster。在YARN網格中,每臺機器都運行一個NodeManager,它負責在該機器上啟動進程。ResourceManager 與所有 NodeManager 通信,告訴他們要運行什么。如果應用程序希望在群集上運行某些內容,則可以與 ResourceManager 通信。第三部分,ApplicationMaster 實際上是在 YARN 集群中運行的特定于應用程序的代碼。它負責管理應用程序的工作負載,請求容器(通常為 UNIX 進程),以及在其中一個容器發(fā)生故障時處理通知。

Samza 和 YARN

Samza 提供了一個YARN ApplicationMaster 和一個 YARN 作業(yè)運行器開箱即用。Samza 和 YARN 的集成在下圖中概述(不同的顏色表示不同的主機):


當 Samza 的客戶想要開始一個新的 Samza 工作時,Samza 客戶會與 YARN RM 談話。YARN RM 與 YARN NM 談話,為 Samza 的 ApplicationMaster 在群集上分配空間。一旦 NM 分配空間,它將啟動 Samza AM。在 Samza AM 啟動之后,它向 YARN RM 詢問一個或多個 YARN 容器運行SamzaContainers。再次,RM 與 NM 一起為容器分配空間。一旦分配空間,NM 將啟動 Samza 容器。

Samza

Samza 使用 YARN 和 Kafka 為逐級流處理和分區(qū)提供了一個框架。一切,放在一起,看起來像這樣(不同的顏色表示不同的主機):


Samza 客戶端使用 YARN 運行 Samza 工作:YARN 啟動并監(jiān)督一個或多個SamzaContainers,您的處理代碼(使用StreamTask API)在這些容器內運行。Samza StreamTasks 的輸入和輸出來自 Kafka 代理(通常)位于與 YARN NMs 相同的計算機上。

讓我們來看一個真實的例子:假設我們要計算頁面瀏覽量。在 SQL 中,你會寫下如下:

SELECT user_id, COUNT(*) FROM PageViewEvent GROUP BY user_id

雖然 Samza 現在不支持 SQL,但這個想法是一樣的。計算此查詢需要兩個作業(yè):一個用戶 ID 分組消息,另一個進行計數。

在第一個作業(yè)中,通過將具有相同用戶 ID 的所有消息發(fā)送到中間主題的相同分區(qū)來完成分組。您可以通過使用用戶 ID 作為第一個作業(yè)發(fā)出的消息的關鍵字來執(zhí)行此操作,并將此密鑰映射到中間主題的一個分區(qū)(通常通過使用鍵的散列值 mod 分區(qū)數)。第二個工作消耗中間話題。第二個任務中的每個任務都占用中間主題的一個分區(qū),即用戶 ID 子集的所有消息。該任務對其分區(qū)中的每個用戶 ID 具有計數器,并且每當任務接收到具有特定用戶 ID 的消息時,相應的計數器遞增。


如果您熟悉 Hadoop,您可以將其識別為 Map / Reduce 操作,其中每個記錄與映射器中的特定鍵相關聯,具有相同鍵的記錄由框架組合在一起,然后在減少步驟中計數。Hadoop 和 Samza之間的區(qū)別在于 Hadoop 在固定輸入上運行,而 Samza 則使用無限流數據。

Kafka 接收第一個作業(yè)發(fā)出的消息并將其緩沖在磁盤上,分布在多臺計算機上。這有助于使系統(tǒng)容錯:如果一臺計算機發(fā)生故障,則不會丟失任何消息,因為它們已被復制到其他計算機。而且如果第二個工作出現任何原因緩慢或停止使用消息,則第一個工作不受影響:磁盤緩沖區(qū)可以吸收第一個工作中積壓的消息,直到第二個工作重新啟動。

通過分割主題,通過將流處理分解為在多臺計算機上運行的作業(yè)和并行任務,Samza 可以以非常高的消息吞吐量擴展到流。通過使用 YARN 和 Kafka,Samza 可以實現容錯:如果進程或計算機出現故障,則會在另一臺計算機上自動重新啟動,并從停止點繼續(xù)處理消息。

比較介紹?

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號