sqoop報錯:java.io.IOException: SQLException in nextKeyValu
阿新 • • 發佈:2018-11-23
sqoop從mysql導資料到hive的時候,報錯:
java.io.IOException: SQLException in nextKeyValue at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:266) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:483) at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:76) at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:85) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:139) at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330) at org.apache.hadoop.mapred.Child$4.run(Child.java:268) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408) at org.apache.hadoop.mapred.Child.main(Child.java:262) Caused by: java.sql
檢視sqoop的原始碼:
org/apache/sqoop/mapreduce/db/DBRecordReader.java
nextKeyValue()方法:
@Override public boolean nextKeyValue() throws IOException { try { if (key == null) { key = new LongWritable(); } if (value == null) { value = createValue(); } if (null == this.results) { // First time into this method, run the query. LOG.info("Working on split: " + split); this.results = executeQuery(getSelectQuery()); } if (!results.next()) { return false; } // Set the key field value as the output key value key.set(pos + split.getStart()); value.readFields(results); pos++; } catch (SQLException e) { LoggingUtils.logAll(LOG, e); if (this.statement != null) { try { statement.close(); } catch (SQLException ex) { LoggingUtils.logAll(LOG, "Failed to close statement", ex); } finally { this.statement = null; } } if (this.connection != null) { try { connection.close(); } catch (SQLException ex) { LoggingUtils.logAll(LOG, "Failed to close connection", ex); } finally { this.connection = null; } } if (this.results != null) { try { results.close(); } catch (SQLException ex) { LoggingUtils.logAll(LOG, "Failed to close ResultsSet", ex); } finally { this.results = null; } } throw new IOException("SQLException in nextKeyValue", e); } return true; }
原因:查詢中資料庫中有錯誤時間格式的資料,資料值為 0000-00-00 00:00:00
sqoop的時候,需要排除異常資料。當然,也是資料庫規範的問題,時間型別(timestamp)最好都給預設值。