在CDH 5上找不到Spark的类com.hadoop.compression.lzo.LzoCodec?

cae*_*301 11 apache-spark hadoop-lzo cloudera-cdh

我已经在这个问题上工作了两天,仍然没有找到方法.

问题:我们通过最新的CDH 5安装的Spark总是抱怨丢失LzoCodec类,即使我在cloudera管理器中通过Parcels安装HADOOP_LZO也是如此.我们在CDH 5.0.0-1.cdh5.0.0.p0.47上运行MR1.

尝试修复:还添加了有关"使用LZO包裹 "的官方CDH文档中的配置,但问题仍然存在.

大多数谷歌帖子都提供了类似的建议.我还怀疑火花正在试图对抗那些未在那里激活的YARN; 但我无法在CMF或其他帖子中找到有关此主题的配置.

如果您知道如何处理它,请给我一些帮助.

cae*_*301 21

解决了!!该解决方案可以帮助遇到相同问题的其他人.


在本教程中,我将向您展示如何在Hadoop,Pig和Spark上启用LZO压缩.我想你已经成功安装了一个基本的hadoop安装(如果没有,请参考Hadoop安装的 其他教程).

您可能因为遇到与我遇到的问题相同而到达此页面,通常从Java异常开始:

Caused by: java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec not found.
Run Code Online (Sandbox Code Playgroud)

由于Apache和Cloudera发行版是两种最流行的发行版,因此显示了两种上下文的配置.简而言之,将走向最终成功的三个主要步骤:

  • 安装native-lzo
  • 安装hadoop-lzo
  • 正确设置环境变量(正确的部分消耗我的大部分时间)

第1步:安装native-lzo

本机库LZO需要安装的hadoop-lzo.您可以手动安装它们,也可以通过管理程序包管理器来安装它们(注意:确保已native-lzo安装群集中的所有节点.):

第2步:安装hadoop-lzo

对于Apache Hadoop

由于LZO是GPL,因此它不附带获得Apache软件许可的官方Hadoop发行版.我推荐Twitter版本,它是hadoop-gpl-compression的分叉版本, 具有显着的改进.如果您正在运行官方Hadoop,则文档中会提供一些安装结构.

对于Cloudera Distribution

在Cloudera的CDH中,hadoop-lzo作为包裹运送给客户,您可以使用Cloudera Manager方便地下载和分发它.默认情况下,hadoop-lzo将安装在 /opt/cloudera/parcels/HADOOP_LZO.

这里我们展示集群上的配置:

  • Cloudera CDH 5
  • HADOOP_LZO版本0.4.15

第3步:设置env变量

对于Apache Hadoop/Pig

基本配置适用于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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 在以下位置设置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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 附加HADOOP_CLASSPATHhadoop-env.sh:

    HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH/lib/hadoop/lib/*
    
    Run Code Online (Sandbox Code Playgroud)

对于Cloudera Distribution

您可以使用Cloudera Manager通过GUI界面启用相同的先前设置:

  • 对于MapReduce组件,更改上面相应键的配置:

    > **io.compression.codecs**
    > **mapred.compress.map.output**
    > **mapred.map.output.compression.codec**
    > **MapReduce Client safety valve for mapred-site.xml**
    
    Run Code Online (Sandbox Code Playgroud)
  • 编辑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.
Run Code Online (Sandbox Code Playgroud)

对于Spark

这花费了我很多时间,因为以前的帖子中的信息较少.但是,根据以往的经验,解决方案是非常明确的.

无论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
Run Code Online (Sandbox Code Playgroud)

提出的帖子和问题

另一个地方给出了LZO性能的比较.在StackOverflow上也会询问一个相关的问题,但在本教程结束之前没有解决方案.您可能也对如何使用Cloudera的LZO Parcel感兴趣.

  • 将这些信息包含在SO中是有价值的,这样如果您的博客关闭或更改地址,它将持续存在. (3认同)