Big Data Road

          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
          動態序列化對象。
          在我們獲得序列化接口之前,讓我們花點時間理解Storm 的Tuple 為什么是動態類型。
          添加靜態類型的到Tuple 的Fileds,將會給Storm的API增加大量的復雜性。例如,Hadoop,靜態類型的鍵和值,在用戶使用時,需要的很多注釋。 Hadoop的API使用起來比較麻煩,“類型安全”是不值得的。動態類型是簡單容易使用。
          很難用一種合理的靜態方式來統計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.CustomType3
          com.mycompany.CustomType1com.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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          留言簿

          隨筆分類

          文章分類

          文章檔案

          搜索

          最新評論

          主站蜘蛛池模板: 土默特右旗| 彭阳县| 崇仁县| 乃东县| 当阳市| 灵台县| 察哈| 南平市| 绥江县| 五台县| 鄂州市| 义马市| 鹤山市| 临沧市| 望城县| 黎平县| 织金县| 泾阳县| 宜章县| 海丰县| 光山县| 义乌市| 扎鲁特旗| 台前县| 乌兰浩特市| 建平县| 阿合奇县| 潮州市| 手机| 三门县| 双流县| 锡林郭勒盟| 荥经县| 邢台市| 华安县| 新昌县| 象山县| 老河口市| 溆浦县| 旬阳县| 峨眉山市|