2016-10-12 11 views
0

У меня проблема с запуском работы Sqoop на YARN в Oozie с использованием Hue. Я хочу загрузить таблицу из базы данных Oracle и загрузить эту таблицу в HDFS. У меня многоядерный кластер состоит из 4 узлов.Запуск работы Sqoop на YARN с использованием Oozie

Я хочу запустить простой Sqoop заявление:

import --options-file /tmp/oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1 

Файл опций находится на локальной системе на номер узла 1. Другие узлы имеют опции не файл в/TMP/реж. Я создал Oozie рабочий процесс с Sqoop работы и попытался запустить его, но я получил сообщение об ошибке:

3432 [main] ERROR org.apache.sqoop.Sqoop - Error while expanding arguments 
java.lang.Exception: Unable to read options file: /tmp/oracle_dos.txt 

самое странное в том, что работа иногда нормально, но иногда выходит из строя. Файл журнала дал мне ответ, почему - Oozie запускает задания Sqoop на YARN.

Менеджер ресурсов (который является компонентом YARN) решает, какой узел выполнит задание Sqoop. Когда Resource Manager решил, что Node 1 (который имеет файл параметров в локальной файловой системе) должен выполнить задание, все в порядке. Но когда RM решило, что один из других 3-х узлов должен выполнить Sqoop-задание, он потерпел неудачу.

Это большая проблема для меня, потому что я не хочу загружать файлы параметров на каждом узле (потому что, если у меня будет 1000 узлов?). Поэтому мой вопрос: есть ли способ сообщить Resource Manager, какой узел он должен использовать?

ответ

1

Вы можете сделать заказ файла для вас oozie действия на узле, это может быть сделано с помощью <file> тега в вашем sqoop действии, посмотрите на эту syntax:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1"> 
    ... 
    <action name="[NODE-NAME]"> 
     <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
      <job-tracker>[JOB-TRACKER]</job-tracker> 
      <name-node>[NAME-NODE]</name-node> 
      <prepare> 
       <delete path="[PATH]"/> 
       ... 
       <mkdir path="[PATH]"/> 
       ... 
      </prepare> 
      <configuration> 
       <property> 
        <name>[PROPERTY-NAME]</name> 
        <value>[PROPERTY-VALUE]</value> 
       </property> 
       ... 
      </configuration> 
      <command>[SQOOP-COMMAND]</command> 
      <arg>[SQOOP-ARGUMENT]</arg> 
      ... 
      <file>[FILE-PATH]</file> 
      ... 
      <archive>[FILE-PATH]</archive> 
      ... 
     </sqoop> 
     <ok to="[NODE-NAME]"/> 
     <error to="[NODE-NAME]"/> 
    </action> 
    ... 
</workflow-app> 

Читайте также this:

The file , archive elements make available, to map-reduce jobs, files and archives. If the specified path is relative, it is assumed the file or archiver are within the application directory, in the corresponding sub-path. If the path is absolute, the file or archive it is expected in the given absolute path.

Files specified with the file element, will be symbolic links in the home directory of the task.

...

Таким образом, в простейшем случае вы кладете файл oracle_dos.txt в каталоге рабочего процесса, добавить элемент oracle_dos.txt в workflow.xml и изменить прикажете к чему-то вроде этого:

import --options-file ./oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1 

В этом случае все-таки ваше sqoop действие выполняется на некотором произвольно выбранных узлов в кластере, oozie скопирует oracle_dos.txt к этому узлу, и вы можете обратиться к нему как к локальному файлу.

+0

Вы правы. Спасибо :) –

0

Возможно, речь идет о разрешениях на файлы. Попробуйте поместить этот файл в/home/{user}.

+0

Речь идет не о разрешении файла. Файл параметров временно находится в папке/tmp /, а chmod - 777. Проблема заключается в том, что файл не находится на каждом узле, но только на узле 1, но диспетчер ресурсов запускает задание на каждом узле. –

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

  • Нет связанных вопросов^_^