本文已参与“新人创作礼”活动,一起开启掘金创作之路。
今天在HUE中的Oozie执行Sqoop,因为数据都要现在这里汇总与处理。这里给一个样例:
sqoop import --connect "jdbc:mysql://192.168.102.18:3306/school?useUnicode=true&characterEncoding=utf-8" --username root --password P@ssw0rd4321 --driver com.mysql.jdbc.Driver --query 'select * from snap_match where alarmTime>date_sub(date_format(now(), "%Y-%m-%d %H"), interval 1 hour) and alarmTime<date_format(now(), "%Y-%m-%d %H") and $CONDITIONS' --target-dir /user/activemq_topic/snap_match/${date_today}/${hour} --fields-terminated-by '\001' --lines-terminated-by '\n' --null-string '\N' --null-non-string '\N' --m 1;
这些指令之前已经在shell中测试好了,没有问题,结果在这里执行被KILLED:
执行以后报错,Job was KILLED
我们可以看他的这个解析结果:
Sqoop command arguments :\
import\
--connect\
"jdbc:mysql://192.168.102.18:3306/school?useUnicode=true&characterEncoding=utf-8"\
--username\
root\
--password\
********\
--driver\
com.mysql.jdbc.Driver\
--query\
'select\
*\
from\
snap_match\
where\
alarmTime>date_sub(date_format(now(),\
"%Y-%m-%d\
%H"),\
interval\
1\
hour)\
and\
alarmTime<date_format(now(),\
"%Y-%m-%d\
%H")\
and\
$CONDITIONS'\
--target-dir\
/user/activemq_topic/snap_match/2020-04-15/08\
--fields-terminated-by\
'\001'\
--lines-terminated-by\
'\n'\
--null-string\
'\\N'\
--null-non-string\
'\\N'\
--m\
1;\
Fetching child yarn jobs\
tag id : oozie-b49b7f0dfebe4b4641a1626cb6e46621\
2020-04-15 09:28:51,392 [main] INFO org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at xdata1/192.168.102.15:8032\
Child yarn jobs are found - \
=================================================================
这里可以发现在这个Editor里执行的Sqoop命令会被Oozie用空格分隔,变成一个一个的参数。所以解析到--query时,后面把我之前测试好的SQL语句都解析成一个个参数,所以不能识别。这样的sqoop指令当然就被kill了。
如果想在HUE里执行含有空格的Sqoop命令,不能使用Sqoop Editor,因为它没有提供传参的地方。(注意,在使用--query时,参数中不要带有空格,否则出错)
这就很bug了呀,sql不用空格。。。不过问了公司大佬,提供一个解决方案,在Workflow里使用Sqoop时里面不写command,但是把语句都写到arguments里。就直接按照他解析的字段整合。如下图:
注:不过这里记得别忘了添加Files,要添加特定的sql驱动才可以。
然后就完美解决问题。注意如果在HUE中使用sqoop,并且里面有sql语句,那么最好不要在Oozie中编辑。直接在WorkFlow中添加ACTIONS中的sqoop,这样就可以直接写这些指令,而不需要使用DOCUMENTS中的sqoop了。