Как заставить Hadoop находить импортированные модули Python при использовании пользовательских функций Python в Pig? - PullRequest
7 голосов
/ 20 октября 2011

Я использую Pig (0.9.1) с UDF, написанными на Python. Скрипты Python импортируют модули из стандартной библиотеки Python. Мне удалось запустить сценарии Pig, которые успешно вызывают пользовательские функции Python в локальном режиме, но при запуске в кластере кажется, что сгенерированное задание Pig Hadoop не может найти импортированные модули. Что нужно сделать?

Например:

  • Нужно ли устанавливать python (или jython) на каждом узле отслеживания задач?
  • Нужно ли устанавливать модули python (или jython) на каждом узле отслеживания задач?
  • Нужно ли узлам трекера задач знать, как найти модули?
  • Если так, как вы указываете путь (через переменную окружения - как это делается для трекера задач)?

Ответы [ 3 ]

6 голосов
/ 20 октября 2011

Нужно ли устанавливать python (или jython) на каждом трекере задач? узел

Да, поскольку он выполняется в трекерах задач.

Нужно ли устанавливать модули python (или jython) на каждую задачу? узел трекера?

Если вы используете сторонний модуль, он также должен быть установлен в трекерах (например, geoip и т. Д.).

Нужно ли узлам трекера задач знать, как найти модули? Если да, то как вы указываете путь (через переменную среды - как это сделано для трекера задач)?

Как ответ из книги « Программирование Свинья »:

регистр также используется для поиска ресурсов для пользовательских функций Python, которые вы используете в ваших свиньях латиницей. В этом случае вы не регистрируете банку, но скорее сценарий Python, который содержит ваш UDF. Сценарий Python должен быть в вашем текущем каталоге.

А также это важно:

Предостережение: Pig не отслеживает зависимости внутри ваших скриптов Python и отправьте необходимые модули Python в ваш кластер Hadoop. Вы необходимо убедиться, что необходимые вам модули находятся на узлах задач в ваш кластер и что переменная окружения PYTHONPATH установлена ​​на эти узлы, так что ваши UDF смогут найти их для импорта. Эта проблема была исправлена ​​после 0.9, но на момент написания этой статьи еще не освобожден.

А если вы используете Jython:

Свинья не знает, где в вашей системе находится интерпретатор Jython, поэтому вы должны включить jython.jar в ваш classpath при вызове Pig. это это можно сделать, установив переменную окружения PIG_CLASSPATH.

В итоге, если вы используете потоковую передачу, вы можете использовать команду "SHIP" в pig, которая отправит ваши исполняемые файлы в кластер. если вы используете UDF, если он может быть скомпилирован (см. примечание о jython) и в нем нет сторонней зависимости (которую вы еще не поместили в PYTHONPATH / или не установили в кластер), UDF будет быть отправлены в кластер при исполнении. (В качестве подсказки было бы намного проще, если бы при регистрации вы помещали простые зависимости UDF в одну папку со сценарием pig)

Надеюсь, это прояснит ситуацию.

2 голосов
/ 18 августа 2014

Добавление

pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig

Работает.Обратите внимание, что вы также можете добавить следующие строки в ваш скрипт Python:

import sys
sys.path.append('./Lib')

Также обратите внимание, что вы все еще будете получать многочисленные предупреждения «модуль не найден», но исправление работает.Тот факт, что вы получаете эти предупреждения, несмотря на то, что модули на самом деле обнаружены, в конце концов, невероятно сбивает меня с толку, и я всегда убивал задание hadoop до того, как оно вернулось корректно, полагая, что это является признаком того, что исправление фактически не работает ...

1 голос
/ 03 июля 2014

Я столкнулся с той же проблемой, используя Hadoop 1.2.1 и Pig 0.11.1, и нашел обходной путь от PIG-2433 , который должен был добавить -Dmapred.child.env="JYTHONPATH=job.jar/Lib" к моим аргументам Pig. Пример:

pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig
...