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

Hadoop [Vertica][VJDBC](100172)服务器拒绝了一行或多行,hadoop,mapreduce,sqoop,vertica,impala,Hadoop,Mapreduce,Sqoop,Vertica,Impala,使用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.ha

使用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) 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) org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)位于 java.security.AccessController.doPrivileged(本机方法)位于 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.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.taskInputOutContextImpl.write(taskInputOutContextImpl.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导出-Dsqoop.export.records.per.statement=xxx --驱动程序com.vertica.jdbc.driver--连接jdbc:vertica://host:5433/db --用户名--password pw--table table--export dir/some/dir-m1--以“\t”结尾的输入字段--以“\n”结尾的输入行 --批处理

并非每次都会出现此错误。我进行了几次成功的测试,加载了超过200万行的数据。所以我猜可能有一些坏数据在被拒绝的行中包含特殊字符。这非常烦人,因为当出现此错误时,mapreduce作业将回滚并重试。在这种情况下,目标表中会有大量重复数据


是否有人知道是否有任何sqoop导出参数可以设置为处理特殊字符,或者是否有任何方法可以跳过坏数据,这意味着禁用回滚?谢谢

这可能不仅仅是特殊字符。例如,如果您试图将“abc”填充到数字字段中,该行将被拒绝。即使您得到了这个错误,我相信直到加载之后才应该提交所有可以提交的数据(但我会验证这一点)。如果隔离“缺少的”行,则可以找出数据或字段定义的错误

要寻找的常见事物:

  • 将字符类型数据填充到数字字段中(可能是隐式转换,或者仅在值非空时显示)
  • NULL
    将值放入
    非NULL
    字段
  • 将字符和
    VARCHAR
    octets作为等效项进行计数
    VARCHAR(x)
    表示八位字节,但UTF-8字符可以有多个八位字节
  • 与#3类似,字符串太长,无法放入指定字段
  • 在驱动程序中,批插入被替换为STDIN的
    副本
    语句。您可能可以在
    query\u requests
    中找到该语句,尽管我不确定它是否有用

    Sqoop并没有给您太多的机会进一步研究这个问题(据我所知,我检查了通用JDBC加载程序)。您可以查看
    executeBatch()
    的返回数组,并将其绑定到执行批处理中。也许可以修改通用JDBC加载程序


    希望这有帮助

    为什么不试试Talend?失败的地图任务有什么错误?谢谢你的回答!你是对的。我只是仔细检查了我的源数据。我相信有一些坏数据,比如bigint字段中的字符串。但是,使用当前版本的Sqoop无法跳过错误数据:(你可以做我上面提到的事情,在JDBC加载器的基础上创建一个新的加载器,并检查executeBatch返回数组。不过,我不确定sqoop是什么类型的批处理。根据我对Vertica的
    COPY
    工作原理的了解,我原以为它会加载所有数据,但失败的数据除外。你确定吗e事实并非如此?谢谢你的回答!问题解决了!原来出现错误是因为某些数据比定义长…vsql的副本可以自动截断更长的数据,但sqoop不能。@yuan0122确保你接受woot的回答,如果它解决了你的问题。