Sqoop 导入错误 Error: java.io.IOException: SQLException in nextKeyValue

Posted

技术标签:

【中文标题】Sqoop 导入错误 Error: java.io.IOException: SQLException in nextKeyValue【英文标题】:Sqoop import error Error: java.io.IOException: SQLException in nextKeyValue 【发布时间】:2016-01-25 13:13:46 【问题描述】:

我编写了一个脚本来执行从 oracle 表到 HDFS 目录的数据增量导入。我使用以下 sqoop 命令进行导入:

    sqoop -- import \
   --connect $JDBCconnectionString  \
   --username $dbUserName \
   --password-file $passwordLocal \
   --query 'select * from dmt_sim.dim_product WHERE $CONDITIONS' \
   --split-by "PRODUCT_TITLE" \
   --incremental append \
   --check-column "KEY" \
   --last-value "1" \
   --append \
   --fields-terminated-by '\t' \
   --target-dir /user/ksrinivasan/dmn_product

变量 $JDBCconnectionString,$dbUserName,$passwordLocal 的值在运行期间被替换,因此到 oracle 数据库的连接和获取边界值都成功,但是当作业启动时会引发错误。

16/01/25 06:19:29 INFO mapreduce.Job: Job job_1452256584707_106782 running in uber mode : false
06:19:36            16/01/25 06:19:29 INFO mapreduce.Job:  map 0% reduce 0%
06:20:07            16/01/25 06:20:00 INFO mapreduce.Job: Task Id : attempt_1452256584707_106782_m_000000_0, Status : FAILED
06:20:07            Error: java.io.IOException: SQLException in nextKeyValue
06:20:07                at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:277)
06:20:07                at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:553)
06:20:07                at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
06:20:07                at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
06:20:07                at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
06:20:07                at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
06:20:07                at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784)
06:20:07                at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
06:20:07                at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
06:20:07                at java.security.AccessController.doPrivileged(Native Method)
06:20:07                at javax.security.auth.Subject.doAs(Subject.java:415)
06:20:07                at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
06:20:07                at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
06:20:07            Caused by: java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis
06:20:07            
06:20:07                at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
06:20:07                at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
06:20:07                at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
06:20:07                at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
06:20:07                at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
06:20:07                at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
06:20:07                at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
06:20:07                at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
06:20:07                at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
06:20:07                at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
06:20:07                at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
06:20:07                at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
06:20:07                at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
06:20:07                at org.apache.sqoop.mapreduce.db.DBRecordReader.executeQuery(DBRecordReader.java:111)
06:20:07                at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:235)
06:20:07                ... 12 more
06:20:07            

如果其他人遇到同样的问题并且他们对如何调试此类问题有一些见解,那就太好了???

【问题讨论】:

当 sqoop 尝试导入的表包含保留关键字作为列名时,有时会发生这种情况。因此,请检查您的 Oracle 表“dmt_sim.dim_product”。 【参考方案1】:

nextKeyValue 中的 SQLException 这意味着在您执行时,您的源 KEY 列中的最后一个值“1”没有。

【讨论】:

【参考方案2】:

检查所有可能的列值是否为空,并特别检查日期可能为“0000-00-00”且您在 dmt_sim.dim_product 的选择子句中使用的日期列。

识别列并应用 select 中的 if 条件来替换 null 或与其他事物约会(您能认出的)。

【讨论】:

【参考方案3】:

这是因为用于拆分的列不是数字(“PRODUCT_TITLE”)。

当 Sqoop 翻译时,查询在给定时间间隔 "PRODUCT_TITLE" >= xx 时失败

带有数字字段的特征。

执行语句时包含--verbose 2> file_log.log(看分割语句是否正确)

【讨论】:

以上是关于Sqoop 导入错误 Error: java.io.IOException: SQLException in nextKeyValue的主要内容,如果未能解决你的问题,请参考以下文章

由于java.io.IOException:nextKeyValue中的SQLException,Sqoop导入失败

sqoop从mysql导入hive的一些问题

错误:使用 Sqoop 将所有表从 MariaDB 导入 Hive 数据库时文件路径无效

错误 - 使用 Apache Sqoop 和 Dataproc 从 SQL Server 导入 GCS

解决sqoop导入报错:Caused by: java.sql.SQLException: Protocol violation

导入失败:java.io.IOException:无法运行程序“hive”:错误=2,没有这样的文件或目录