今天在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了。