已解决!! 希望这个解决方案能帮助到其他遇到同样问题的人。
在本教程中,我将展示如何在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
库
- 正确设置环境变量(消耗我最多时间的正确部分)
第一步:安装 native-lzo
库
安装 hadoop-lzo
之前需要安装native-lzo库。 您可以手动安装它们,也可以通过使用软件包管理器来安装(注意:确保集群中的所有节点都已安装 native-lzo
)。:
sudo port install lzop lzo2
在红帽或CentOS上:
sudo yum install lzo liblzo-devel
在Debian或Ubuntu上:
sudo apt-get install liblzo2-dev
Step2: 安装hadoop-lzo
库
对于Apache Hadoop
由于LZO采用GPL许可证,它没有与官方的Hadoop发行版一起发布,而后者采用Apache软件许可证。我建议使用Twitter版本,这是一个有显着改进的hadoop-gpl-compression的分支版本。如果你正在运行官方的Hadoop,可以在文档中找到一些安装结构。
对于Cloudera Distribution
在Cloudera's CDH中,hadoop-lzo
作为包被提供给客户,你可以使用Cloudera Manager方便地下载和分发它。默认情况下,hadoop-lzo
将被安装在/opt/cloudera/parcels/HADOOP_LZO
中。
这里我们展示了我们集群的配置:
- Cloudera CDH 5
- HADOOP_LZO 版本 0.4.15
Step3: 设置环境变量
对于Apache Hadoop/Pig
基本的配置是针对Apache Hadoop,而Pig则使用其功能。
<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>
在
mapred-site.xml
中设置MapReduce压缩配置:
<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界面启用与之前相同的设置:
> **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,你只需要将两个路径值附加到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感兴趣,请参见这里。