Oozie shell 操作 - 运行 sqoop 命令并需要记录详细信息

Oozie shell action - running sqoop command and need logging details

我正在使用 Oozie、shell action 和 sqoop。

我正在使用 oozie 运行 许多 sqoop 命令。我设置了一个 shell 操作,在那个 shell 中我放置了许多 sqoop 命令。现在,shell 动作正在被触发,甚至 sqoop 也在发生。

但是,sqoop 没有正确的日志记录。所以我将 sqoop 命令重定向到日志文件。我只看到以下几行。

我的代码如下。在 shell 脚本中:

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

捕获的日志详细信息:

Warning: /opt/cloudera/parcels/CDH-5.4.2-1.cdh5.4.2.p0.2/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation.

如何在 Oozie 中使用 shell 操作获取 sqoop 日志?我需要详细信息,例如有多少条记录 loaded/pulled,以及当我们在控制台上执行 运行 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/node@.COM')]}, u'hive2': {'xml_name': u'hive2', 'properties': [('hive2.jdbc.url', 'jdbc:hive2://node.jnj.com:10000/default'), ('hive2.server.principal', 'hive/itsusraedld01.jnj.com@.COM')]}, 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*

您有一个参数提示 Log4J 应该使用特定的属性文件,但没有指示 Sqoop 使用它(命令行上没有 -Dlog4j.configuration=...file name without path...)。

好的,让我们假设这是故意的(?);问题是

  • Log4J 搜索带有 default 名称的属性文件,即 log4j.properties
  • 搜索在 CLASSPATH 中的目录中完成,在第一次匹配时停止
  • Oozie 的默认 CLASSPATH shell 是 Hadoop JAR,然后是 Hadoop conf 目录,然后是当前工作目录 (所有 <file> 依赖项与 Oozie JAR 一起转储的地方) 和所有这些 app/Oozie JAR
  • log4j.properties 的第一个匹配恰好是 Log4J 无法打开的文件
  • 因此 Log4J 不会在任何地方记录任何内容 (?????????)

可能的解决方法是

  1. 创建自定义 log4j.properties -- cf. that post 中的第一个示例记录任何标记为 INFO 及以上的内容 (即 INFO、WARN、ERROR 但不是 DEBUG) 到 StdOut
  2. 将该文件上传到某个地方的 HDFS,然后告诉 Oozie Action 使用 <file> 元素将其下载到容器
  3. 告诉 Oozie Action 请求它的 CLASSPATH 从当前工作目录开始,通过设置 属性 例如 oozie.launcher.mapreduce.task.classpath.firsttrue (实际 属性 可能取决于您的 Hadoop 版本,请参阅 that post and that JIRA)

请注意,第 3 步是必要的,因为默认名称出现在 CLASSPATH 的其他地方;如果 Sqoop 被指示使用具有不同名称的不同文件,那么就不会有歧义。