13

我已经解决这个问题两天了,仍然没有找到方法。

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

尝试修复CDH官方文档中关于“使用LZO包裹”的配置也被添加了,但问题仍然存在。

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

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

4

3 回答 3

28

解决了!!愿解决方案帮助遇到同样问题的其他人。


在本教程中,我将向您展示如何在 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
  • 正确设置环境变量(正确的部分占用我最多的时间)

Step1:安装native-lzo

安装hadoop-lzo. _ _ 您可以手动安装它们,也可以通过使用包管理器来安装它们(注意:确保集群中的所有节点都已native-lzo安装。):

  • 在 Mac 操作系统上:

    sudo port install lzop lzo2
    
  • 在 RH 或 CentOS 上:

    sudo yum install lzo liblzo-devel
    
  • 在 Debian 或 ubuntu 上:

    sudo apt-get install liblzo2-dev
    

第二步:安装hadoop-lzo

对于 Apache Hadoop

由于 LZO 是 GPL 的,它没有附带采用 Apache 软件许可的官方 Hadoop 发行版。我推荐Twitter 版本,它是 hadoop-gpl-compression的分叉版本,具有显着改进。如果您运行的是官方 Hadoop,文档中提供了一些安装结构。

对于 Cloudera 分发

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

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

  • Cloudera CDH 5
  • HADOOP_LZO 版本 0.4.15

第三步:设置环境变量

对于 Apache Hadoop/猪

基本配置是针对 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_CLASSPATHhadoop-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-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感兴趣。

于 2014-05-03T19:24:00.283 回答
1

要使带有 Ambari for Spark 的 Hortonworks 2.3.0 与 LZO 一起使用,您需要添加自定义 spark-defaults属性。我补充说:

  • 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页面(它有一些错别字)。

于 2015-09-09T22:02:20.200 回答
0

我刚刚在 Cloudera 5 安装中遇到了同样的错误。就我而言,它是 GPLEXTRAS 包裹,它已安装、分发但未激活。

在 Cloudera Manager -> Hosts -> Parcels 上,我在所有地方都按下了过滤器,然后我能够在之前已经分发的 GPLEXTRAS parcess 上按下 Activate。

这足以解决我的问题。

于 2019-03-03T12:07:48.317 回答