此頁介紹啊Samza的一些高層級概念。
Streams
Samza處理Streams(流)。流由同一型別的不可變的訊息組成。例如,一個流可以是對一個網站的所有點選,或者對一個資料庫表的所有更新,或者一個服務產生的所有日誌,或者其它型別的訊息資料。訊息可以被追加到一個流上或者從一個流讀出來。一個流可以有任意數量的消費者,並且從一個流讀訊息並不會把訊息從其中刪除(所有每息都可以有效地廣播到其它消費者)。訊息可以有選擇地擁有一個相關連的key用做分割槽partitioning,分割槽的問題接下來會提到。
Samza支援實現了流這種抽象的pluggable系統:對Kafka,一個流就是一個topic,對於資料庫,我們可以消費對一個資料表的更新從而得到一個流,對Hadoop我們可以tail HDFS中的一個目錄下的檔案。
Jobs
一個Samza job是一些程式碼,它們用來對一些輸入流做邏輯轉換,然後把輸出的訊息追加到一些輸出流裡。
如果我們不關心可擴充套件性,我們就只需要streams和jobs。但是,為了擴充套件流處理器stream processor的吞吐量,我們把streams和jobs切成更小的並行工作的單元:partitions和tasks.
Partitions
每個流被分成一個或更多分割槽。流中的每個分割槽都是一個有序的訊息序列。
序列中的每條訊息都有一個叫做offset的標識,offset在每個partition中是唯一的。offset可以是連續的整數,位元組偏移量,或者依賴於底層系統的字串。
當一個訊息被附加到一個流上,它被附加到這個流的一個分割槽裡。從訊息到分割槽的分配由訊息生成者提供的一個key來完成。例如,如果使用者ID被用來做key,那麼就可以使得一個使用者相關的所有訊息都被送到同一個分割槽裡。
Tasks
一個job通過分成多個task來擴充套件。task是job並行執行的單元,就像partition是stream的並行單元。每個task消費這個job的一系列輸入流中每一個流的一個分割槽。
一個task從它的每一個輸入分割槽中順序處理訊息,按照message的offset的順序。在partition之間沒有確定的順序。這使得每個task可以獨立操作。YARN排程器把每個task分配到機器,所以每個job做為一個整體被分佈到多臺機器上。
job裡邊task的數量由輸入的parition的數量決定(不能有比輸入的partition更多的task, 否則會有一些task沒有輸入)。你可以調整分配給一個job的計算資源(記憶體大小 、 CPU的核數,等)來滿足job的需要。詳見下邊對container的描述。
task和partition之間的分配永遠不會改變:如果某個機器上的task失敗了,這個task會在別的地方重啟,它還會繼續消費同樣的流的分割槽。
Dataflow Graphs
我們可以把多個job組在一起來建立一個dataflow graph。這個資料流圖中,節點是包含了資料的stream,邊是進行轉換的jobs。這種組合完全通過job的輸入輸出流來實現。這些job的其它方面是完全解耦合的:它們不需要由同樣的程式碼基礎實現,並且對下游job的增加、移除、重啟都不會影響上游的job。
這些graph通常都是無環的——資料通常不是從一個job出來,經過其它的job,回到它自己。但是,如果你需要,也可以建立有環圖。
Containers
partition和task都是並行的邏輯單元,它們並不和任何對計算資源(CPU、記憶體、磁碟空間等)的特定分配有關。Container是物理並行的單元,一個container本質上是一個Unix程式(或Linux cgroup)。每個container執行一個或多個tasks。task的數目由輸入的partition 的數目自動決定,並且是固定的。但是container的數量(以及與其相關聯的CPU和儲存資源)由使用者在執行時指定的,並且任何時候都可以改變。
下一節 Architecture