用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