使用Sqoop将数据从Impala加载到Vertica时出现以下错误。
错误:java.io.IOException:无法导出数据,请检查失败的地图 任务日志 org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112) 在 org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39) 在org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) 在org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) 在org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)at org.apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.java:163)at at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) 在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)引起 by:java.io.IOException:java.sql.BatchUpdateException: [Vertica] VJDBC服务器拒绝了一行或多行。 在 org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:233) 在 org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:46) 在 org.apache.hadoop.mapred.MapTask $ NewDirectOutputCollector.write(MapTask.java:658) 在 org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89) 在 org.apache.hadoop.mapreduce.lib.map.WrappedMapper $ Context.write(WrappedMapper.java:112) 在 org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:84) ... 10更多引起:java.sql.BatchUpdateException: [Vertica] VJDBC服务器拒绝了一行或多行。 在com.vertica.jdbc.SStatement.processBatchResults(未知来源) 在com.vertica.jdbc.SPreparedStatement.executeBatch(未知来源) 在 org.apache.sqoop.mapreduce.AsyncSqlOutputFormat $ AsyncSqlExecThread.run(AsyncSqlOutputFormat.java:231)
我正在运行以下命令:
sudo -u impala sqoop export -Dsqoop.export.records.per.statement = xxx --driver com.vertica.jdbc.Driver --connect jdbc:vertica:// host:5433 / db --username name --password pw --table table --export-dir / some / dir -m 1 - 输入字段终止于' \ t' - 输入行终止 - ' \ n' --batch
每次都没有引发此错误。我有几个成功的测试加载超过200万行数据。所以我猜可能会有一些不良数据在被拒绝的行中包含特殊字符。这非常烦人,因为当引发此错误时,mapreduce作业将回滚并重试。在这种情况下,目标表中会有大量重复数据。
有没有人知道是否有任何sqoop导出参数可以设置为处理特殊字符或者是否有任何方法可以跳过坏数据,这意味着禁用回滚?谢谢!
答案 0 :(得分:5)
这可能不仅仅是特殊字符。例如,如果您尝试将'abc
'填入数字字段,该行将被拒绝。即使你得到这个错误,我相信它直到负载和所有数据都应该提交后才能提交(但我会验证)。如果您隔离“缺失”行,您可能能够找出数据或字段定义的错误。
要寻找的常见事项:
NULL
值到NOT NULL
个字段VARCHAR
八位字节计为等效字符。 VARCHAR(x)
表示八位字节,但UTF-8字符可以有多个八位字节。 在驱动程序中,批处理插入替换为COPY FROM STDIN
语句。您可以在query_requests
中找到该声明,但我不确定它会有所帮助。
Sqoop并没有给你太多机会进一步调查(据我所知,我检查了通用的JDBC Loader)。可以查看executeBatch()
的返回数组,并将其与执行批处理相关联。也许修改通用JDBC加载器?
希望这会有所帮助。