Решено!! Пусть решение поможет другим, кто сталкивается с той же проблемой.
В этом руководстве я покажу вам, как включить сжатие 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
библиотек
Для установки hadoop-lzo
требуется библиотека Native-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-версию, которая является разветвленной версией hadoop-gpl-compression со значительными улучшениями. Если вы используете официальную версию Hadoop, некоторые структуры установки предоставляются в документации. а>.
Для дистрибутива Cloudera
В CDH Cloudera hadoop-lzo
отправляется клиентам в виде посылок, и вы можете удобно загружать и распространять его с помощью Cloudera Manager. По умолчанию hadoop-lzo
будет установлен в /opt/cloudera/parcels/HADOOP_LZO
.
Здесь мы показываем конфигурацию нашего кластера:
- Клаудера CDH 5
- HADOOP_LZO версии 0.4.15
Шаг 3: Настройка переменных окружения
Для 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_CLASSPATH
к hadoop-env.sh
:
HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH/lib/hadoop/lib/*
Для дистрибутива Cloudera
Вы можете использовать Cloudera Manager, чтобы включить те же предыдущие настройки через графический интерфейс:
Для компонента 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 от Cloudera.
person
caesar0301
schedule
03.05.2014