使用Sqoop将数据从Impala加载到Vertica时出现以下错误:
错误:java.io.IOException: Can't export data, please check failed map任务日志:org.apache.sqoop.mapreduce.TextExportMapper.map (TextExportMapper.java: 112)在org.apache.sqoop.mapreduce.TextExportMapper.map (TextExportMapper.java: 39)(Mapper.java:145org.apache.sqoop.mapreduce.AutoProgressMapper.run (AutoProgressMapper.java: 64)org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java: 787)运行(MapTask.java:341org.apache.hadoop.mapred.YarnChild 2.美元(YarnChild.java: 163)运行java.security.AccessController。特权(本地方法)在javax.security.auth.Subject.doAs (Subject.java: 422)org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java: 1671)在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)引起java.sql.BatchUpdateException:一个或多个行被服务器拒绝。在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)…java.sql.BatchUpdateException:一个或多个行被服务器拒绝。在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——output -fields-以't'结尾——output -lines-以'n'结尾——批
此错误并非每次都引发。我进行了几次成功的测试,加载了超过200万行数据。所以我猜在被拒绝的行中可能有一些包含特殊字符的坏数据。这是非常恼人的,因为当这个错误出现时,mapreduce作业将回滚并重试。在这种情况下,目标表中会有大量重复数据。
有没有人知道是否有任何sqoop导出参数,可以设置处理特殊字符,或者是否有任何方法可以跳过坏数据,这意味着禁用回滚?谢谢!
这可能不仅仅是特殊字符。例如,如果您尝试将'abc
'填充到数字字段中,则该行将被拒绝。即使您得到这个错误,我相信直到加载和所有数据应该提交之后才可以提交(但我会验证这一点)。如果您隔离"缺失"的行,您可能能够找出数据或字段定义的错误。
常用内容:
- 将字符类型数据填充到数字字段中(可能是隐式转换,或者仅在值非null时显示)。
-
NULL
值转化为NOT NULL
字段 - 将字符与
VARCHAR
八位字节等同计数。VARCHAR(x)
表示八位元组,但UTF-8字符可以有多个八位元组。 - 与#3类似,字符串太长而无法容纳指定的字段。
在驱动程序中,批处理插入被COPY FROM STDIN
语句取代。您可能能够在query_requests
中找到该语句,尽管我不确定它是否有帮助。
Sqoop并没有真正给您更多的机会来进一步研究这个问题(据我所知,我检查了通用JDBC Loader)。可以查看executeBatch()
的返回数组,并将其与执行批处理联系起来。也许可以修改通用JDBC加载程序?
希望这对你有帮助。