1. 程式人生 > >用sqoop將oracle資料匯入Hbase 使用筆記

用sqoop將oracle資料匯入Hbase 使用筆記

網上已經有很多關於這方面的資料,但是我在使用過程中也遇見了不少問題

1. sqoop 的環境我沒有自己搭建  直接用的公司的

2. oracle 小白怕把公司環境弄壞了,自己用容器搭建了一個

docker pull docker.io/wnameless/oracle-xe-11g

docker run -d -p 2022:22 -p 1521:1521 -p 8080:8080 --name oracle wnameless/oracle-xe-11g

建立表,使用者,插入資料,oracle資料庫就算準備好了

SQL> select * from student;


        ID NAME                        AGE
---------- -------------------- ----------
         1 zy01                         10
         2 zy02                         10
         3 zy03                         10

3. 測試連通性

# sqoop list-tables --connect jdbc:oracle:thin:@122.18.10.114:1521:xe --username test --password test111

ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: oracle.jdbc.OracleDriver

解決辦法  需要有ojdbc6.jar,放在$SQOOP_HOME/lib裡

 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException

這個錯誤主要就是沒有連線成功,檢查一下,使用者名稱,密碼,防火牆什麼的,筆者是因為網路根本就不通。。。。

到這裡就能成功返回 所以的表

4. 然後開始資料遷移

簡介及部分重要引數介紹

Sqoop除了能夠將資料從關係型資料庫匯入到HDFS和Hive中,還能夠匯入到HBase表中。

--hbase-table:通過指定--hbase-table引數值,指明將資料匯入到HBase表中,而不是HDFS上的一個目錄。輸入表中的每一行將會被轉換成一個HBase Put操作的輸出表的一行。--hbase-row-key:你可以使用--hbase-row-key引數,手動的指定row key。預設的情況下,Sqoop會將split-by 列作為HBase rowkey列。如果沒有指定split-by值,它將會試圖識別關係表的關鍵字。

如果源表是組合關鍵字,--hbase-row-key 引數後面值是用逗號分隔的組合關鍵字屬性的列表,在這樣種情況下,通過合併組合關鍵字屬性的值來產生HBase的Row key,每個值之間使用下劃線分隔開來。

--column-family:必須指定--column-family引數,每一個輸出列都會被放到同一個family列族中。 --hbase-create-table:如果HBase中的目標表和列族不存在,如果你使用該引數,Sqoop在執行任務的時候會根據HBase的預設配置,首先建立目標表和列族。

注意一:當源表中是組合關鍵字的時候,必須手動指定--hbase-row-key引數,Sqoop才能將資料匯入到HBase中,否則不行。注意二:如果HBase中的目標表和列族不存在,如果沒加--hbase-create-table引數,Sqoop job將會報錯誤退出執行。所以你在將資料從源表匯入到HBase之前,需要首先在HBase中建立目標表和其對應的列族。

# sqoop import --append --connect jdbc:oracle:thin:@122.18.10.114:1521:xe --username test --password test111 --m 1 --table STUDENT --columns ID,NAME,AGE --hbase-create-table --hbase-table student --hbase-row-key ID --column-family deptinfo

報錯   ERROR db.DBRecordReader: Top level exception: 
java.sql.SQLSyntaxErrorException: ORA-00904: "age": invalid identifier

解決辦法  把表名和欄位名字用大寫 (筆者開始用的小寫)

成功以後進入 hbase檢視

hbase(main):001:0> scan 'student'
ROW                         COLUMN+CELL                                                                    
 1                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 1                          column=deptinfo:NAME, timestamp=1495704288610, value=zy01                      
 2                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 2                          column=deptinfo:NAME, timestamp=1495704288610, value=zy02                      
 3                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 3                          column=deptinfo:NAME, timestamp=1495704288610, value=zy03                      
3 row(s) in 0.3250 seconds

參考文件

http://www.aichengxu.com/oracle/9929535.htm

http://blog.csdn.net/liuxingjiaofu/article/details/6953701

http://www.cnblogs.com/byrhuangqiang/p/3922594.html