利用SQOOP將資料從資料庫匯入到HDFS

2021-12-29 19:56:43 字數 3916 閱讀 9329

利用sqoop將資料從資料庫匯入到hdfs

基本使用

如下面這個shell指令碼:

#oracle的連線字串,其中包含了oracle的位址,sid,和埠號

connecturl=jdbc:oracle:thin:@20.135.60.21:1521:dwrac2

#使用的使用者名稱

oraclename=kkaa

#使用的密碼

oraclepassword=kkaa123

#需要從oracle中匯入的表名

oralcetablename=tt

#需要從oracle中匯入的表中的欄位名

columns=area_id,team_name

#將oracle中的資料匯入到hdfs後的存放路徑

hdfspath=apps/as/hive/$oralcetablename

#執行匯入邏輯。將oracle中的資料匯入到hdfs中

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --num-mappers 1 --table $oralcetablename --columns $columns --fields-terminated-by '\001'

執行這個指令碼之後,匯入程式就完成了。

接下來,使用者可以自己建立外部表,將外部表的路徑和hdfs中存放oracle資料的路徑對應上即可。

注意:這個程式匯入到hdfs中的資料是文字格式,所以在建立hive外部表的時候,不需要指定檔案的格式為rcfile,而使用預設的textfile即可。資料間的分隔符為'\001'。如果多次匯入同乙個表中的資料,資料以append的形式插入到hdfs目錄中。

並行匯入

假設有這樣這個sqoop命令,需要將oracle中的資料匯入到hdfs中:

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --m 1 --table $oralcetablename --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"

請注意,在這個命令中,有乙個引數「-m」,代表的含義是使用多少個並行,這個引數的值是1,說明沒有開啟並行功能。

現在,我們可以將「-m」引數的值調大,使用並行匯入的功能,如下面這個命令:

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --m 4 --table $oralcetablename --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"

一般來說,sqoop就會開啟4個程序,同時進行資料的匯入操作。

但是,如果從oracle中匯入的表沒有主鍵,那麼會出現如下的錯誤提示:

error tool.importtool: error during import: no primary key could be found for table creater_user.popt_cas_redirect_his. please specify one with --split-by or perform a sequential import with '-m 1'.

在這種情況下,為了更好的使用sqoop的並行匯入功能,我們就需要從原理上理解sqoop並行匯入的實現機制。

如果需要並行匯入的oracle表的主鍵是id,並行的數量是4,那麼sqoop首先會執行如下乙個查詢:

select max(id) as max, select min(id) as min from table [where 如果指定了where子句];

通過這個查詢,獲取到需要拆分字段(id)的最大值和最小值,假設分別是1和1000。

然後,sqoop會根據需要並行匯入的數量,進行拆分查詢,比如上面的這個例子,並行匯入將拆分為如下4條sql同時執行:

select * from table where 0 <= id < 250;

select * from table where 250 <= id < 500;

select * from table where 500 <= id < 750;

select * from table where 750 <= id < 1000;

注意,這個拆分的字段需要是整數。

從上面的例子可以看出,如果需要匯入的表沒有主鍵,我們應該如何手動選取乙個合適的拆分字段,以及選擇合適的並行數。

再舉乙個實際的例子來說明:

我們要從oracle中匯入creater_user.popt_cas_redirect_his。

這個表沒有主鍵,所以我們需要手動選取乙個合適的拆分字段。

首先看看這個表都有哪些字段:

然後,我假設ds_name欄位是乙個可以選取的拆分字段,然後執行下面的sql去驗證我的想法:

select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

發現結果不理想,min和max的值都是相等的。所以這個欄位不合適作為拆分字段。

再測試一下另乙個字段:clientip

select min(clientip), max(clientip) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

這個結果還是不錯的。所以我們使用clientip欄位作為拆分字段。

所以,我們使用如下命令並行匯入:

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --m 12 --split-by clientip --table $oralcetablename --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"

這次執行這個命令,可以看到,消耗的時間為:20mins, 35sec,匯入了33,222,896條資料。

另外,如果覺得這種拆分不能很好滿足我們的需求,可以同時執行多個sqoop命令,然後在where的引數後面指定拆分的規則。如:

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --m 1 --table $oralcetablename --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26' logtime<10:00:00"

sqoop import --append --connect $connecturl --username $oraclename --password $oraclepassword --target-dir $hdfspath --m 1 --table $oralcetablename --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26' logtime>=10:00:00"

從而達到並行匯入的目的。

利用SQOOP將資料從資料庫匯入到HDFS

如下面這個shell指令碼 執行這個指令碼之後,匯入程式就完成了。接下來,使用者可以自己建立外部表,將外部表的路徑和hdfs中存放oracle資料的路徑對應上即可。假設有這樣這個sqoop命令,需要將oracle中的資料匯入到hdfs中 請注意,在這個命令中,有乙個引數 m 代表的含義是使用多少個並...

利用SQOOP將資料從資料庫匯入到HDFS

基本使用 如下面這個shell指令碼 oracle的連線字串,其中包含了oracle的位址,sid,和埠號 connecturl jdbc oracle thin 20.135.60.21 1521 dwrac2 使用的使用者名稱 oraclename kkaa 使用的密碼 oraclepasswo...

利用Sqoop將資料從資料庫匯入到HDFS

利用sqoop將資料從資料庫匯入到hdfs 如下面這個shell指令碼 執行這個指令碼之後,匯入程式就完成了。接下來,使用者可以自己建立外部表,將外部表的路徑和hdfs中存放oracle資料的路徑對應上即可。假設有這樣這個sqoop命令,需要將oracle中的資料匯入到hdfs中 請注意,在這個命令...