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

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

待實驗



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章