据我了解,需要一个索引文件才能使输出可拆分。如果mapred.output.compression.type=SequenceFile.CompressionType.RECORD,我们还需要创建Index文件吗?
1 回答
简短的回答:
RECORD 和 BLOCK compression.type 属性适用于序列文件,而不适用于简单的文本文件(可以使用 lzo 或 gzip 或 bz2 ... 独立压缩)
更多信息:
LZO 是一种压缩编解码器,它提供比 gzip 更好的压缩和解压缩速度,并且还具有拆分能力。LZO 允许这样做,因为它由许多较小的 (~256K) 压缩数据块组成,允许沿块边界拆分作业,而不是 gzip,整个文件的字典写在顶部。
当您将 mapred.output.compression.codec 指定为 LzoCodec 时,hadoop 将生成.lzo_deflate文件。这些包含没有任何标题的原始压缩数据,并且无法使用lzop -d
命令解压缩。Hadoop 可以在映射阶段读取这些文件,但这会让您的生活变得艰难。
当您将 LzopCodec 指定为 compression.codec 时,hadoop 将生成.lzo文件。这些包含标题,可以使用解压缩lzop -d
但是,默认情况下,.lzo 和 .lzo_deflate 文件都不可拆分。这就是 LzoIndexer 发挥作用的地方。它会生成一个索引文件,告诉您记录边界在哪里。这样,多个地图任务可以处理同一个文件。
有关更多信息,请参阅此 cloudera 博客文章和LzoIndexer。