背景:
通过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
首先声明,我使用这种办法并未成功。。只是在此记录下一些坑,希望后人能继续填。。
我们先必须在一些位置添加mysql驱动jar包,这个就不仔细说了,网上很多资料,可根据报错信息一一添加。
通过hue将sqoop-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 environment
和 Setting 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 beat
、heart beat
……然后失败退出!
但观察所有日志(oozie和yarn),都没法发现具体问题!
网上浏览时,大多人说这个错误和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文件程序>一样可以正确执行
然后又经过一系列的排查,包括修改权限啥的,还是毫无头绪,最终放弃。。。
注:这种方法虽然也有一些坑,但我最终解决了~
先在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 指定
属性
<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.shexec>
<file>/yj/catch.shfile> //此处必须添加!
<capture-output/>
shell>
<ok to="End"/>
<error to="Kill"/>
action>
<end name="End"/>
workflow-app>
但由于我是hue配置workflow工作流的,workflow.xml文件都是在每个workspace中自动生成的,我们手动在workflow.xml中添加
属性后,第一次启动是正常的,但第二次启动的话之前的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.dataname>
<value>204800value>
property>
CDH集群是在 oozie-site.xml 的 Oozie Server 高级配置代码段(安全阀)中添加:
成功解决!
我们使用hue操作oozie-workflow,为成功和失败均添加邮箱发送功能!直接拖拽mail-action:
多个邮箱发送用逗号分隔!
这里出现一个问题,用oozie自带的邮箱服务器oozie@localhost只能发送tsingnuo邮箱,无法发送moerlong邮箱!发送时变为:[email protected]
所以我将默认邮箱服务器该为公司的邮箱服务器成功解决!
附上生成的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.shexec>
<file>/sqoop/house-shell/sqoop2hive_house.sh#sqoop2hive_house.shfile>
<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@***.comto>
<subject>房贷数据离线导入Hive执行结果subject>
<body><h2>The workflow ${wf:id()} <font color="green">successfully</font> completed!</h2>body>
<content_type>text/htmlcontent_type>
email>
<ok to="End"/>
<error to="Kill"/>
action>
<action name="email-915d">
<email xmlns="uri:oozie:email-action:0.2">
<to>[email protected],[email protected]to>
<subject>房贷离线数据导入Hive执行结果subject>
<body><h2>The workflow ${wf:id()} <font color="red">failed</font>!</h2>body>
<content_type>text/htmlcontent_type>
email>
<ok to="End"/>
<error to="Kill"/>
action>
<end name="End"/>
workflow-app>