Samza 結(jié)構(gòu)

2018-09-20 15:58 更新

Samza 由三層組成:

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

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

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

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

samza-ecosystem

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

samza-hadoop

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

Kafka

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

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

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

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

YARN

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

當(dāng)應(yīng)用程序與 YARN 進(jìn)行交互時,它看起來像這樣:

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

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

YARN建筑

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

Samza 和 YARN

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


當(dāng) 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ū)提供了一個框架。一切,放在一起,看起來像這樣(不同的顏色表示不同的主機(jī)):


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

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

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

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

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


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

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

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

比較介紹?

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號