CDH Sqoop报错问题
Oracle数据库导入异常
首先要在
/opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/sqoop/lib
这个路径下,放入你项目中用到的oracle驱动Jar包,否则会提示没有oracle驱动!!!
mysql的驱动默认是有的
我的CDH版本是1.4.7-cdh6.3.1 测试oracle连接时,出现这个图中错误
20/12/30 16:33:23 ERROR manager.OracleManager: Could not find method setSessionTimeZone in oracle.jdbc.driver.T4CConnection
java.lang.NoSuchMethodException: oracle.jdbc.driver.T4CConnection.setDefaultTimeZone(java.util.TimeZone)
看到这个错误我想到了以下几点
- 错误栈信息大概是调用listTables开始初始化Oracle的jbdc连接
- 开始连接的时候,当调用setDefaultTimeZone这个方法的时候,找不到java.util.TimeZone这个方法
- sqoop是用java开发的,肯定是依赖于jdk的,这个方法是rt.jar中的,按理说不应该找不到的
- 还是把rt.jar单独放到sqoop的lib里面了,但是无济于事
- 于是想到了官方的demo连接的jdbc都是ip:端口这种的,而我的jdbc连接是jdbc:oracle:thin:@域名:1521:服务名
- 我把oracle JDBC连接改成了jdbc:oracle:thin:@ip:1521:服务名,于是oracle.jdbc.driver.T4CConnection.setDefaultTimeZone(java.util.TimeZone)这个错误消失了
- 但是依然有这个错误 java.lang.NullPointerException
at org.apache.sqoop.manager.OracleManager.listTables(OracleManager.java:770) - 最后查阅官方源码发现项目sqoop缺省会添加–driver com.mysql.jdbc.Driver驱动,1.4.7之前的版本都是这个,1.4.7的是支持mysql8驱动的
- 由于我用的是ojdbc14驱动,我的driver包在源码中是oracle.jdbc.OracleDriver这个类,加上了–driver oracle.jdbc.OracleDriver,问题没有解决依然是上面的一个报错
- 我又尝试了加–driver oracle.jdbc.driver.OracleDriver这个类,问题解决,sqoop list-tables成功执行,正常显示出当前服务下的所有表名了,其实这个驱动类在ojdbc14中已经过时
总结
CDH使用Sqoop出现图中错误
1.确保在sqoop lib包下导入oracle驱动
2.sqoop list-tables或其他测试命令最后,加入–driver oracle.jdbc.driver.OracleDriver即可