У меня есть работа MapReduce, определенная в main.py
, который импортирует lib
модуля из lib.py
. Я использую Hadoop Streaming представить эту работу в кластер Hadoop следующим образом:Как импортировать пользовательский модуль в задание MapReduce?
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files lib.py,main.py
-mapper "./main.py map" -reducer "./main.py reduce"
-input input -output output
В моем понимании, это должно поместить как main.py
и lib.py
в распределенной папкукэша на каждой вычислительной машине и, таким образом, сделать модуль lib
доступны до main
. Но этого не происходит: из журнала я вижу, что файлы действительно скопированы в тот же каталог, но main
не может импортировать lib
, метать ImportError
.
Почему это происходит и как я могу это исправить?
UPD. Добавление текущего каталога в пути не работал:
import sys
sys.path.append(os.path.realpath(__file__))
import lib
# ImportError
хотя, загружая модуль вручную сделал трюк:
import imp
lib = imp.load_source('lib', 'lib.py')
Но это не то, что я хочу. Итак, почему интерпретатор Python видит другие файлы .py
в том же каталоге, но не может их импортировать? Обратите внимание, что я уже пытался добавить пустой файл __init__.py
в тот же каталог без эффекта.
Вы проверили 'sys.path' в' main.py', чтобы убедиться, что рабочий каталог включен? – lmjohns3
@ lmjohns3: да, рабочий каталог находится на пути к классам. BTW, разве он не включен автоматически для запуска скрипта? (просто любопытно) – ffriend
Я считаю, что это верно для скриптов Python, запущенных в командной строке, но потоковая передача Hadoop может запускать интерпретатор Python по-другому (не совсем уверен). В любом случае, я все еще думаю, что это звучит как проблема пути. См. Http://www.litfuel.net/plush/?postid=195 за одну возможность распространять свои модули по-другому. В качестве альтернативы попробуйте написать свои команды в сценарий оболочки и передать это для аргументов командной строки '-mapper' и' -reducer'. – lmjohns3