我已经在这个问题上工作了两天,仍然没有找到方法.
问题:我们通过最新的CDH 5安装的Spark总是抱怨丢失LzoCodec类,即使我在cloudera管理器中通过Parcels安装HADOOP_LZO也是如此.我们在CDH 5.0.0-1.cdh5.0.0.p0.47上运行MR1.
尝试修复:还添加了有关"使用LZO包裹 "的官方CDH文档中的配置,但问题仍然存在.
大多数谷歌帖子都提供了类似的建议.我还怀疑火花正在试图对抗那些未在那里激活的YARN; 但我无法在CMF或其他帖子中找到有关此主题的配置.
如果您知道如何处理它,请给我一些帮助.
解决了!!该解决方案可以帮助遇到相同问题的其他人.
在本教程中,我将向您展示如何在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
库该本机库LZO需要安装的hadoop-lzo
.您可以手动安装它们,也可以通过管理程序包管理器来安装它们(注意:确保已native-lzo
安装群集中的所有节点.):
在Mac OS上:
sudo port install lzop lzo2
在RH或CentOS上:
sudo yum install lzo liblzo-devel
在Debian或ubuntu上:
sudo apt-get install liblzo2-dev
hadoop-lzo
库由于LZO是GPL,因此它不附带获得Apache软件许可的官方Hadoop发行版.我推荐Twitter版本,它是hadoop-gpl-compression的分叉版本, 具有显着的改进.如果您正在运行官方Hadoop,则文档中会提供一些安装结构.
在Cloudera的CDH中,hadoop-lzo
作为包裹运送给客户,您可以使用Cloudera Manager方便地下载和分发它.默认情况下,hadoop-lzo
将安装在
/opt/cloudera/parcels/HADOOP_LZO
.
这里我们展示集群上的配置:
Cloudera CDH 5
HADOOP_LZO版本0.4.15
基本配置适用于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 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感兴趣.