Hue,Oozie運行sqoop找不到驅動解決辦法

1、前言

平臺:CDH 5.13.0node

公司在客戶那邊有個項目須要部署cloudera平臺,部署的時候,在這個版本的cdh中,除了基本組件,還選了sqoop2做爲數據傳輸工具,但願能在Oozie中經過工做流調用sqoop。sql

 

2、問題與解決

1. hue界面找不到sqoop2的action

以下圖所示,不管在Editor仍是在workflow的操做界面,只有sqoop1的操做,沒有sqoop2的。shell

微信截圖_20190907181111

而後在博客中找到了緣由:數據庫

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進行數據導入。工具

 

2. 沒法導入db驅動的類

「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

 

3. 本地執行sqoop命令

將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命令和驅動都是正常的。

 

4. 經過sqoop action方式運行

首先,將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,以下圖所示:

image

編輯內容填入sqoop語句,注意,網上有人說這裏不能帶sqoop命令了,也就是直接以import開頭,可是我執行以後,發現用完整的命令是能夠執行的。

有個坑是,剛開始字符串用單引號,會報錯,改爲雙引號後就能夠運行了,執行結果以下:

image

image

可是,使用sqoop action執行數據導入會有一個致命的問題,就是沒法使用—query 「sql語句」的方式去動態的選擇數據,緣由是oozie在解析command的時候,會將空格看成分隔符進行分割,因此會報沒法識別參數的錯,這個經過查看workflow.xml能夠看出oozie轉化後的文件,詳情能夠看:Oozie – Sqoop Job Failed When Executing It With Hue

 

5. 經過shell action方式運行

因爲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任務分配到哪部主機上執行。我以爲應該有參數能夠設置從哪裏讀取驅動的,但願有辦法的朋友不吝留下您的解決方法。

 

3、參考

1. Hue + Oozie + Sqoop 使用

(完)

相關文章
相關標籤/搜索