oozie调度sqoop踩坑之路(hue配置)

背景:
通过oozie来调度管理sqoop数据抽取流程,一般有两种方法:一是直接使用oozie的sqoop-action,二是将sqoop语句写在shell脚本中,通过shell-action来调度。经过测试,sqoop-action实在是坑多,故采用坑相对较少的shell-action~

集群环境:CDH 5.13.0 ,其中oozie版本:4.1.0,sqoop版本:1.4.6


一、sqoop-action操作

首先声明,我使用这种办法并未成功。。只是在此记录下一些坑,希望后人能继续填。。

我们先必须在一些位置添加mysql驱动jar包,这个就不仔细说了,网上很多资料,可根据报错信息一一添加。

通过huesqoop-action拖拽到指定区域,填写sqoop命令:

import --connect jdbc:mysql://10.3.1.10:9306/edw --username beijing_query --password bjquery12 --table sda_crm_accounts --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite --create-hive-table --hive-database test --hive-table sda_crm_accounts --delete-target-dir -m 1
这里写图片描述
此处出现第一个坑:这种方式提交命令开头不能添加sqoop,只需要从import开始写!

第二个坑:sqoop命令语句不能以分号结尾,如果有分号,会报错!

报错信息大多如下

2018-08-17 15:14:50,848 [main] WARN  org.apache.sqoop.tool.SqoopTool  - $SQOOP_CONF_DIR has not been set in the environment. Cannot check for additional configuration.
2018-08-17 15:14:50,902 [main] INFO  org.apache.sqoop.Sqoop  - Running Sqoop version: 1.4.6-cdh5.13.0
2018-08-17 15:14:50,913 [main] WARN  org.apache.sqoop.tool.BaseSqoopTool  - Setting your password on the command-line is insecure. Consider using -P instead.

<<< Invocation of Sqoop command completed <<<

No child hadoop job is executed.
Intercepting System.exit(1)

<<< Invocation of Main class completed <<<

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]

Oozie Launcher failed, finishing Hadoop job gracefully

需要注意的是:报错信息开头的两个WARN其实是没问题的!
SQOOP_CONF_DIR has not been set in the environmentSetting your password on the command-line is insecure. Consider using -P instead. 这两个信息不用管也行,不会影响到oozie执行!(刚开始以为这个有问题,浪费了一些时间)

然后下面的错误信息其实是个大坑:

No child hadoop job is executed.
Intercepting System.exit(1)
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]
Oozie Launcher failed, finishing Hadoop job gracefully

这个信息只是说oozie launcher 启动失败!至于为何失败,没有丝毫相关的提示信息!
也就是说:各种各样的配置错误,最后都会导致该报错信息,我们无法根据这个去定位!

所以,还是看看其他日志信息,寻找更具体的错误吧!

确保以上都没有问题时,我执行该oozie任务依旧报错,执行任务时出现heart beatheart beat……然后失败退出!
但观察所有日志(oozieyarn),都没法发现具体问题!

网上浏览时,大多人说这个错误和yarn资源不够有关,需要调大yarn容器资源,但是我给的资源是足够的,应该不会出现资源不足的情况,下面是我的配置:
这里写图片描述

网上有一个详细点的sqoop-action注意点介绍,我按着做了也没解决掉问题,大家可以参考下:

1、操作的时候不能带sqoop在前面,只需要import export 就可以了
2、在--columns中 不能使用单引号'',只需要在--column之后列出所有的需要导入的列就可以了
3--fields-terminated-by '\t' 该参数使用可能会使导入报错,提前建好表的情况下,不使用该参数可以正确导入;使用该参数反而会报错。在hue中直接使用\t就可以了,不用使用单引号,否则会失败!!
4、导入hive的时候,hive的配置文件需要以文件形式添加进来
5、mysql的驱动jar包需要以文件形式添加进来,该文件名需要注意,有些版本可能只认识不带版本号的jar包,如果是这样的情况可能通过修改jar文件>名来。判断的出错的原因大致是share/lib目录上传的时候未导入mysql驱动包,在另外一个CDH集群中,可以不导入hive-site文件与mysql jar文件程序>一样可以正确执行

然后又经过一系列的排查,包括修改权限啥的,还是毫无头绪,最终放弃。。。


二、shell-action调用sqoop脚本

注:这种方法虽然也有一些坑,但我最终解决了~

先在hdfs的目录/yj/下上传一个shell文件:catch.sh,确保该文件拥有读写权限(744)

如果直接在shell-action中导入该脚本文件,执行会报错:
java.io.IOException: Cannot run program "catch.sh" (in directory "/home/yarn/nm/usercache/root/appcache/application_1534405855130_0022/container_1534405855130_0022_01_000002"): error=2, 没有那个文件或目录
这里写图片描述
找不到 catch.sh文件,排查后发现我们还需在 workflow.xml 指定<file>属性

<workflow-app name="My Workflow" xmlns="uri:oozie:workflow:0.5">
    <start to="shell-cbb3"/>
    <kill name="Kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <action name="shell-cbb3">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>/yj/catch.sh</exec>
            <file>/yj/catch.sh</file>       //此处必须添加!
              <capture-output/>
        </shell>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <end name="End"/>
</workflow-app>

但由于我是hue配置workflow工作流的,workflow.xml文件都是在每个workspace中自动生成的,我们手动在workflow.xml中添加<file>属性后,第一次启动是正常的,但第二次启动的话之前的xml文件就会被覆盖!我们修改只是在这一次job的工作空间的workflow.xml,下一次再执行该任务,无论是在新生成的工作空间或者老工作空间里的任务,都会新生成workflow.xml覆盖旧的!所以这种办法行不通!

经过不断测试,终于找到了正确姿势
这里写图片描述

hue的shell-action配置界面,还有一个FILES+按钮,在这个地方我们再一次将catch.sh添加进去,保存任务,执行,发现找不到文件这个错误永久消除!


往下执行,发现报错,是/user的权限问题

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=yarn, access=EXECUTE, inode="/user":hdfs:supergroup:drwxrwx---

我把/user之前是770权限,我调为777权限,该错误消除!看来为了保险,other用户组的权限也需要授权!


解决后继续执行,依旧报错,但和以前不同的是:

以前都是oozie控制台报错yarn日志中的MRjob 并没有报错!但这一次oozie中没有看到明显错误的地方,但我们在yarn-job日志中看到错误

org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.io.FileNotFoundException: File does not exist: hdfs://cdh1:8020/user/root/.staging/job_1534405855130_0047/job.splitmetainfo
这里写图片描述
这里写图片描述

网上寻找所有出现该错误的地方,都没有确定的答案和解决办法

但隐约有人提到过可能和yarn用户有关,我经过测试,之前都是hue的root用户登录的,我再创建一个yarn用户同样分配超级管理员权限,注销后再次登录
这里写图片描述
执行成功!(中间有7-8个heart beat,我以为会失败,但没有!)


注意,如果我们sqoop-shell脚本中作业量较大,会报错:

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exception invoking main(), Output data exceeds its limit [2048]
org.apache.oozie.action.hadoop.LauncherException: Output data exceeds its limit [2048]

原因是shell脚本中一次提交的hql-mr作业量太大,其中包含的信息超过oozie launcher一次容许的最大值2K

我们需要修改oozie-site.xml:

<property>
    <name>oozie.action.max.output.data</name>
    <value>204800</value>
</property>

CDH集群是在 oozie-site.xml 的 Oozie Server 高级配置代码段(安全阀)中添加:
这里写图片描述
成功解决!


三、扩展: 发送邮箱功能:

我们使用hue操作oozie-workflow,为成功和失败均添加邮箱发送功能!直接拖拽mail-action:
这里写图片描述
多个邮箱发送用逗号分隔

这里出现一个问题,用oozie自带的邮箱服务器oozie@localhost只能发送tsingnuo邮箱,无法发送moerlong邮箱!发送时变为:maxiaodong@wsall.moerlong.com.wswebpic.com

所以我将默认邮箱服务器该为公司的邮箱服务器成功解决!

附上生成的workflow.xml:

<workflow-app name="House-All-Workflow" xmlns="uri:oozie:workflow:0.5">
    <start to="shell-8c6e"/>
    <kill name="Kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <action name="shell-8c6e">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>/sqoop/house-shell/sqoop2hive_house.sh</exec>
            <file>/sqoop/house-shell/sqoop2hive_house.sh#sqoop2hive_house.sh</file>
              <capture-output/>
        </shell>
        <ok to="email-3304"/>
        <error to="email-915d"/>
    </action>
    <action name="email-3304">
        <email xmlns="uri:oozie:email-action:0.2">
            <to>yuanjie@***.com,pangyoj@***.com</to>
            <subject>房贷数据离线导入Hive执行结果</subject>
            <body>&lt;h2&gt;The workflow ${wf:id()} &lt;font color=&quot;green&quot;&gt;successfully&lt;/font&gt; completed!&lt;/h2&gt;</body>
            <content_type>text/html</content_type>
        </email>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <action name="email-915d">
        <email xmlns="uri:oozie:email-action:0.2">
            <to>yuanjie@tsingnuo.com,pangyoj@moerlong.com</to>
            <subject>房贷离线数据导入Hive执行结果</subject>
            <body>&lt;h2&gt;The workflow ${wf:id()}  &lt;font color=&quot;red&quot;&gt;failed&lt;/font&gt;!&lt;/h2&gt;</body>
            <content_type>text/html</content_type>
        </email>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <end name="End"/>
</workflow-app>

展开阅读全文

没有更多推荐了,返回首页