1

我可以在脚本中编写一个 sqoop 导入命令并在 oozie 作为协调器工作流中执行它吗?

我已经厌倦了这样做,发现一个错误说找不到 sqoop 命令,即使我给出了 sqoop 执行的绝对路径

script.sh 如下

sqoop import --connect 'jdbc:sqlserver://xx.xx.xx.xx' -username=sa -password -table materials --fields-terminated-by '^' -- --schema dbo -target-dir /user/hadoop/CFFC/oozie_materials

我已将文件放在 HDFS 中,并为 oozie 提供了路径。工作流程如下:

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
<start to='shell1' />
<action name='shell1'>
    <shell xmlns="uri:oozie:shell-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
              <name>mapred.job.queue.name</name>
              <value>${queueName}</value>
            </property>
        </configuration>
        <exec>script.sh</exec>
        <file>script.sh#script.sh</file>
    </shell>
    <ok to="end" />
    <error to="fail" />
</action>
<kill name="fail">
    <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name='end' />

oozie 返回错误,因为在 mapreduce 日志中找不到 sqoop 命令。

这是一个好习惯吗?

谢谢

4

2 回答 2

0

如您所见,shell 操作将作为映射器任务运行。sqoop 命令需要存在于运行映射器的每个数据节点上。如果您确保 sqoop 命令行存在并且对提交作业的用户具有适当的权限,那么它应该可以工作。

验证的方法可能是:

  • ssh 到 datanode 作为特定用户
  • 运行命令行 sqoop 看看是否有效
于 2015-03-23T23:58:32.153 回答
0

尝试将sqljdbc41.jar sqlserver 驱动程序添加到您的 HDFS 并在您的 workflow.xml 中添加归档标记,如下所示,然后尝试运行 oozie 工作流运行命令:

<archive>${HDFSAPATH}/sqljdbc41.jar#sqljdbc41.jar</archive>

如果存在问题,则使用以下属性添加 hive-site.xml,

javax.jdo.option.ConnectionURL
hive.metastore.uris

将 hive-site.xml 保留在 HDFS 中,并在 workflow.xml 中添加文件标签并重新启动 oozie workflow.xml

于 2015-06-19T12:01:06.107 回答