在CDH 5上,Spark找不到用于压缩的LzoCodec类?

14
我已经在解决这个问题上工作了两天,但仍然找不到解决办法。
问题:我们通过最新的CDH 5安装了Spark,即使我通过cloudera manager中的Parcels安装了HADOOP_LZO,它仍然抱怨丢失了LzoCodec类。我们在CDH 5.0.0-1.cdh5.0.0.p0.47上运行MR1。
尝试修复: 官方CDH文档关于“使用LZO Parcel”的配置已添加,但问题仍然存在。 大多数谷歌搜索结果给出与上述类似的建议。我还怀疑Spark正在尝试针对未激活的YARN运行,但我找不到CMF或其他相关话题的配置。
如果您知道如何处理,请给我一些帮助。
4个回答

29

已解决!! 希望这个解决方案能帮助到其他遇到同样问题的人。


在本教程中,我将展示如何在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 )。:

  • 在Mac OS上:

  • 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则使用其功能。

  • 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发行版

    您可以使用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,你只需要将两个路径值附加到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感兴趣,请参见这里


    3
    在 Stack Overflow 上包含这些信息将非常有价值,这样即使您的博客关闭或更改地址,信息也会保留下来。 - mattwise
    @ChrisF 抱歉,我的博客迁移到 Github 后链接已更新。 - caesar0301
    1
    @caesar0301 - 如果您在这里总结答案,那将非常有帮助。这样它就能够在未来的迁移中得以保存。 - ChrisF
    链接又坏了。 - Fedorenko Kristina
    "Twitter Version" 链接是 404。 - harschware
    SPARK_LIBRARY_PATH在2014年已经发生了变化,详情请见:https://github.com/apache/spark/commit/fb98488fc8e68cc84f6e0750fd4e9e29029879d2。现在不再将SPARK_CLASSPATH、SPARK_JAVA_OPTS和SPARK_LIBRARY_PATH传递给集群上的执行器,这是一种丑陋的hack方法。相反,引入了配置变量spark.executor.extraJavaOpts、spark.executor.extraLibraryPath和spark.executor.extraClassPath。 - miku

    1
    对于使用Ambari的Hortonworks 2.3.0版本,需要添加自定义spark-defaults属性才能使Spark与LZO配合使用。我已经添加了以下内容:
    • spark.driver.extraClassPath /usr/hdp/current/hadoop-client/lib/hadoop-lzo-0.6.0.{{hdp_full_version}}.jar
    • spark.driver.extraLibraryPath /usr/hdp/current/hadoop-client/lib/native:/usr/hdp/current/hadoop-client/lib/native/Linux-amd64-64
    这是基于HDP 2.3.0升级SPARK 2.2页面(有些错别字)。

    如果通过命令行运行Spark,则可以将相同的属性(如dajobe所指出的)以以下格式作为参数传递给Spark CLI: spark-submit --conf spark.driver.extraClassPath=<path to hadoop lzo jar>:<path to hadoop-4mc jar> --conf spark.driver.extraLibraryPath=/usr/hdp/current/hadoop-client/lib/native:/usr/hdp/current/hadoop-client/lib/native/Linux-amd64-64 - rohit kochar

    0

    Class com.hadoop.compression.lzo.LzoCodec not found 这个问题也发生在我身上,当我使用EMR查询Hive时。

    根据其他人的解决方案,我采取了一种捷径。 在core-site.xml中

    删除这个:

    <property>
      <name>io.compression.codec.lzo.class</name>
      <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>
    
    

    在这里删除 com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec

    <property>
      <name>io.compression.codecs</name>
      <value>com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec</value>
    </property>
    <property>
    

    0

    我在我的Cloudera 5安装中遇到了相同的错误。在我的情况下,已经安装并分发了GPLEXTRAS包,但未激活。

    在Cloudera Manager -> 主机 -> 包裹 我按下了“清除过滤器”按钮,然后我就能够激活之前已经分发的GPLEXTRAS包了。

    这就足以解决我的问题了。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接