Storm 序列化
本文翻譯至Storm官方Wiki, 歡迎轉載,轉載請注明出處: 初次翻譯,英文好的同學,可以查看英文文檔: https://github.com/nathanmarz/storm/wiki/Serialization
本文是介紹關于Storm 0.6.0及以上版本的序列化系統,Storm 在之前版本使用了另外一套序列化系統。
Tuple可以包含任何類型的對象。由于Storm是一個分布式系統,它需要知道任務之間傳遞對象時,怎樣序列化和反序列化對象。
Storm使用Kryo來進行序列化。 Kryo是一個靈活和快速的的序列化庫,序列化對象較小。默認情況下,Storm可以序列化的原始類型,字符串,字節數組的 ArrayList,HashMap,HashSet和Clojure的集合類型。如果你想在你的元組使用另一種類型,你需要注冊一個自定義序列化。
動態類型
Tuple中的字段沒有進行類型聲明。你把對象放到Fields里,Storm
動態類型
Tuple中的字段沒有進行類型聲明。你把對象放到Fields里,Storm
動態序列化對象。
在我們獲得序列化接口之前,讓我們花點時間理解Storm 的Tuple 為什么是動態類型。
在我們獲得序列化接口之前,讓我們花點時間理解Storm 的Tuple 為什么是動態類型。
添加靜態類型的到Tuple 的Fileds,將會給Storm的API增加大量的復雜性。例如,Hadoop,靜態類型的鍵和值,在用戶使用時,需要的很多注釋。 Hadoop的API使用起來比較麻煩,“類型安全”是不值得的。動態類型是簡單容易使用。
很難用一種合理的靜態方式來統計Storm的Tuples。假設一個Bolt訂閱了多個流,這些流的Tuple可能在Fields上有不同的類型,當一個Bolt在執行階段接受Tuple,這些Tuple可能來自于任何流,還有可能使任何類型的組合。可能有一些反射魔法,你可以為每一個被Bolt
最后,使用動態類型的另一個原因是Storm可以以一種簡單直接的方式來使用類似于Clojure和JRuby的動態類型語言
自定義序列化
如前所述,Storm使用Kryo
添加自定義的序列化是在Topology的配置屬性“topology.kryo.register”完成的。它需要一個注冊的清單,其中每個登記可以采取以下兩種形式之一:
1、 需要注冊登記的類的名稱。在這種情況下,Storm將使用Kryo的FieldsSerializer來序列化類。這可能是最佳的類,也可能不是 - 更多細節見Kryo文檔。
2、 映射下類的名字來注冊登記com.esotericsoftware.kryo.Serializer實施。
讓我們來看看一個例子。
很難用一種合理的靜態方式來統計Storm的Tuples。假設一個Bolt訂閱了多個流,這些流的Tuple可能在Fields上有不同的類型,當一個Bolt在執行階段接受Tuple,這些Tuple可能來自于任何流,還有可能使任何類型的組合。可能有一些反射魔法,你可以為每一個被Bolt
訂閱的Tuple流定義不同的方法,但是
,但簡單,直接的方法是動態類型。最后,使用動態類型的另一個原因是Storm可以以一種簡單直接的方式來使用類似于Clojure和JRuby的動態類型語言
自定義序列化
如前所述,Storm使用Kryo
來進行序列化
。要實現自定義的序列化,您需要注冊新的序列化與Kryo。強烈建議您通過Kryo的主頁閱讀理解它是如何處理自定義序列。添加自定義的序列化是在Topology的配置屬性“topology.kryo.register”完成的。它需要一個注冊的清單,其中每個登記可以采取以下兩種形式之一:
1、 需要注冊登記的類的名稱。在這種情況下,Storm將使用Kryo的FieldsSerializer來序列化類。這可能是最佳的類,也可能不是 - 更多細節見Kryo文檔。
2、 映射下類的名字來注冊登記com.esotericsoftware.kryo.Serializer實施。
讓我們來看看一個例子。
topology.kryo.register:
- com.mycompany.CustomType1
- com.mycompany.CustomType2: com.mycompany.serializer.CustomType2Serializer
- com.mycompany.CustomType3com.mycompany.CustomType1
和com.mycompany.CustomType3
使用FieldsSerializer
來進行序列化com.mycompany.CustomType2
使用com.mycompany.serializer.CustomType2Serializer
來進行序列化的幫助。配置類有一個名為registerSerialization一個方法,在注冊時添加到配置里注冊序列化器的
有更高階的配置稱為Config.TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS。如果設置為true,Storm將忽略任何已注冊的,但在classpath中可用的序列化。否則,Storm會引發錯誤時,它無法找到一個序列化。如果你運行多個群集上,每個人都有不同的序列化的拓撲結構,這是有用的。沒有自己的代碼
但要聲明所有在storm.yaml文件拓撲中所有的序列化。Java序列化
Storm如果遇到一個類型,它沒有一個序列化注冊,它有可能使用Java序列化。如果對象不能被Java序列化程序序列,Storm會拋出一個錯誤。
Java序列化是極其昂貴的,無論是在CPU成本以及序列化的對象的大小。強烈建議您在Topology上生產環境之前注冊定制序列。 Java序列化在處理Topology原型的時候就是這樣的。
可以通過配置文件來關閉Java序列化功能,只需將Config.TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION配置設置為false
posted on 2012-01-19 14:29 徐紅星 閱讀(2474) 評論(0) 編輯 收藏 所屬分類: Storm