Как вы используете пользовательские функции Python с Pig в Elastic MapReduce? - PullRequest
4 голосов
/ 16 февраля 2012

Я действительно хочу воспользоваться преимуществами Python UDF в Pig в нашем кластере AWS Elastic MapReduce, но я не могу заставить все работать должным образом.Вне зависимости от того, что я пытаюсь сделать, мое задание свинины завершается с ошибкой, регистрируемой в журнале:

Ответы [ 4 ]

4 голосов
/ 13 декабря 2012

Хм ... чтобы пояснить кое-что из того, что я только что прочитал здесь, на данный момент, используя UDF Python в Pig, работающем на EMR, хранящемся на s3, это так же просто, как эта строка в вашем скрипте pig:Зарегистрируйте 's3: //path/to/bucket/udfs.py', используя jython в качестве mynamespace

То есть не требуется никаких модификаций classpath.Я использую это в производстве прямо сейчас, хотя с оговоркой, что я не добавляю никаких дополнительных модулей python в свой udf.Я думаю, что это может повлиять на то, что вам нужно сделать, чтобы это заработало.

2 голосов
/ 16 февраля 2012

После нескольких неправильных поворотов я обнаружил, что, по крайней мере, на карте упругости, уменьшающей реализацию Hadoop, Pig, похоже, игнорирует переменную среды CLASSPATH.Вместо этого я обнаружил, что могу управлять путем к классу, используя вместо этого переменную HADOOP_CLASSPATH.

После того, как я это реализовал, было довольно легко настроить вещи для использования Python UDFS:

  • Установите Jython
    • sudo apt-get install jython -y -qq
  • Установите переменную среды HADOOP_CLASSPATH.
    • export HADOOP_CLASSPATH=/usr/share/java/jython.jar:/usr/share/maven-repo/org/antlr/antlr-runtime/3.2/antlr-runtime-3.2.jar
      • jython.jar гарантирует, что Hadoop может найти класс PyException
      • antlr-runtime-3.2.jar гарантирует, что Hadoop может найти класс CharStream
  • Создайте каталог кэша для Jython (это описано в FAQ по Jython )
    • sudo mkdir /usr/share/java/cachedir/
    • sudo chmod a+rw /usr/share/java/cachedir

Я должен отметить, что это напрямую противоречит другим советам, которые я нашел при поиске решений этой проблемы:

  • Установка переменных среды CLASSPATH и PIG_CLASSPATH, похоже, ничего не делает.
  • Файл .py, содержащий UDF, не требуется включать в переменную среды HADOOP_CLASSPATH.
  • Путь кФайл .py, используемый в выражении Pig register, может быть относительным или абсолютным, это не имеет значения.
0 голосов
/ 05 апреля 2012

На сегодняшний день, используя Pig 0.9.1 на EMR, я обнаружил, что достаточно:

env HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/to/jython.jar pig -f script.pig

, где script.pig делает регистр скрипта Python, но не jython.jar:

register Pig-UDFs/udfs.py using jython as mynamespace;
0 голосов
/ 17 февраля 2012

Я недавно столкнулся с той же проблемой.Ваш ответ может быть упрощен.Вам вообще не нужно устанавливать jython или создавать каталог кеша.Вам необходимо включить jython jar в скрипт начальной загрузки EMR (или сделать что-то подобное).Я написал сценарий начальной загрузки EMR со следующими строками.Можно еще больше упростить это, вообще не используя s3cmd, а используя поток работ (чтобы поместить файлы в определенный каталог).Получение UDF через s3cmd определенно неудобно, однако я не смог зарегистрировать файл udf на s3 при использовании EMR-версии pig.

Если вы используете CharStream, вы должны также включить этот jar вСвинья путь.В зависимости от используемой вами среды, вы можете передать эти сценарии начальной загрузки в качестве опций для своей работы, EMR поддерживает это через их Ruby-клиент эластичный-mapreduce.Простым вариантом является размещение сценариев начальной загрузки на s3.

Если вы используете s3cmd в скрипте начальной загрузки, вам нужен еще один скрипт начальной загрузки, который делает что-то подобное.Этот скрипт должен быть помещен перед другим в порядке начальной загрузки.Я отошел от использования s3cmd, но для моей успешной попытки s3cmd добился цели.Кроме того, исполняемый файл s3cmd уже установлен в образе pig для amazon (например, ami версии 2.0 и hadoop версии 0.20.205.

Script # 1 (Seeding s3cmd)

#!/bin/bash
cat <<-OUTPUT > /home/hadoop/.s3cfg
[default]
access_key = YOUR KEY
bucket_location = US
cloudfront_host = cloudfront.amazonaws.com
cloudfront_resource = /2010-07-15/distribution
default_mime_type = binary/octet-stream
delete_removed = False
dry_run = False
encoding = UTF-8
encrypt = False
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/local/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %  (passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = YOUR PASSPHRASE
guess_mime_type = True
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
human_readable_sizes = False
list_md5 = False
log_target_prefix =
preserve_attrs = True
progress_meter = True
proxy_host =
proxy_port = 0
recursive = False
recv_chunk = 4096
reduced_redundancy = False
secret_key = YOUR SECRET
send_chunk = 4096
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 10
urlencoding_mode = normal
use_https = False
verbosity = WARNING
OUTPUT

Script #2 (посевные банки jython)

#!/bin/bash
set -e

s3cmd get <jython.jar>
# Very useful for extra libraries not available in the jython jar. I got these libraries from the 
# jython site and created a jar archive.
s3cmd get <jython_extra_libs.jar>
s3cmd get <UDF>

PIG_LIB_PATH=/home/hadoop/piglibs

mkdir -p $PIG_LIB_PATH

mv <jython.jar> $PIG_LIB_PATH
mv <jython_extra_libs.jar> $PIG_LIB_PATH
mv <UDF> $PIG_LIB_PATH

# Change hadoop classpath as well.
echo "HADOOP_CLASSPATH=$PIG_LIB_PATH/<jython.jar>:$PIG_LIB_PATH/<jython_extra_libs.jar>" >>    /home/hadoop/conf/hadoop-user-env.sh
...