sqoop java.lang.NullPointerException 和 No columns to generate for ClassWriter

使用sqoop導入導出MySQL的時候基本上沒遇到什麼問題,但是對於oracle數據庫來說就有一些區別,下列便是使用sqoop連接oracle數據庫的時候遇到的一點坑:

sqoop list-tables:

$ sqoop list-tables --connect jdbc:oracle:thin:@172.27.9.170:1521:ora11g --username MINER --password xxxxxx

Warning: /usr/hdp/2.3.2.0-2950/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/hdp/2.3.2.0-2950/accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
17/07/31 11:49:31 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6.2.3.2.0-2950
17/07/31 11:49:31 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
17/07/31 11:49:31 INFO oracle.OraOopManagerFactory: Data Connector for Oracle and Hadoop is disabled.
17/07/31 11:49:31 INFO manager.SqlManager: Using default fetchSize of 1000
17/07/31 11:49:52 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.sqoop.manager.OracleManager.listTables(OracleManager.java:759)
at org.apache.sqoop.tool.ListTablesTool.run(ListTablesTool.java:49)
at org.apache.sqoop.Sqoop.run(Sqoop.java:148)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:184)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:226)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:235)
at org.apache.sqoop.Sqoop.main(Sqoop.java:244)

java.lang.NullPointerException,從這裏看應該是缺少jdbc,進入sqooplib下查看:

$ cd /usr/hdp/2.3.2.0-2950/sqoop/lib
$ ls -lh

jar包

發現沒有ojdbc,下載ojdbc6.jar並上傳到/usr/hdp/2.3.2.0-2950/sqoop/lib目錄下,再來嘗試。

$ sqoop list-databases --connect jdbc:oracle:thin:@172.27.9.170:1521:ora11g --username MINER --password miner123. 

發現仍然報錯:

Warning: /usr/hdp/2.3.2.0-2950/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/hdp/2.3.2.0-2950/accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
17/07/31 11:55:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6.2.3.2.0-2950
17/07/31 11:55:34 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
17/07/31 11:55:34 INFO oracle.OraOopManagerFactory: Data Connector for Oracle and Hadoop is disabled.
17/07/31 11:55:34 INFO manager.SqlManager: Using default fetchSize of 1000
17/07/31 11:55:51 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.sqoop.manager.OracleManager.listDatabases(OracleManager.java:695)
at org.apache.sqoop.tool.ListDatabasesTool.run(ListDatabasesTool.java:49)
at org.apache.sqoop.Sqoop.run(Sqoop.java:148)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:184)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:226)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:235)
at org.apache.sqoop.Sqoop.main(Sqoop.java:244)

這次應該是沒有找到ojdbc,使用參數手動指定–driver oracle.jdbc.driver.OracleDriver後執行成功:
list-tables

$ sqoop list-tables --connect jdbc:oracle:thin:@172.27.9.170:1521:ora11g --username XDT --password xxxxxx --driver oracle.jdbc.driver.OracleDriver

但是問題又來了,使用sqoop導入oracle數據到hive表的時候又出現了問題:

sqoop import

$ sqoop import --connect jdbc:oracle:thin:@172.27.9.170:1521:ora11g --username XDT --password xxxxxx  --driver oracle.jdbc.driver.OracleDriver --table  K2 --hive-import --hive-table K2_test --hive-overwrite -m 1

Warning: /usr/hdp/2.3.2.0-2950/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/hdp/2.3.2.0-2950/accumulo does not exist! Accumulo imports will fail.
Please set \$ACCUMULO_HOME to the root of your Accumulo installation.
17/07/31 12:29:13 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6.2.3.2.0-2950
17/07/31 12:29:13 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
17/07/31 12:29:13 INFO tool.BaseSqoopTool: Using Hive-specific delimiters for output. You can override
17/07/31 12:29:13 INFO tool.BaseSqoopTool: delimiters with –fields-terminated-by, etc.
17/07/31 12:29:13 WARN sqoop.ConnFactory: Parameter –driver is set to an explicit driver however appropriate connection manager is not being set (via –connection-manager). Sqoop is going to fall back to org.apache.sqoop.manager.GenericJdbcManager. Please specify explicitly which connection manager should be used next time.
17/07/31 12:29:13 INFO manager.SqlManager: Using default fetchSize of 1000
17/07/31 12:29:13 INFO tool.CodeGenTool: Beginning code generation
17/07/31 12:29:28 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM K2 AS t WHERE 1=0
17/07/31 12:29:28 ERROR manager.SqlManager: Error executing statement: java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:758)
at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:767)
at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:270)
at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:241)
at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:227)
at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:295)
at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1845)
at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1645)
at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:107)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:478)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
at org.apache.sqoop.Sqoop.run(Sqoop.java:148)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:184)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:226)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:235)
at org.apache.sqoop.Sqoop.main(Sqoop.java:244)
17/07/31 12:29:28 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: No columns to generate for ClassWriter
at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1651)
at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:107)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:478)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
at org.apache.sqoop.Sqoop.run(Sqoop.java:148)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:184)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:226)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:235)
at org.apache.sqoop.Sqoop.main(Sqoop.java:244)

實際上剛剛成功地使用list-databases的時候,有一條輸出:

WARN sqoop.ConnFactory: Parameter –driver is set to an explicit driver however appropriate connection manager is not being set (via –connection-manager). Sqoop is going to fall back to org.apache.sqoop.manager.GenericJdbcManager. Please specify explicitly which connection manager should be used next time.

但是沒有注意,so 取消–driver oracle.jdbc.driver.OracleDriver這條參數即可。

$ sqoop import --connect jdbc:oracle:thin:@172.27.9.170:1521:ora11g --username XDT --password xxxxxx  --table  K2 --hive-import --hive-table K2_test --fields-terminated-by ':' -m 1

import

發佈了91 篇原創文章 · 獲贊 132 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章