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

时间:2014-05-03 06:37:15

标签: apache-spark cloudera-cdh hadoop-lzo

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

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

尝试修复official CDH documentation about 'Using the LZO Parcel'中的配置也添加了,但问题仍然存在。

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

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

2 个答案:

答案 0 :(得分:21)

解决!!该解决方案可以帮助遇到同样问题的其他人。


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

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

Caused by: java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec not found.

由于Apache和Cloudera发行版是最受欢迎的两种 显示了两种情境的分布,配置。简而言之,三 主要步骤将走向最终的成功:

  • 安装native-lzo个库
  • 安装hadoop-lzo
  • 正确设置环境变量(右侧部分 消耗我最多的时间)

步骤1:安装native-lzo

native-lzo library是 安装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
    

第2步:安装hadoop-lzo

对于Apache Hadoop

由于LZO是GPL,因此不附带官方Hadoop发行版 获取Apache软件许可证。我推荐Twitter version这是一个分叉版本 hadoop-gpl-compression 显着的改进。如果您正在运行官方Hadoop,有些 安装结构由the documentation提供。

对于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>
    
  • 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 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**
    
  • 为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

这会耗费我很多时间,因为之前的信息较少 帖子。但是,根据之前的经验,解决方案是非常明确的。

无论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

提出的帖子和问题

another place给出了LZO表现的比较。一个 相关问题也在StackOverflow上提出,但没有解决方案 关于这个直到本教程的结束。您可能也对如何感兴趣 到use the LZO Parcel from Cloudera

答案 1 :(得分:0)

我在Cloudera 5安装中遇到了相同的错误。以我为例,已安装,分发但未激活的是GPLEXTRAS包裹。

在Cloudera Manager上->主机->包裹 我按了所有地方清除的过滤器,然后按了先前已分发的GPLEXTRAS父项上的“激活”。

这足以解决我的问题。