平臺:CDH 5.13.0node
公司在客戶那邊有個項目須要部署cloudera平臺,部署的時候,在這個版本的cdh中,除了基本組件,還選了sqoop2做爲數據傳輸工具,但願能在Oozie中經過工做流調用sqoop。sql
以下圖所示,不管在Editor仍是在workflow的操做界面,只有sqoop1的操做,沒有sqoop2的。shell
而後在博客中找到了緣由:數據庫
Oozie 自帶 sqoop、hive 等經常使用組件,好比執行sqoop腳本命令時,並非你主機裏或者CDH裏的的sqoop,而是 HDFS 下 Oozie 裏的 sqoop 在起做用,這也是爲何 老是報 Could not load db driver class 的緣由了,由於根本不是同一個sqoop。[1]微信
也搜索到了sqoop1和sqoop2的區別:http://www.javashuo.com/article/p-mxifapug-cr.htmlssh
然而咱們只須要簡單的工具,可以從關係型數據庫中導入數據而已,因此思路轉爲調用sqoop1進行數據導入。工具
「Could not load db driver class」,這句估計是出現次數最多的報錯了,這個報錯搞了一天,因此要一步步來(如下操做在安裝oozie的主機進行操做):oop
個人需求是從sqlserver導入數據,因此須要從微軟的官網下載驅動:https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017 ,我選擇是6.0的版本,解壓後,得到sqljdbc42.jarsqlserver
將sqljdbc42.jar放入/var/lib/sqoop/目錄,而後將用戶和組改成sqoop。spa
ssh登陸主機,我是用root執行命令:
sqoop import --connect 'jdbc:sqlserver://{IP}:{Port};username={UserName};password={Paswd};database={Dbname}' --table table_name --target-dir "/user/root/sqoop_dir" -m 1
若是可以正常執行,而且在hdfs上發現/user/root/sqoop_dir 目錄中有正確的數據,證實sqoop命令和驅動都是正常的。
首先,將sqljdbc42.jar包,複製到hdfs中的目錄:/user/oozie/share/lib/lib_{timestamp}/sqoop/ 其中timestamp因人而異;
能夠經過命令:
oozie admin -oozie http://{Ip}:11000/oozie –sharelibupdate
更新共享庫,能夠看到你如今oozie的共享庫是哪一個。
而後,將jar包的owner和group都改爲oozie;
最後,在cloudera界面重啓oozie組件;
作完這些以後,新建一個workflow,以下圖所示:
編輯內容填入sqoop語句,注意,網上有人說這裏不能帶sqoop命令了,也就是直接以import開頭,可是我執行以後,發現用完整的命令是能夠執行的。
有個坑是,剛開始字符串用單引號,會報錯,改爲雙引號後就能夠運行了,執行結果以下:
可是,使用sqoop action執行數據導入會有一個致命的問題,就是沒法使用—query 「sql語句」的方式去動態的選擇數據,緣由是oozie在解析command的時候,會將空格看成分隔符進行分割,因此會報沒法識別參數的錯,這個經過查看workflow.xml能夠看出oozie轉化後的文件,詳情能夠看:Oozie – Sqoop Job Failed When Executing It With Hue。
因爲oozie的bug,致使沒法使用sqoop action進行操做,因此仍是須要將sqoop命令寫入shell腳本,利用shell action去執行。
可是不管我把驅動包拷貝入oozie server所在主機仍是namenode所在主機的相關目錄,仍是會報找不到驅動,最後沒辦法,把驅動包分發到各個節點的/var/lib/sqoop目錄,居然就成功了!
接下來的問題就是權限問題,由於shell script默認是使用yarn用戶進行執行任務,須要你在shell前面指定執行用戶:
export HADOOP_USER_NAME=username
接下來就能夠順利將sqlserver的數據導入到hdfs中了。
最後我作了一個實驗,分別刪除datanode節點上的驅動,發現一個規律:
workflow會隨機在一個節點對sqoop命令進行調用。
我猜測,應該取決於yarn將MapReduce任務分配到哪部主機上執行。我以爲應該有參數能夠設置從哪裏讀取驅動的,但願有辦法的朋友不吝留下您的解決方法。
(完)