Класс com.hadoop.compression.lzo.LzoCodec не найден для Spark на CDH 5?

Я работаю над этой проблемой в течение двух дней и до сих пор не нашел пути.

Проблема. Наш Spark, установленный через новейший CDH 5, всегда жалуется на потерянный класс LzoCodec даже после установки HADOOP_LZO через Parcels в диспетчере cloudera. Мы запускаем MR1 на CDH 5.0.0-1.cdh5.0.0.p0.47.

Попробуйте исправить: Также добавлены конфигурации в официальной документации CDH об использовании LZO Parcel, но проблема все еще существует.

Большинство сообщений в googled дают аналогичные рекомендации выше. Я также подозреваю, что искра пытается работать против YARN, которая не активируется там; но я не могу найти конфигурацию в CMF или других сообщениях по этой теме.

Пожалуйста, помогите мне, если вы знаете, как с этим бороться.

Ответ 1

Решено !! Пусть решение поможет другим, кто сталкивается с той же проблемой.


В этом уроке я покажу вам, как включить сжатие LZO в Hadoop, Pig и Spark. Я полагаю, что вы успешно установили базовую установку hadoop (если нет, обратитесь к другим учебным пособиям по установке Hadoop).

Возможно, вы попадаете на эту страницу, потому что сталкиваетесь с той же проблемой, что и я, обычно начиная с исключения 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

Библиотека native-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
    

Шаг 2: Установка библиотеки hadoop-lzo

Для Apache Hadoop

Поскольку LZO является лицензией GPL, он не поставляется с официальным дистрибутивом Hadoop, который принимает Apache Software License. Я рекомендую версию Twitter, которая является раздвоенной версией rel="nofollow noreferrer">hadoop-gpl-compress с замечательными улучшениями. Если вы работаете с официальным Hadoop, некоторые структуры установки предоставляются вместе с документацией.

Для Cloudera Distribution

В Cloudera CDH hadoop-lzo поставляется покупателям в виде посылок, и вы можете 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>
    
  • Установите конфигурацию сжатия 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 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**
    
  • Отредактируйте фрагмент клиентской среды MapReduce для hadoop-env.sh, чтобы добавить переменную 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, но до конца этого урока нет решений по этому поводу. Вы также можете быть заинтересованы в том, как использовать LZO Parcel от Cloudera.

Ответ 2

Для Hortonworks 2.3.0 с Ambari для Spark для работы с LZO вам нужно добавить свойства Custom 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 (у нее есть некоторые опечатки).

Ответ 3

У меня просто была такая же ошибка в моей установке Cloudera 5. В моем случае это была посылка GPLEXTRAS, которая была установлена, распространена, но не активирована.

В Cloudera Manager → Hosts → Parcels. Я везде нажимал на фильтры, затем я мог нажать кнопку Activate на том GPLEXTRAS, который ранее уже был распределен.

Этого было достаточно, чтобы исправить мою проблему.