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
待实验