Выполнение задания Sqoop на YARN с использованием Oozie

#hadoop-yarn #sqoop #oozie #hue

#hadoop-yarn #sqoop #oozie #оттенок

Вопрос:

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

Я хочу запустить простой оператор 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/ dir. Я создал рабочий процесс 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. Когда диспетчер ресурсов решил, что узел 1 (у которого есть файл параметров в локальной файловой системе) должен выполнить задание, все в порядке. Но когда RM решил, что один из других 3 узлов должен выполнить задание Sqoop, это не удалось.

Для меня это большая проблема, потому что я не хочу загружать файл параметров на каждый узел (потому что, если у меня будет 1000 узлов?). Итак, мой вопрос — есть ли какой-нибудь способ сообщить менеджеру ресурсов, какой узел он должен использовать?

Ответ №1:

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

 <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>
  

Также прочитайте это:

Элементы file , archive делают доступными для сопоставления заданий, файлов и архивов. Если указанный путь является относительным, предполагается, что файл или архиватор находятся в каталоге приложения в соответствующем вложенном пути. Если путь является абсолютным, файл или архив, который он ожидает, находится по заданному абсолютному пути.

Файлы, указанные с помощью элемента file, будут символическими ссылками в домашнем каталоге задачи.

Итак, в простейшем случае вы помещаете свой файл 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 на этот узел, и вы сможете ссылаться на него как на локальный файл.

Ответ №2:

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

Комментарии:

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