2016-04-25 1 views
1

У меня есть два файла python - my_python_A.py и my_python_B.py. Первый файл ссылается на второй (from my_python_B import *).Как импортировать локальный модуль python при запуске скрипта python в Oozie?

Я выполнения первого файла питона от действия оболочки в Oozie (т.е. сценарий просто python my_python_A.py), и я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "my_python_A.py", line 2, in <module> 
    from my_python_B import * 
ImportError: No module named my_python_B 
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 

Оба питона файлы находятся в одной папке в HDFS. Как я могу заставить этот оператор импорта работать?

+0

Обычно интерпретатор выглядит сначала в 'текущей директории', затем в вашей' shell', а затем в вашей 'default PATH'. Какую среду вы используете? И являются ли эти файлы частью одного проекта? Если это так, возможно, вам лучше использовать файл '__init__' – jmugz3

+0

@ jmugz3 - не уверен, что это так же актуально при работе в кластере, поскольку все файлы хранятся в распределенной системе (то есть HDFS). – John

+0

Gotcha. Я не знаком с Oozie, но похоже, что ваш интерпретатор не распознает ваш модуль, поэтому вы можете попытаться добавить свой рабочий каталог в свой путь к оболочке. – jmugz3

ответ

6

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

export PYTHONPATH=`pwd` 
python m_python_A.py 

Убедитесь, что в ваше действие оболочки включает все необходимые модули python внутри тегов <file></file>. Если предположить, что у вас есть сценарий оболочки под названием sample_script.sh (внутри которого есть вышеупомянутые команды) файл workflow.xml должен выглядеть примерно так

<workflow-app name="shellTest" xmlns="uri:oozie:workflow:0.4"> 
    <start to="shell-action"/> 
    <action name="shell-action"> 
     <shell xmlns="uri:oozie:shell-action:0.2"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <configuration>     
       <property> 
        <name>oozie.launcher.mapred.job.queue.name</name> 
        <value>${launcherqueue}</value> 
       </property> 
       <property> 
        <name>mapred.job.queue.name</name> 
        <value>${mapredqueue}</value> 
       </property> 
      </configuration> 
      <exec>sample_script.sh</exec> 
      <file>${appPath}/sample_script.sh#sample_script.sh</file> 
      <file>${appPath}/m_python_A.py#m_python_A.py</file> 
      <file>${appPath}/m_python_B.py#m_python_B.py</file> 
      <capture-output/> 
     </shell> 
     <ok to="end"/> 
     <error to="shell-action-failed"/> 
    </action> 

    <kill name="shell-action-failed"> 
     <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 

    <end name="end" /> 

</workflow-app> 
+0

Что такое '$ {appPath}' в вашем примере? – Milimetric

+0

$ {appPath} - это путь к папке на hdfs, внутри которой лежат ваши скрипты. –

0

Как насчет добавить

sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 

в вашем m_python_A.py для доступа ко всему, что хранится в (IE) lib /?

Смежные вопросы