#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, но диспетчер ресурсов запускает задание на каждом узле.