【问题标题】:Oozie shell action - running sqoop command and need logging detailsOozie shell 操作 - 运行 sqoop 命令并需要日志记录详细信息
【发布时间】:2016-01-12 15:05:37
【问题描述】:

我正在使用 Oozie、shell 动作和 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
*

捕获的日志详细信息:

警告:/opt/cloudera/parcels/CDH-5.4.2-1.cdh5.4.2.p0.2/bin/../lib/sqoop/../accumulo 不存在! Accumulo 导入将失败。 请将 $ACCUMULO_HOME 设置为 Accumulo 安装的根目录。

如何在 Oozie 中使用 shell 操作获取 sqoop 日志?我需要详细信息,例如加载/提取了多少记录,以及我们在控制台上运行 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*

【问题讨论】:

  • >>1>> 的缩写,意思是“将流#1(STDOUT)重定向到文件”,但大多数日志来自流#2(STDERR)......因此您需要1>> wtf/duh.log 2>> wtf/duh.log
  • 顺便说一句,如果您不重定向 STDERR,它将显示在 YARN 日志中 -cf. stackoverflow.com/questions/34344114/…
  • 谢谢 Samson.i 确实得到了 std err - 但是,这里的问题是 - 我在 shell 中使用 sqoop,它没有显示 sqoop 日志,它向我显示了这个日志 - log4j:ERROR 不能从 URL [file:/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 (Permission denied) 如何获取使用 shell log/stderr 生成的 sqoop 日志
  • 您的代码块以星号 (*) 开头和结尾。它们实际上是每种情况下代码的一部分吗?

标签: hadoop workflow hdfs oozie sqoop


【解决方案1】:

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

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

  • Lo​​g4J 搜索带有 default 名称的属性文件,即log4j.properties
  • 在 CLASSPATH 中存在的目录中完成搜索,在第一次匹配时停止
  • Oozie shell 的默认 CLASSPATH 是 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 和 @ 987654323@)

请注意,第 3 步是必需的,因为默认名称存在于 CLASSPATH 中的其他位置;如果 Sqoop 被指示使用具有不同名称的不同文件,则不会有歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多