2011年2月4日金曜日

hadoop でjava のserializableを受け渡すには

何らかの方法でシリアライズするわけだが、hadoop はデフォルトではJavaのシリアライズではなく 独自のシリアライザを使うようになっている。これはJavaのシリアライズが重いため、だそうだ。

しかしもちろんシリアライザの実装を変更することができ、Javaのシリアライザを使うように 指定することもできる。それには、こうする。

Configuration conf = new Configuration();
conf.set("io.serializations", 
  org.apache.hadoop.io.serializer.JavaSerialization.class.getName() + "," +
  org.apache.hadoop.io.serializer.WritableSerialization.class.getName());
要するにSerialization クラスをカンマで区切って、 io.serializations にセットするのだけど、JavaSerialization だけだと、Textとかが デコードできなくなっちゃうので、デフォルトのWritableSerialization も書いておくこと。