在插入到表中时遇到重复条目问题。
我用hadoop mapper从文件中读取记录,它成功地从文件中完全读取了记录,但在hadoop reducer将记录写入mysql数据库时,出现了以下错误。
java.io.ioexception:键“primary”的条目“505975648”重复
但mysql表仍然为空。无法从hadoop dbwritable reducer将记录写入mysql表。
以下是错误日志:
警告:com.mysql.jdbc.exceptions.jdbc4.mysqlnontransientconnectionexception:connection.close()已被调用。此状态下的操作无效。在sun.reflect.nativeconstructoraccessorimpl.newinstance0(本机方法)在sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl)。java:57)在sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl。java:45)在java.lang.reflect.constructor.newinstance(constructor。java:526)在com.mysql.jdbc.util.handlenewinstance(util。java:406)在com.mysql.jdbc.util.getinstance(util。java:381)在com.mysql.jdbc.sqlerror.createsqlexception(sqlerror。java:984)在com.mysql.jdbc.sqlerror.createsqlexception(sqlerror。java:956)在com.mysql.jdbc.sqlerror.createsqlexception(sqlerror。java:926)在com.mysql.jdbc.connectionimpl.getmutex(connectionimpl。java:3018)在com.mysql.jdbc.connectionimpl.rollback(connectionimpl。java:4564)在org.apache.hadoop.mapred.lib.db.dboutputformat$dbrecordwriter.close(dboutputformat。java:72)在org.apache.hadoop.mapred.reducetask$oldtrackingrecordwriter.close(reducetask。java:467)在org.apache.hadoop.mapred.reducetask.runoldreducer(reducetask。java:539)在org.apache.hadoop.mapred.reducetask.run(reducetask。java:421)在org.apache.hadoop.mapred.localjobrunner$job.run(localjobrunner。java:262)
2004年6月,2014年1:23:36 pm org.apache.hadoop.mapred.localjobrunner$job run警告:job\u local\u 0001 java.io.ioexception:org.apache.hadoop.mapred.lib.db.dboutputformat$dbrecordwriter.close(dboutputformat)上键“primary”的重复条目“505975648”。java:77)在org.apache.hadoop.mapred.reducetask$oldtrackingrecordwriter.close(reducetask。java:467)在org.apache.hadoop.mapred.reducetask.runoldreducer(reducetask。java:531)在org.apache.hadoop.mapred.reducetask.run(reducetask。java:421)在org.apache.hadoop.mapred.localjobrunner$job.run(localjobrunner。java:262)
1条答案
按热度按时间eqoofvh91#
dboutputformat/dbrecordwriter执行数据库事务中的所有操作。虽然现在表中可能什么都没有,但如果尝试在同一事务中使用同一主键进行两次插入,则会出现此错误,这就是所发生的情况。为了更好地跟踪这一点,可以添加日志记录。您可以通过获取dboutputformat的代码并创建一个新的类似命名的类来实现这一点。我叫我的loggingdboutputformat。更新作业代码以改用此新的输出格式。对于新的输出格式,您可以更改close方法,以便在执行语句之前记录它们:
然后可以检查mysql端的常规日志,查看是否执行了任何操作。很可能您会看到您的事务是基于错误回滚的。要解决此问题,请确保主键是唯一的。如果更新/升级是您想要的,那么您可以制作一个输出/记录编写器来实现这一点,但这是一个不同的任务。