1

我想使用 lzo 来压缩地图输出但我无法运行它!我使用的 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 文件时,它显示了一个无法写入映射输出的异常。

我必须安装lzo吗?我需要做什么才能使用 lzo?

4

1 回答 1

11

LZO 的许可证 (GPL) 与 Hadoop (Apache) 的许可证不兼容,因此不能与之捆绑。需要在集群上单独安装 LZO。

以下步骤在Cloudera 的 Demo VM(CentOS 6.2,x64)上进行了测试,该 VM 安装了完整的 CDH 4.2.0 和 CM 免费版,但它们应该可以在任何基于 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 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.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/*

而已。

您使用的 MarReduce 作业TextInputFormat应该与.lzo文件无缝协作。但是,如果您选择索引 LZO 文件以使其可拆分(使用com.hadoop.compression.lzo.DistributedLzoIndexer),您会发现索引器会在.index每个文件旁边写入一个.lzo文件。这是一个问题,因为您TextInputFormat会将这些解释为输入的一部分。在这种情况下,您需要更改您的 MR 工作以使用LzoTextInputFormat.

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

于 2013-06-17T09:42:26.460 回答