解决了!!愿解决方案帮助遇到同样问题的其他人。
在本教程中,我将向您展示如何在 Hadoop、Pig 和 Spark 上启用 LZO 压缩。我想你已经成功设置了一个基本的hadoop安装(如果没有,请参考其他Hadoop安装
教程)。
您访问此页面可能是因为您遇到了与我遇到的相同的问题,通常从 Java 异常开始:
Caused by: java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec not found.
由于 Apache 和 Cloudera 发行版是两个最流行的发行版,因此显示了两种上下文的配置。简而言之,将通过三个主要步骤走向最终成功:
- 安装
native-lzo
库
- 安装
hadoop-lzo
库
- 正确设置环境变量(正确的部分占用我最多的时间)
Step1:安装native-lzo
库
安装hadoop-lzo
. _ _ 您可以手动安装它们,也可以通过使用包管理器来安装它们(注意:确保集群中的所有节点都已native-lzo
安装。):
在 Mac 操作系统上:
sudo port install lzop lzo2
在 RH 或 CentOS 上:
sudo yum install lzo liblzo-devel
在 Debian 或 ubuntu 上:
sudo apt-get install liblzo2-dev
第二步:安装hadoop-lzo
库
对于 Apache Hadoop
由于 LZO 是 GPL 的,它没有附带采用 Apache 软件许可的官方 Hadoop 发行版。我推荐Twitter 版本,它是
hadoop-gpl-compression的分叉版本,具有显着改进。如果您运行的是官方 Hadoop,文档中提供了一些安装结构。
对于 Cloudera 分发
在 Cloudera 的 CDH 中,hadoop-lzo
以包裹的形式运送给客户,您可以使用 Cloudera Manager 方便地下载和分发它。默认情况下,hadoop-lzo
将安装在
/opt/cloudera/parcels/HADOOP_LZO
.
在这里,我们展示了集群上的配置:
- Cloudera CDH 5
- HADOOP_LZO 版本 0.4.15
第三步:设置环境变量
对于 Apache Hadoop/猪
基本配置是针对 Apache Hadoop 的,而 Pig 正在利用它的功能。
在以下位置设置压缩编解码器库core-site.xml
:
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
在以下位置设置 MapReduce 压缩配置mapred-site.xml
:
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<property>
<name>mapred.child.env</name>
<value>JAVA_LIBRARY_PATH=$JAVA_LIBRARY_PATH:/path/to/your/hadoop-lzo/libs/native</value>
</property>
附加HADOOP_CLASSPATH
到hadoop-env.sh
:
HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH/lib/hadoop/lib/*
对于 Cloudera 分发
您可以使用 Cloudera Manager 通过 GUI 界面启用相同的先前设置:
对于 MapReduce 组件,如上更改对应键的配置:
> **io.compression.codecs**
> **mapred.compress.map.output**
> **mapred.map.output.compression.codec**
> **MapReduce Client safety valve for mapred-site.xml**
编辑hadoop-env.sh 的 MapReduce 客户端环境片段以附加
HADOOP_CLASSPATH
变量。
最后以正确的顺序重启依赖服务,并在所有节点间部署配置。而已!!。然后您可以使用命令测试功能并获得类似于以下的成功消息:
$ hadoop jar /path/to/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer lzo_logs
$ 14/05/04 01:13:13 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
$ 14/05/04 01:13:13 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 49753b4b5a029410c3bd91278c360c2241328387]
$ 14/05/04 01:13:14 INFO lzo.LzoIndexer: [INDEX] LZO Indexing file datasets/lzo_logs size 0.00 GB...
$ 14/05/04 01:13:14 INFO Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
$ 14/05/04 01:13:14 INFO lzo.LzoIndexer: Completed LZO Indexing in 0.39 seconds (0.02 MB/s). Index size is 0.01 KB.
对于火花
这消耗了我很多时间,因为以前的帖子中的信息较少。但是根据以前的经验,解决方案很简单。
无论 Spark 是通过 tar 还是 Cloudera Manager 安装的,您只需将两个路径值附加到spark-env.sh
:
SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/path/to/your/hadoop-lzo/libs/native
SPARK_CLASSPATH=$SPARK_CLASSPATH:/path/to/your/hadoop-lzo/java/libs
相关帖子和问题
LZO性能对比在另外一个地方给出。在StackOverflow上也提出了一个相关问题,但在本教程结束之前还没有解决方案。您可能还对如何使用 Cloudera 的 LZO Parcel感兴趣。