以下是本楼主用血和泪换来的教训,往事不堪回首啊!
lzo关于hadoop的codec有两个 com.hadoop.compression.lzo.LzoCodec 和com.hadoop.compression.lzo.LzopCodec,两个类虽只有一字之差,其实区别挺大。
1. LzopCodec与lzop工具兼容,LzopCodec本质是LZO格式的但包含额外的文件头。
lzoCodec只是一种压缩算法,不会生成额外的文件头。
ps:http://www.quora.com/Whats-the-difference-between-the-LzoCodec-and-the-LzopCodec-in-Hadoop-LZO
2. 在MR Job中:
如果输出格式是TextOutputFormat,要用LzopCodec,相应的读取这个输出的格式是LzoTextInputFormat。
如果输出格式用SequenceFileOutputFormat,要用LzoCodec,相应的读取这个输出的格式是SequenceFileInputFormat。
如果输出使用SequenceFile配上LzopCodec的话,那就等着用SequenceFileInputFormat读取这个输出时收到“java.io.EOFException: Premature EOF from inputStream”吧。具体解释见:
http://web.archiveorange.com/archive/v/5nvvZ7eWCDGq6ExVf3zX
我会告诉你我写出的十几T的数据都给我报这个异常吗。。。
3. hadoop fs -text /path/to/sequencefile 命令可以直接读取sequencefile,如果想要测试一个文件能否用SequenceFileInputFormat读取,可以用这个命令测试
4. hive中使用lzo也是同样的道理,因为hive任务底层还是用MapReduce实现的。