storm(中級一) 的Serialization(序列化)

序列化

序列化 本文闡述了 Storm 0.6.0 以上版本的序列化機(jī)制。在低于 0.6.0 版本的 Storm 中使用了另一種序列化系統(tǒng),詳細(xì)信息可以參考 Serialization (prior to 0.6.0) 一文

Storm 中的 tuple 可以包含任何類型的對象。由于 Storm 是一個分布式系統(tǒng),所以在不同的任務(wù)之間傳遞消息時(shí) Storm 必須知道怎樣序列化、反序列化消息對象。

Storm 使用 Kryo 對對象進(jìn)行序列化。Kryo 是一個靈活、快速的序列化庫。

Storm 默認(rèn)支持基礎(chǔ)類型、string、byte arrays、ArrayList、HashMap、HashSet 以及 Clojure 的集合類型的序列化。如果你需要在 tuple 中使用其他的對象類型,你就需要注冊一個自定義的序列化器。

Dynamic typing(動態(tài)類型)

在 tuple 中沒有對各個字段(field)的直接類型聲明。你需要將對象放入對應(yīng)的字段中,然后 Storm 可以動態(tài)地實(shí)現(xiàn)對象的序列化。在學(xué)習(xí)序列化接口之前,我們先來了解一下為什么 Storm 的 tuple 是動態(tài)類型化的。

為 tuple fields 增加靜態(tài)類型會大幅增加 Storm 的 API 的復(fù)雜度。比如 Hadoop 就將它的 key 和 value 都靜態(tài)化了,這就要求用戶自己添加大量的注解。使用 Hadoop 的 API 非常繁瑣,而相應(yīng)的“類型安全”不值得。相對的,動態(tài)類型就非常易于使用。

進(jìn)一步說,也不可能有什么合理的方法將 Storm 的 tuple 的類型靜態(tài)化。假如一個 Bolt 訂閱了多個 stream,從這些 stream 傳入的 tuple 很可能都帶有不同的類型。在 Bolt 的 execute 方法接收到一個 tuple 的時(shí)候,這個 tuple 可能來自任何一個 stream,也可能包含各種組合類型。也許你可以使用某種反射機(jī)制來為 bolt 訂閱的每個 tuple stream 聲明一個方法類處理 tuple,但是 Storm 可以提供一種更簡單、更直接的動態(tài)類型機(jī)制來解決這個問題。

最后,Storm 使用動態(tài)類型定義的另一個原因就是為了用簡潔直觀的方式使用 Clojure、JRuby 這樣的動態(tài)類型語言。

Custom serialization(自定義序列化)

前面已經(jīng)提到,Storm 使用 Kryo 來處理序列化。如果要實(shí)現(xiàn)自定義的序列化生成器,你需要用Kryo注冊一個新的序列化生成器。強(qiáng)烈建議讀者先仔細(xì)閱讀 Kryo's home page 來理解它是怎樣處理自定義的序列化的。

可以通過topology的 topology.kryo.register 屬性來添加自定義序列化生成器。該屬性接收一個注冊器列表,每個注冊項(xiàng)都可以使用以下兩種注冊格式中的一種格式: 1.只有一個待注冊的類的名稱。在這種情況下,Storm 會使用 Kryo 的 FieldsSerializer 來序列化該類。這也許并不一定是該類的最優(yōu)化方式 —— 可以查看 Kryo 的文檔來了解更多細(xì)節(jié)內(nèi)容。 2. 一個包含待注冊的類的名稱和實(shí)現(xiàn)了 com.esotericsoftware.kryo.Serializer接口的類組成的集合。 我們來看個例子.

topology.kryo.register:

? - com.mycompany.CustomType1

? - com.mycompany.CustomType2: com.mycompany.serializer.CustomType2Serializer

? - com.mycompany.CustomType3

com.mycompany.CustomType1 和 com.mycompany.CustomType3 會使用 FieldsSerializer,而com.mycompany.CustomType2則會使用 com.mycompany.serializer.CustomType2Serializer來實(shí)現(xiàn)序列化。

Storm provides helpers for registering serializers in a topology config. The Config class has a method called registerSerialization that takes in a registration to add to the config. 在topology的配置中,Storm 提供了用于注冊序列化生成器的幫助類。Config 類有一個 registerSerialization 方法可以將序列化生成器注冊到配置中。

Config 中有一個更高級的配置項(xiàng)做 Config.TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS。如果你將該項(xiàng)設(shè)置為 true,Storm 會忽略掉所有已注冊但是在topology的類路徑上沒有相應(yīng)的代碼的序列化器。否則,Storm 會在無法查找到序列化器的時(shí)候拋出錯誤。如果你在集群中運(yùn)行有多個topology并且每個topology都有不同的序列化器,但是你又想要在storm.yaml中聲明好所有的序列化器,在這種情況下這個配置項(xiàng)會有很大的幫助。

Java serialization(java 序列化)

如果 Storm 發(fā)現(xiàn)了一個沒有注冊序列化器的類型,它會使用 Java 序列化器來代替,如果這個對象無法被 Java 序列化器序列化,Storm 就會拋出異常。

注意,Java 自身的序列化機(jī)制非常耗費(fèi)資源,而且不管在 CPU 的性能上還是在序列化對象的大小上都沒有優(yōu)勢。強(qiáng)烈建議讀者在生產(chǎn)環(huán)境中運(yùn)行topology 的時(shí)候注冊一個自定義的序列化器。保留 Java 的序列化機(jī)制主要為了便于設(shè)計(jì)新topology 的原型。

你可以通過將 Config.TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION 配置為 false 的方式來將序列化器回退到 Java 的序列化機(jī)制。

Component-specific serialization registrations(特定組件的序列化注冊)

Storm 0.7.0 支持對特定組件的配置(詳情請參閱Storm配置一文)。當(dāng)然,如果某個組件定義了一個序列化器,這個序列化器也需要能夠支持其他的 bolt —— 否則,后續(xù)的 bolt 將會無法接收來自該組件的消息!

在提交topology 的時(shí)候,topology 會選擇一組序列化器用于在所有的組件間傳遞消息。這是通過將特定組件的序列化器注冊信息與普通的序列化器信息融合在一起實(shí)現(xiàn)的。如果兩個組件為同一個類定義了兩個序列化器,Storm 會從中任意選擇一個。

如果在兩個組件的序列化器注冊信息沖突的時(shí)候需要強(qiáng)制使用一個序列化器,可以在topology 級的配置中定義你想要的序列化器。對于序列化器的注冊信息,拓?fù)渲信渲玫闹凳莾?yōu)先于具體組件的配置的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 序 本文主要研究一下storm tuple的序列化 ExecutorTransfer.tryTransfer st...
    go4it閱讀 930評論 0 0
  • 原文鏈接Storm Tutorial 本人原創(chuàng)翻譯,轉(zhuǎn)載請注明出處 這個教程內(nèi)容包含如何創(chuàng)建topologies及...
    quiterr閱讀 1,630評論 0 6
  • Date: Nov 17-24, 2017 1. 目的 積累Storm為主的流式大數(shù)據(jù)處理平臺對實(shí)時(shí)數(shù)據(jù)處理的相關(guān)...
    一只很努力爬樹的貓閱讀 2,190評論 0 4
  • 第一部分:外在形象塑造 1、發(fā)型 和女生一樣,男生的發(fā)型對外在形象的塑造也至關(guān)重要。 這里的發(fā)型不是指一定要到多么...
    飛舞的野草閱讀 2,002評論 0 1
  • 晚飯之后出去兜風(fēng),發(fā)現(xiàn)正大路上的莫妮卡蛋糕總店重新翻修了,風(fēng)格很半工業(yè),招牌Logo和內(nèi)飾都和火車站對面的第一時(shí)間...
    是九弟媽咪啊閱讀 424評論 4 4