Как включить Snappy/Snappy Codec поверх кластера hadoop для Google Compute Engine
Я пытаюсь запустить Hadoop Job на движке Google Compute для наших сжатых данных, которые хранятся в облачном хранилище Google. При попытке прочитать данные через SequenceFileInputFormat я получаю следующее исключение:
hadoop@hadoop-m:/home/salikeeno$ hadoop jar ${JAR} ${PROJECT} ${OUTPUT_TABLE}
14/08/21 19:56:00 INFO jaws.JawsApp: Using export bucket 'askbuckerthroughhadoop' as specified in 'mapred.bq.gcs.bucket'
14/08/21 19:56:00 INFO bigquery.BigQueryConfiguration: Using specified project-id 'regal-campaign-641' for output
14/08/21 19:56:00 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.8-hadoop1
14/08/21 19:56:01 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/08/21 19:56:03 INFO input.FileInputFormat: Total input paths to process : 1
14/08/21 19:56:09 INFO mapred.JobClient: Running job: job_201408211943_0002
14/08/21 19:56:10 INFO mapred.JobClient: map 0% reduce 0%
14/08/21 19:56:20 INFO mapred.JobClient: Task Id : attempt_201408211943_0002_m_000001_0, Status : FAILED
java.lang.RuntimeException: native snappy library not available
at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:189)
at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:125)
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1581)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1490)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1479)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1474)
at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:50)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:521)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
- Похоже, что SnappyCodec недоступен. Как мне включить / включить Snappy в моем кластере Hadoop на Google Compute Engine?
- Могу ли я развернуть Snappy lib (если потребуется) через скрипт bdutil при развертывании кластера Hadoop?
- Каков наилучший подход для развертывания сторонних библиотек libs/jar в кластере Hadoop, развернутом на движке Google Compute?
большое спасибо
1 ответ
Эта процедура больше не требуется.
Развертывание bdutil будет содержать Snappy по умолчанию.
Для справки, оригинальный ответ:
На ваш последний вопрос легче всего ответить в общем случае, поэтому я начну с него. Общее руководство для зависимостей доставки состоит в том, что приложения должны использовать распределенный кеш для раздачи JAR-файлов и библиотек работникам (Hadoop 1 или 2). Если ваш код уже использует GenericOptionsParser, вы можете использовать JAR-файлы с флагом -libjars. Более подробное обсуждение можно найти в блоге Cloudera, где также обсуждаются жирные JAR-файлы: http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/
Для установки и настройки других компонентов системного уровня bdutil поддерживает механизм расширения. Хорошим примером расширений является расширение Spark, связанное с bdutil: extensions/spark/spark_env.sh. При запуске расширения bdutil добавляются с флагом -e, например, для развертывания Spark с Hadoop:
./bdutil -e extensions/spark/spark_env.sh deploy
Что касается ваших первого и второго вопросов: есть два препятствия, когда вы имеете дело со Snappy в Hadoop на GCE. Во-первых, встроенные библиотеки поддержки, созданные Apache и связанные с архивами Hadoop 2, созданы для i386, а экземпляры GCE - amd64. Hadoop 1 объединяет двоичные файлы для обеих платформ, но snappy нельзя найти без объединения или изменения среды. Из-за этого различия в архитектуре в Hadoop 2 нельзя использовать собственные компрессоры (snappy или иные), а Snappy недоступен в Hadoop 1. Вторым препятствием является то, что сама libsnappy по умолчанию не установлена.
Самый простой способ преодолеть оба этих фактора - создать свой собственный tar-архив Hadoop, содержащий собственные библиотеки Hadoop amd64, а также libsnappy. Следующие шаги должны помочь вам сделать это и подготовить полученный архив для использования bdutil.
Для начала запустите новую виртуальную машину GCE с помощью образа бэкпортов Debian Wheezy и предоставьте учетной записи службы виртуальной машины доступ на чтение / запись к облачному хранилищу. Мы будем использовать это как нашу машину для сборки, и мы можем безопасно отказаться от нее, как только мы закончим сборку / хранение двоичного файла.
Сборка Hadoop 1.2.1 с помощью Snappy
SSH к вашему новому экземпляру и выполните следующие команды, проверяя наличие ошибок на этом пути:
sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
tar zxvf hadoop-1.2.1.tar.gz
pushd hadoop-1.2.1/
# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/Linux-amd64-64/
# Test to make certain Snappy is being loaded and is working:
bin/hadoop jar ./hadoop-test-1.2.1.jar testsequencefile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check
# Create a new tarball of Hadoop 1.2.1:
popd
rm hadoop-1.2.1.tar.gz
tar zcvf hadoop-1.2.1.tar.gz hadoop-1.2.1/
# Store the tarball on GCS:
gsutil cp hadoop-1.2.1.tar.gz gs://<some bucket>/hadoop-1.2.1.tar.gz
Сборка Hadoop 2.4.1 с помощью Snappy
SSH к вашему новому экземпляру и выполните следующие команды, проверяя наличие ошибок на этом пути:
sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
# Protobuf 2.5.0 is required and not in Debian-backports
wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
tar xvf protobuf-2.5.0.tar.gz
pushd protobuf-2.5.0/ && ./configure && make && sudo make install && popd
sudo ldconfig
wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-2.4.1/hadoop-2.4.1-src.tar.gz
# Unpack source
tar zxvf hadoop-2.4.1-src.tar.gz
pushd hadoop-2.4.1-src
# Build Hadoop
mvn package -Pdist,native -DskipTests -Dtar
pushd hadoop-dist/target/
pushd hadoop-2.4.1/
# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/
# Test that everything is working:
bin/hadoop jar share/hadoop/common/hadoop-common-2.4.1-tests.jar org.apache.hadoop.io.TestSequenceFile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check
popd
# Create a new tarball with libsnappy:
rm hadoop-2.4.1.tar.gz
tar zcf hadoop-2.4.1.tar.gz hadoop-2.4.1/
# Store the new tarball on GCS:
gsutil cp hadoop-2.4.1.tar.gz gs://<some bucket>/hadoop-2.4.1.tar.gz
popd
popd
Обновление bdutil_env.sh или hadoop2_env.sh
Если у вас есть версия Hadoop с правильными связанными собственными библиотеками, мы можем указать bdutil на новый архив Hadoop, обновив либо bdutil_env.sh для Hadoop 1, либо hadoop2_env.sh для Hadoop 2. В любом случае откройте соответствующий файл и найдите блок по направлениям:
# URI of Hadoop tarball to be deployed. Must begin with gs:// or http(s)://
# Use 'gsutil ls gs://hadoop-dist/hadoop-*.tar.gz' to list Google supplied options
HADOOP_TARBALL_URI='gs://hadoop-dist/hadoop-1.2.1-bin.tar.gz'
и измените URI, указывающий на URI, где мы сохранили архив выше: например,
HADOOP_TARBALL_URI='gs://<some bucket>/hadoop-1.2.1.tar.gz'