如何在 hadoop mapreduce 中进行 lzo 压缩?

Posted

技术标签:

【中文标题】如何在 hadoop mapreduce 中进行 lzo 压缩?【英文标题】:How to have lzo compression in hadoop mapreduce? 【发布时间】:2013-02-11 08:02:54 【问题描述】:

我想使用 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?

【问题讨论】:

我们可以知道确切的例外情况吗? 【参考方案1】:

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

以下步骤在Cloudera's Demo VM(CentOS 6.2、x64)上进行了测试,安装了完整的 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->配置

客户端->压缩

添加到压缩编解码器:

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。如果您使用分区,则可以按分区进行。

【讨论】:

嗨,现在代替 ant,需要 maven 来构建 twitter/hadoop-lzo。

以上是关于如何在 hadoop mapreduce 中进行 lzo 压缩?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 hadoop-2.2 在 oozie 中执行 mapreduce 程序

如何在 Hadoop mapReduce 中获取 Kerberos 而不是委托令牌?

如何获取hadoop mapreduce job运行信息

如何获取hadoop mapreduce job运行信息

如何使用Python为Hadoop编写一个简单的MapReduce程序

如何提升Hadoop MapReduce性能