Действие оболочки Oozie — запуск команды sqoop и необходимость ведения журнала

Я работаю с Oozie, shell action и sqoop.

Я использую oozie для запуска многих команд sqoop. Я настроил действие оболочки, и в этой оболочке я разместил много команд sqoop. Теперь запускается действие оболочки, и даже происходит sqoop.

Однако для sqoop нет надлежащего ведения журнала. Итак, у меня была команда sqoop, перенаправленная в файл журнала. Там я вижу только следующие строки.

Мой код выглядит следующим образом. Внутри сценария оболочки:

*
sqoop import  --connect jdbc:mysql://server:3306/test --verbose  --username root --password Password    --append --table People  --m 1 --hive-drop-import-delims  --target-dir  /user/username/20/  --delete-target-dir  >> /tmp/log
*

Полученные данные журнала:

Предупреждение: /opt/cloudera/parcels/CDH-5.4.2-1.cdh5.4.2.p0.2/bin/../lib/sqoop/../accumulo не существует! Импорт Accumulo не удастся. Установите $ACCUMULO_HOME в корень вашей установки Accumulo.

Как я могу получить журналы sqoop, используя действие оболочки в Oozie? Мне нужны такие подробности, как количество загруженных/извлекаемых записей и обычное ведение журнала, которое происходит, когда мы запускаем команду sqoop на консоли.

Пожалуйста, найдите ниже мой файл jobproperties.xml:

*oozie.use.system.libpath=True
credentials={u'hcat': {'xml_name': u'hcat', 'properties': [('hcat.metastore.uri', u'thrift://node:9083'), ('hcat.metastore.principal', u'hive/[email protected]')]}, u'hive2': {'xml_name': u'hive2', 'properties': [('hive2.jdbc.url', 'jdbc:hive2://node.jnj.com:10000/default'), ('hive2.server.principal', 'hive/[email protected]')]}, u'hbase': {'xml_name': u'hbase', 'properties': []}}
nameNode=hdfs://nameservice1
jobTracker=yarnRM
oozie.sqoop.log.level=DEBUG
log4jConfig=debug-log.properties
 oozie.libpath=/user/oozie/share/lib*

person akash sharma    schedule 12.01.2016    source источник
comment
>> является сокращением от 1>>, что означает перенаправление потока №1 (STDOUT) в файл, но большинство журналов поступают из потока №2 (STDERR)... поэтому вам нужно 1>> wtf/duh.log 2>> wtf/duh.log   -  person Samson Scharfrichter    schedule 12.01.2016
comment
Кстати, если вы не перенаправляете STDERR, это будет отображаться в журналах YARN -cf. stackoverflow.com/questions/34344114/   -  person Samson Scharfrichter    schedule 12.01.2016
comment
Спасибо, Samson.i действительно получил стандартную ошибку, однако проблема в том, что я использую sqoop в оболочке, он не показывает журнал sqoop, он показывает мне этот журнал - log4j: ERROR Не удалось прочитать файл конфигурации из URL [файл: /var/run/cloudera-scm-agent/process/8217-yarn-NODEMANAGER/log4j.properties]. java.io.FileNotFoundException: /var/run/cloudera-scm-agent/process/8217-yarn-NODEMANAGER/log4j.properties (отказано в доступе) как получить журнал sqoop, сгенерированный с помощью журнала оболочки/stderr   -  person akash sharma    schedule 13.01.2016
comment
Блоки вашего кода начинаются и заканчиваются звездочкой (*). Являются ли они частью кода в каждом случае?   -  person halfer    schedule 27.02.2019


Ответы (1)


У вас есть параметр, намекающий на то, что Log4J должен использовать определенный файл свойств, но Sqoop не указан его использовать (нет -Dlog4j.configuration=...file name without path... в командной строке).

Хорошо, предположим, что это сделано намеренно (?); проблема в том, что

  • Log4J ищет файл свойств с именем по умолчанию, т. е. log4j.properties
  • поиск выполняется в каталогах, представленных в CLASSPATH, останавливаясь на первом совпадении
  • ПУТЬ К КЛАССУ по умолчанию для оболочки Oozie — это JAR-файлы Hadoop, затем каталог конфигурации Hadoop, затем текущий рабочий каталог (место, где выгружаются все <file> зависимости вместе с JAR-файлами Oozie) и все эти JAR-файлы app/Oozie
  • первое совпадение для log4j.properties оказывается файлом, который Log4J не может открыть
  • таким образом, Log4J ничего нигде не регистрирует (????????)

Возможный обходной путь будет

  1. создать пользовательский log4j.properties -- ср. 1-й пример в этот пост для регистрации всего, что помечено INFO и выше < em>(т.е. INFO, WARN, ERROR, но не DEBUG) в StdOut
  2. загрузите этот файл куда-нибудь в HDFS, затем скажите Oozie Action загрузить его в контейнер с элементом <file>
  3. скажите действию Oozie запросить, чтобы его ПУТЬ К КЛАССУ начинался с текущего рабочего каталога, установив свойство, такое как oozie.launcher.mapreduce.task.classpath.first, на true (фактическое свойство может зависеть от вашей версии Hadoop, см. это сообщение и что JIRA)

Обратите внимание, что шаг 3 необходим только потому, что имя по умолчанию присутствует в другом месте CLASSPATH; если бы Sqoop было приказано использовать другой файл с другим именем, двусмысленности не было бы.

person Samson Scharfrichter    schedule 13.01.2016