[Vertica][VJDBC](100172)一个或多个行被服务器拒绝



使用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 '填充到数字字段中,则该行将被拒绝。即使您得到这个错误,我相信直到加载和所有数据应该提交之后才可以提交(但我会验证这一点)。如果您隔离"缺失"的行,您可能能够找出数据或字段定义的错误。

常用内容:

  1. 将字符类型数据填充到数字字段中(可能是隐式转换,或者仅在值非null时显示)。
  2. NULL值转化为NOT NULL字段
  3. 将字符与VARCHAR八位字节等同计数。VARCHAR(x)表示八位元组,但UTF-8字符可以有多个八位元组。
  4. 与#3类似,字符串太长而无法容纳指定的字段。

在驱动程序中,批处理插入被COPY FROM STDIN语句取代。您可能能够在query_requests中找到该语句,尽管我不确定它是否有帮助。

Sqoop并没有真正给您更多的机会来进一步研究这个问题(据我所知,我检查了通用JDBC Loader)。可以查看executeBatch()的返回数组,并将其与执行批处理联系起来。也许可以修改通用JDBC加载程序?

希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新