我想使用lzo压缩 map 输出,但无法运行!我使用的Hadoop版本是0.20.2
。我设置:
conf.set("mapred.compress.map.output", "true")
conf.set("mapred.map.output.compression.codec",
"org.apache.hadoop.io.compress.LzoCodec");
当我在Hadoop中运行jar文件时,它显示了无法写入 map 输出的异常。
我必须安装lzo吗?
使用lzo我需要做什么?
最佳答案
LZO的许可证(GPL)与Hadoop(Apache)的许可证不兼容,因此不能与其 bundle 在一起。一个需要在群集上单独安装LZO。
以下步骤已在安装了完整堆栈CDH 4.2.0和CM Free Edition的Cloudera's Demo VM(CentOS 6.2,x64)上进行了测试,但它们应在任何基于Red Hat的Linux上运行。
安装包括以下步骤:
sudo yum install lzop
sudo yum install lzo-devel
sudo yum install ant ant-nodeps ant-junit java-devel
git clone https://github.com/twitter/hadoop-lzo.git
ant compile-native tar
有关更多说明和故障排除,请参见https://github.com/twitter/hadoop-lzo
sudo cp build/hadoop-lzo*.jar /usr/lib/hadoop/lib/
sudo mv build/hadoop-lzo-0.4.17-SNAPSHOT/lib/native/Linux-amd64-64/ /usr/lib/hadoop/lib/native/
cp /usr/lib/hadoop/lib/native/Linux-amd64-64/libgplcompression.* /usr/lib/hadoop/lib/native/
正确的版本号与您克隆的版本
rsync /usr/lib/hadoop/lib/
发送给所有主机。您可以先使用-n
com.hadoop.compression.lzo.LzoCodec
com.hadoop.compression.lzo.LzopCodec
io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodec
mapred.child.env="JAVA_LIBRARY_PATH=/usr/lib/hadoop/lib/native/Linux-amd64-64/"
HADOOP_CLASSPATH=/usr/lib/hadoop/lib/*
而已。
您使用
TextInputFormat
的MarReduce作业应与.lzo
文件无缝配合。但是,如果您选择对LZO文件建立索引以使其可拆分(使用com.hadoop.compression.lzo.DistributedLzoIndexer
),则会发现索引器在每个.index
文件旁边写入一个.lzo
文件。这是一个问题,因为您的TextInputFormat
会将它们解释为输入的一部分。在这种情况下,您需要更改MR作业以使用LzoTextInputFormat
。从Hive开始,只要不对LZO文件建立索引,更改也是透明的。如果您开始建立索引(以利用更好的数据分布),则需要将输入格式更新为
LzoTextInputFormat
。如果使用分区,则可以按分区进行操作。关于hadoop - hadoop mapreduce中如何进行lzo压缩?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14808041/