天天看點

《Storm分布式實時計算模式》——1.5 了解資料流分組

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

看了前面的例子,你會納悶為什麼沒有增加reportbolt的并發度。答案是,這樣做沒有任何意義。為了了解其中的原因,需要了解storm中資料流分組的概念。

資料流分組定義了一個資料流中的tuple如何分發給topology中不同bolt的task。舉例說明,在并發版本的單詞計數topology中,splitsentencebolt類指派了四個task。資料流分組決定了指定的一個tuple會分發到哪個task上。

storm定義了七種内置資料流分組的方式:

shuffle grouping(随機分組):這種方式會随機分發tuple給bolt的各個task,每個bolt執行個體接收到的相同數量的tuple。

fields grouping(按字段分組):根據指定字段的值進行分組。比如說,一個資料流根據“word”字段進行分組,所有具有相同“word”字段值的tuple會路由到同一個bolt的task中。

all grouping(全複制分組):将所有的tuple複制後分發給所有bolt task。每個訂閱資料流的task都會接收到tuple的拷貝。

globle grouping(全局分組):這種分組方式将所有的tuples路由到唯一一個task上。storm按照最小的task id來選取接收資料的task。注意,當使用全局分組方式時,設定bolt的task并發度是沒有意義的,因為所有tuple都轉發到同一個task上了。使用全局分組的時候需要注意,因為所有的tuple都轉發到一個jvm執行個體上,可能會引起storm叢集中某個jvm或者伺服器出現性能瓶頸或崩潰。

none grouping(不分組):在功能上和随機分組相同,是為将來預留的。

direct grouping(指向型分組):資料源會調用emitdirect()方法來判斷一個tuple應該由哪個storm元件來接收。隻能在聲明了是指向型的資料流上使用。

local or shuffle grouping(本地或随機分組):和随機分組類似,但是,會将tuple分發給同一個worker内的bolt task(如果worker内有接收資料的bolt task)。其他情況下,采用随機分組的方式。取決于topology的并發度,本地或随機分組可以減少網絡傳輸,進而提高topology性能。

除了預定義好的分組方式之外,還可以通過實作customstreamgrouping(自定義分組)接口來自定義分組方式:

《Storm分布式實時計算模式》——1.5 了解資料流分組

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

" >

prepare()方法在運作時調用,用來初始化分組資訊,分組的具體實作會使用這些資訊決定如何向接收task分發tuple。workertopologycontext對象提供了topology的上下文資訊,globalstreamid提供了待分組資料流的屬性。最有用的參數是targettasks,是分組所有待選task的辨別符清單。通常,會将targettasks的引用存在變量裡作為choosetasks()的參數。

choosetasks()方法傳回一個tuple發送目标task的辨別符清單。它的兩個參數是發送tuple的元件的id和tuple的值。

為了說明資料流分組的重要性,我們在topology中引入一個bug。首先,修改sentencespout的nexttuple()方法,使每個句子隻發送一次:

《Storm分布式實時計算模式》——1.5 了解資料流分組

程式的輸出是這樣的:

《Storm分布式實時計算模式》——1.5 了解資料流分組

https://yqfile.alicdn.com/20abac2e6b8ea5fa2dc3f129f5f13ad3b09ef5ee.png

《Storm分布式實時計算模式》——1.5 了解資料流分組

然後将countbolt中按字段分組方式修改為随機分組方式:

《Storm分布式實時計算模式》——1.5 了解資料流分組

運作程式的結果是這樣的:

《Storm分布式實時計算模式》——1.5 了解資料流分組

https://yqfile.alicdn.com/4a768e6f173acb4230fd61b9f0b90d0317760b24.png

結果是錯誤的,因為countbolt的參數是和狀态相關的:它會對收到的每個單詞進行計數。這個例子中,在并發狀況下,計算的準确度取決于是否按照tuple的内容進行适當的分組。我們引入的bug隻會在countbolt并發執行個體超過一個時出現。這也是我們為什麼一再強調,要在不同的并發度配置下測試topology。

通常,需要避免将資訊存在bolt中,因為bolt執行異常或者重新指派時,資料會丢失。一種解決方法是定期對存儲的資訊快照并放在持久性存儲中,比如資料庫。這樣,如果task被重新指派就可以恢複資料。