我想使用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上运行。

安装包括以下步骤:

  • 安装LZO
    sudo yum install lzopsudo yum install lzo-devel
  • 安装ANT
    sudo yum install ant ant-nodeps ant-junit java-devel
  • 下载源
    git clone https://github.com/twitter/hadoop-lzo.git
  • 编译Hadoop-LZO
    ant compile-native tar
    有关更多说明和故障排除,请参见https://github.com/twitter/hadoop-lzo
  • 将Hapoop-LZO jar复制到Hadoop库
    sudo cp build/hadoop-lzo*.jar /usr/lib/hadoop/lib/
  • 将本机代码移至Hadoop本机库
    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
  • 进行试运行
  • 登录到Cloudera Manager
  • 从服务中选择:mapreduce1-> Configuration
  • 客户端->压缩
  • 添加到压缩编解码器:
    com.hadoop.compression.lzo.LzoCodeccom.hadoop.compression.lzo.LzopCodec
  • 搜索“阀门”
  • 添加到MapReduce服务配置安全阀
    io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodecmapred.child.env="JAVA_LIBRARY_PATH=/usr/lib/hadoop/lib/native/Linux-amd64-64/"
  • 添加到MapReduce服务环境安全阀
    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/

    10-12 17:32