2012-01-12 6 views
2

Я ищу «правильный» способ написать код на Python, который может работать с выводами заданий Pig.Связывание с PIG STORE или DUMP вывода в Python

Вот моя ситуация. Я написал сценарий Свиньи, чтобы хрустить большой объем данных и выводить небольшой набор отношений. Объем выходных данных достаточно мал, чтобы напрямую подключаться к консоли DUMPed. Например:

grunt> DUMP results 
(Control, column1, column2, column3, column4, column5, column6) 
(Treatment1, column1, column2, column3, column4, column5, column6) 
(Treatment2, column1, column2, column3, column4, column5, column6) 
(Treatment3, column1, column2, column3, column4, column5, column6) 
grunt> 

В качестве следующего шага, я хочу сделать некоторое количество хрустов на числах по отношениям, например. вычисление p-валов для значимости результатов наблюдения. Я бы очень хотел использовать Python для этого: сам Pig явно не предназначен для такого рода задач, и я бы предпочел не переписывать существующий код на Java. Так что я хотел бы сделать, так это привязать к выводам команды STORE или DUMP из python и продолжить с этим. Моя проблема заключается в том, чтобы найти лучший способ продвижения вперед. Вот как я могу видеть:

  1. Используйте Python для написания UDF, который будет выполнять расчет. Я могу сделать это; на самом деле мой скрипт Pig уже вызывает пару UDF Python. Однако у меня сложилось впечатление, что UDF предназначены для работы над одним отношением/линией ввода за раз, и мне нужно получить данные из нескольких отношений для достижения моей цели. Я могу взломать какое-то хранилище состояний в UDF между вызовами, но это не похоже на правильное решение.
  2. Использование встроенного Python через Jython в Pig 0.9.1. Я возлагал большие надежды на этот подход, но из ограниченной документации, которую я нашел в этой функции, она, по-видимому, предназначена главным образом для управления потоком работы (канонический пример - обнаружение конвергенции в взаимных алгоритмах), а не для непосредственного взаимодействия с выходами. В частности, я вижу документацию о том, как привязываться к метаданным задания, например, было ли это успешным или неудачным, но не как привязываться к выводам. Хотелось бы ошибиться в этом.
  3. Попросите сценарий Python вызвать Pig и передать ему локальные или HDFS-пути желаемых локаций вывода, завершение задания завершения, а затем использование Python для чтения/разделения отношений с этими путями. Кажется, действительно взломан.

Есть ли очевидный вариант, который у меня отсутствует, или большой пробел в моем понимании вышеуказанных вариантов? Ваш отзыв будет очень приветствуем!

+0

Я не знаю, как это сделать с свинью, но mrjob yelp - это именно то, что вы просите на # 3 в потоке хаопов. возможно, так же возможно использовать свиньи. Google показывает несколько результатов людей, просящих только об этом. Однако пример шахтера Дональда кажется мне более простым. – BenH

ответ

3

Я понимаю ваше разочарование из личного опыта. # 3 на самом деле очень разумный подход, однако я предлагаю что-то немного другое. Вместо этого используйте оболочку сценария bash для выполнения обоих. У этого есть хорошая функция, которой вам не придется выполнять все неудобные вызовы оболочки через python.

Что-то вроде:

pig mypigscript.pig ... 
mkdir /tmp/pigout/ 
hadoop fs -get output/part* /tmp/pigout/ 
cat /tmp/pigout/* | python mypostprocessing.py 

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

Просто, чтобы убедить вас, что это правильный подход - вы не хотите, чтобы этот небольшой бит обработки нескольких записей в редукторе. Это не работает, если у вас есть несколько редукторов и на самом деле ничего не дает вам, потому что вы не используете параллелизм. Я думаю, что люди склонны пытаться объединить слишком много своих вычислений в Hadoop и не делать некоторые из простых очевидных вещей снаружи.

+0

Благодарим вас за проницательный ответ.Я полностью осознаю глупость в обработке мелкой рыбы в редукторах Hadoop вместо того, чтобы вывести результаты в более общую вычислительную среду. Я надеялся найти более разумный способ взаимодействия этих двух; как вы указываете # 3, вероятно, лучший, хотя и далеко не идеальный. Благодарим вас за предложение обернуть скрипт оболочки вокруг двух - это хорошая идея и упростит и понятнее. – Inverseofverse