Sqoop 通过 bash 工作,但不能通过 oozie 工作

Sqoop works through bash, but doesn't work through oozie

我有一个shell脚本

  sqoop import \
  -Dmapreduce.job.queuename=adhoc \
  --connect jdbc:oracle:thin:secret@//secret \
  --query "a select"  \
  --target-dir /apps/hive/warehouse/data.db/fair_usage \
  --delete-target-dir \
  -m 1 \
  --fields-terminated-by '\t' 

当我将它放入 sh 文件并 运行 它时它起作用了。但是当我尝试 运行 作为 oozie 操作时,它失败了。我尝试同时使用 bash 操作和 sqoop 操作。这是 Sqoop 动作。我还尝试了 运行ning sqoop with <command>import....</command> 标签。

  <action name="export_table" cred="hv_cred">
    <sqoop xmlns="uri:oozie:sqoop-action:0.2">
      <job-tracker>${JOB_TRACKER}</job-tracker>
      <name-node>${NAME_NODE}</name-node>
      <configuration>
        <property>
          <name>mapred.task.timeout</name>
          <value>600000</value>
        </property>
      </configuration>
        <arg>import</arg>
        <arg>-Dmapreduce.job.queuename=adhoc</arg>
        <arg>--connect</arg>
        <arg>jdbc:oracle:thin:secret@//secret</arg>
        <arg>--query</arg>
        <arg>"a select"</arg>
        <arg>--target-dir</arg>
        <arg>/apps/hive/warehouse/data.db/fair_usage</arg>
        <arg>--delete-target-dir</arg>
        <arg>-m</arg>
        <arg>1</arg>
        <arg>--fields-terminated-by</arg>
        <arg>'\t'</arg>
    </sqoop>
    <ok to="END"/>
    <error to="KILL"/>
  </action>

我得到的错误是 bash 的 Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 和 sqoop 的 [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]

Wich 什么也没告诉我。当我查看日志时,我找不到任何有用的东西。 Stderr 只有 30 行而且没有错误。系统日志更长,但也没有错误。

一段时间后出现新内容

Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143

编辑

我尝试 运行通过 shell 操作 again.It 运行脚本。 sh 没有改变,所以我可能在 wirkflow 文件中犯了一个错误。我没有保存它的旧版本,所以不能说那个错误是什么。

Shell 动作

  <action name='export_table'>
    <shell xmlns="uri:oozie:shell-action:0.1">
      <job-tracker>${JOB_TRACKER}</job-tracker>
      <name-node>${NAME_NODE}</name-node>
      <configuration>
        <property>
          <name>mapred.job.queue.name</name>
          <value>${QUEUE_NAME}</value>
        </property>
      </configuration>
      <exec>bash/export_table.sh</exec>
      <file>bash/export_table.sh#export_table.sh</file>
    </shell>
    <ok to="END"/>
    <error to="KILL"/>
  </action>

仍然不知道为什么 sqoop 操作不起作用 =/

编辑2

几个月过去了,我收回了我的话。他妈的咕噜咕噜。同样的错误。

bash 中的引号不作为参数文字传递

<arg>a select</arg>
...
<arg>\t</arg>

编辑:打开文档后https://oozie.apache.org/docs/4.0.0/DG_SqoopActionExtension.html

第一个参数可能是命令而不是第一个 <arg>

 <command>import</command>

问题与工作流或 sqoop 脚本本身无关,而是一些我不知道的内部机制。可能缺少库?

当我在终端中运行脚本时,会生成一个java class。这个class好像描述了hivetable是如何解析成oracletable或者smth的。当我启动 oozie 时,我需要将这个自动生成的文件添加到根目录(具有协调器和工作流的目录)。如果我不 oozie 失败。该死的东西甚至不会给出任何错误(

无论如何,在将 java class 添加到 root 之后,我可以从 shell 操作中 运行 sqoop。 Sqoop 操作仍然不起作用。我注意到的另一件事是,如果我在 sqoop 中使用

,shell 操作将执行
--export-dir /apps/hive/warehouse/db.db/table/

但如果我尝试

--hcatalog-database db \
--hcatalog-table table \

在shell中,无论如何都会失败。它可能会尝试将一些库添加到 class 路径,但不能或不成功。