以下是本樓主用血和淚換來的教訓,往事不堪回首啊!
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實現的。