2013-02-11 88 views
1

我想用LZO压缩图输出,但我无法运行它!我使用的Hadoop版本是0.20.2。我设置了:如何在Hadoop的MapReduce的LZO压缩?

conf.set("mapred.compress.map.output", "true") 
conf.set("mapred.map.output.compression.codec", 
"org.apache.hadoop.io.compress.LzoCodec"); 

当我在Hadoop中运行jar文件时,它显示了一个无法写入映射输出的异常。

我必须安装LZO? 我有什么做用LZO?

+1

我们可能知道确切的例外吗? – Amar 2013-02-11 18:03:37

回答

10

LZO的许可证(GPL)是与Hadoop的(阿帕奇)不兼容,因此它不能与它捆绑在一起。需要在群集上单独安装LZO。

以下步骤在安装了完整CDH 4.2.0和CM免费版的Cloudera's Demo VM(CentOS 6.2,x64)上进行测试,但它们应该适用于基于Red Hat的任何Linux。

的安装包括以下步骤:

  • 安装LZO

    sudo yum install lzop

    sudo 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罐到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的这些的机器

    rsync /usr/lib/hadoop/lib/到所有主机的其余部分。

    您可以干运行此先用-n

  • 登录到Cloudera的经理从服务

  • 选择:mapreduce1->配置

  • 客户端 - >压缩

  • 添加压缩编码解码器:

    com.hadoop.compression.lzo.LzoCodec

    com.hadoop.compression.lzo.LzopCodec

  • 搜索 “阀门”

  • 添加到MapReduce的服务配置安全阀

    io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodec mapred.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),您会发现索引器在每个.lzo文件旁边都写入.index文件。这是一个问题,因为你的TextInputFormat将把这些解释为输入的一部分。在这种情况下,您需要将您的MR作业更改为使用LzoTextInputFormat

作为Hive,只要您不索引LZO文件,更改也是透明的。如果您开始索引(以利用更好的数据分布),则需要将输入格式更新为LzoTextInputFormat。如果您使用分区,则可以为每个分区执行此操作。