1. 程式人生 > >sqoop之從oracle匯入hbase的問題與sqoop hbase 需要注意的一個問題

sqoop之從oracle匯入hbase的問題與sqoop hbase 需要注意的一個問題

轉載URL:

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

sqoop從oracle匯入, 需要有ojdbc6.jar,放在$SQOOP_HOME/lib裡,不用新增到classpath裡,因為sqoop會自己遍歷lib資料夾並添加里面的所有jar包 --connect與mysql的不一樣,如下(shell指令碼中的主要部分)

#Oracle的連線字串,其中包含了Oracle的地址,SID,和埠號
#CONNECTURL=jdbc:oracle:thin:@172.7.10.16:1521:orcl
CONNECTURL=jdbc:oracle:thin:@172.7.10.16:1521:orcl
#使用的使用者名稱
ORACLENAME=scott
#使用的密碼
ORACLEPASSWORD=wang123456
#需要從Oracle中匯入的表名
oralceTableName=test
#需要從Oracle中匯入的表中的欄位名
columns=ID,STATE
#將Oracle中的資料匯入到HDFS後的存放路徑
#hdfsPath=/tmp/

#執行匯入邏輯。將Oracle中的資料匯入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --m 1 --table $oralceTableName --columns $columns --hbase-create-table --hbase-table or1 --hbase-row-key STATE

 --column-family or1

我的oracle伺服器是在windowsXP上執行的,期間遇到兩個解決起來耗時不小的問題
1. ERROR manager.SqlManager: Error executing statement: java.sql.SQLRecoverableException: Io 異常: The Network Adapter could not establish the connection

11/11/09 19:43:44 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException

java.lang.NullPointerException
    at com.cloudera.sqoop.orm.ClassWriter.generate(ClassWriter.java:935)
    at com.cloudera.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:82)
    at com.cloudera.sqoop.tool.ImportTool.importTable(ImportTool.java:337)
    at com.cloudera.sqoop.tool.ImportTool.run(ImportTool.java:423)

    at com.cloudera.sqoop.Sqoop.run(Sqoop.java:144)

連線不上oracle伺服器,經多方查詢,最後確定是因為windows的防火牆沒有關! 關掉!OK,可以連線了。

2. ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Could not determine the row-key column. Use --hbase-row-key to specify the input column that names each row.
    at com.cloudera.sqoop.mapreduce.HBaseImportJob.configureOutputFormat(HBaseImportJob.java:114)
    at com.cloudera.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:160)

……

……

說的很清楚了,hbase自己找不到哪一列是row-key,為什麼呢?因為我的oracle表test是這樣定義的 create table test(ID INT, STATE INT);並且插入了四條資料

,如下

ID STATE

1   10

1   30

1   40

1   80

而剛開始的時候我沒有寫 --hbase-row-key這一項,此時sqoop預設將表的第一列作為hbase表的rowkey,大家當然知道rowkey必須是唯一的,即一個rowkey可以唯一確定1條或0條記錄,但是我的很顯然不符合此規定,因此,預設是不行滴,如果加 --hbase-row-key ID同理也是不行滴,因此,針對我要匯入的test表只能暫時用--hbase-row-key STATE了。

一個問題,我用mysql匯入hive中有個問題,昨天至今未解決,就是sqoop import 執行成功,hdfs中也能夠在hive的warehouse中看到匯入的表及內容,但是在hive外殼中執行show tables ; 卻不顯示新匯入的表!唉……估計是hive配置沒配好,再研究

一個待研究:對rdbms,如mysql中的一個表,假設有四列,由於hbase的rowkey設計好了會極大提高查詢效率,一般將其rowkey用mysql中的三列組合起來,即假設mysql表中為:姓名,出生年月,地點,工資。可以令rowkey為姓名_出生年月_地點,如何實現呢,只需要在現有mysql表中,新建一列rowkey,執行一個update 語句

update mysqltable set rowkey=姓名_出生年月_地點

然後在sqoop import 進hbase時 制定rowkey  --hbase -row-key  rowkey

待實驗