天天看點

《Storm分布式實時計算模式》——3.6 Trident狀态

本節書摘來自華章計算機《storm分布式實時計算模式》一書中的第3章,第3.6節,作者:(美)p. taylor goetz brian o’neill 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

我們現在已經給每個aggregator的分組資料進行了計數,現在想将資訊進行持久化存儲,以便進一步分析。在trident中,持久化操作從狀态管理開始。trident對狀态有底層的操作原語,但不同于storm api,它不關心要哪些資料會作為狀态存儲或者如何存儲這些狀态。trident在高層提供了下述的狀态接口:

《Storm分布式實時計算模式》——3.6 Trident狀态

上面提到了,trident将tuple分組成一批批資料。每批資料都有自己的事務辨別符。在前面的接口中,trident告訴state對象什麼時候開始送出狀态,什麼時候送出狀态應該結束。

和function類似,stream對象也有方法向topology引入基于狀态的操作。更具體說,trident有兩種資料流:stream和groupedstream。一個groupedstream是groupby操作的結果。在我們的topology中,我們根據hourassignment function生成的key對tuple進行分組。

在steam對象中,下列方法允許topology讀和寫狀态資訊:

《Storm分布式實時計算模式》——3.6 Trident狀态

https://yqfile.alicdn.com/99bdf19045f0caf67fe3e82f5bd65321f335ea6b.png

" >

statequery()方法從state生成了一個輸入流,不同參數的幾個partitionpersist()方法允許topology從資料流中的tuple更新狀态資訊。partitionpersist()方法的操作對象是每個資料分片。

在stream對象的方法外,groupedstream對象允許topology對一批tuple進行聚合統計,并且将收集到的資訊持久化在state中。下列代碼是groupedsteam類中和狀态相關的方法:

《Storm分布式實時計算模式》——3.6 Trident狀态

https://yqfile.alicdn.com/d8e0e8122e7319f4d4cfd645b58d8827706f2fa3.png

《Storm分布式實時計算模式》——3.6 Trident狀态

https://yqfile.alicdn.com/add6a5886c57a6801e018a41a8cefbf9f1baca16.png

和steam對象類似,statequery()方法從state生成一個輸入資料流。不同參數的幾個persistaggregate()方法允許topology從資料流中的tuple更新狀态資訊。注意groupedstream方法有一個aggregator參數,它在資訊寫入state對象之前執行。

現在考慮将這些function應用到我們的例子中來。在我們的系統中,需要将事件發生的城市、疾病代碼、每小時内産生疾病統計量進行持久存儲。這樣可以生成報表如表3-2所示。

《Storm分布式實時計算模式》——3.6 Trident狀态

https://yqfile.alicdn.com/7f7d4bd921bc1b3526f7cb62a8aac1cf54344a70.png

為了實作這個功能,我們需要将聚集操作中生成的統計量進行持久化存儲。我們可以使用groupby函數傳回的groupedstream接口(如前面所示)調用persistaggregate方法。下面代碼是示例topology中具體的調用方式:

《Storm分布式實時計算模式》——3.6 Trident狀态

要了解持久化存儲,我們首先來看這個方法的第一個參數。trident使用一個工廠類來生成state的執行個體。outbreaktrendfactory是我們的topology提供給storm的工廠類。outbreaktrendfactory代碼如下:

《Storm分布式實時計算模式》——3.6 Trident狀态

工廠類傳回一個state對象,storm用它來持久化存儲資訊。在storm中,有三種類型的狀态。每個類型的描述如表3-3所示。

《Storm分布式實時計算模式》——3.6 Trident狀态

在分布式環境下,資料可能被重放,為了支援計數和狀态更新,trident将狀态更新操作進行序列化,使用不同的狀态更新模式對重放和錯誤資料進行容錯。接下來會介紹這些模式。

3.6.1 重複事務型狀态

在重複事務型狀态中,最後一批送出的資料的辨別符存在資料中。當且僅當一批資料辨別符的序号大于目前辨別符時,才進行更新操作。如果小于或者等于目前辨別符,将會忽略更新操作。

為了示範這個實作方法,考慮如表3-4所示的資料批次的序列,這些記錄對我們例子中的資料按照key進行聚合計數。

《Storm分布式實時計算模式》——3.6 Trident狀态

這些批次資料按照下列将順序處理完成:

處理結果将按照表3-5中的狀态變更操作,中間的一列資料用來存儲資料辨別符,記錄最近一次合并進狀态的資料批次編号。

《Storm分布式實時計算模式》——3.6 Trident狀态