如何在 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 而不是委托令牌?