大数据开发套件中数据同步-日志报错回滚信息的一些问题总结

在使用大数据开发套件时最常用的就是数据同步模块,工单里最常见的问题就是其中数据同步的问题,这里总结一些常见一些从MaxCompute(原名ODPS)到其他数据源的同步任务报错案例,主要是日志中出现数据回滚写入的问题。

那首先看下日志中数据回滚的原因,当数据写入rds或者hybridDB等一些支持事务的数据库中,数据批量写入,一旦由于各种原因没有写入成功,这个批次的数据会回滚重新写入,如果再次写入失败,就会报脏数据的错误导致任务失败。数据写入失败可能是以下原因导致回滚。
1,脏数据(数据值超过数据类型最大范围,数据类型不对应等等)
2,目标数据源字段设置,比如默认不允许为空
3,主键冲突
4,目标数据源本身负载太高,写入时死锁
5,同步的设置的速度太大,比如数据量很大,速度设为10M/s。

常见回滚日志报错示例:

 2017-01-01 17:01:32.544 [16876048-0-0-writer] WARN  CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交.
因为:java.sql.BatchUpdateException: INSERT, DELETE command denied to user 'xxx'@'xx.xx.xx.xx' for table 'report'

下面来看几个案例


案例一: MaxCompute到hybridDB的数据同步任务报错,错误提示:

INSERT INTO hybrid_schema.dim_bz_317hu_account_gold_stg (id,account_id,hospital_id,total_gold,valid_flag,withhold,type,com_date_id,com_hour_id,from_source,create_time,update_time,creator,updater) VALUES('7933'::int8,'33718'::int8,'560'::int8,'0.0'::float8,'ENABLE'::varchar,'0.0'::float8,'1'::int8,'20170322'::int8,'11031'::int8,'bz_317hu'::varchar,'2017-03-22 10:31:45.000000 +08:00:00'::timestamp,'2017-03-22 10:31:45.000000 +08:00:00'::timestamp,'liuchang'::varchar,'liuchang'::varchar) was aborted.  Call getNextException to see the cause.
2017-03-23 00:51:34.154 [job-24934082] INFO  LocalJobContainerCommunicator - Total 47 records, 4672 bytes | Speed 0B/s, 0 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.000s |  All Task WaitReaderTime 0.000s | Percentage 0.00%
2017-03-23 00:51:37.976 [24934082-0-9-writer] WARN  CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交. 因为:Batch entry 0 INSERT INTO hybrid_schema.dim_bz_317hu_account_gold_stg (id,account_id,hospital_id,total_gold,valid_flag,withhold,type,com_date_id,com_hour_id,from_source,create_time,update_time,creator,updater) VALUES('7931'::int8,'39316'::int8,'568'::int8,'0.0'::float8,'ENABLE'::varchar,'0.0'::float8,'1'::int8,'20170322'::int8,'11016'::int8,'bz_317hu'::varchar,'2017-03-22 10:16:04.000000 +08:00:00'::timestamp,'2017-03-22 10:16:04.000000 +08:00:00'::timestamp,'liuchang'::varchar,'liuchang'::varchar) was aborted.  Call getNextException to see the cause.
2017-03-23 00:51:38.987 [24934082-0-9-writer] ERROR StdoutPluginCollector -
org.postgresql.util.PSQLException: ERROR: deadlock detected
  Detail: Process 42073445 waits for ExclusiveLock on resource queue 6055; blocked by process 50785454.
Process 50785454 waits for ShareUpdateExclusiveLock on relation 853985 of database 17163; blocked by process 51099525.
Process 51099525 waits for ExclusiveLock on resource queue 6055; blocked by process 42073445.
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:412) ~[postgresql-9.3-1102-jdbc4.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doOneInsert(CommonRdbmsWriter.java:382) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doBatchInsert(CommonRdbmsWriter.java:362) [plugi

问题定位:
有数据回滚操作,初步定位为数据在hybridDB写入失败,回滚写入失败,出现脏数据大于用户设置的0条。任务终止。

问题排查:
看到日志中出现下面报错:

排查看到日志中有显眼的一句:

org.postgresql.util.PSQLException: ERROR: deadlock detected

 那么问题基本定位到:是因为hybridDB这边表出现死锁,数据写不进去,报脏数据,任务失败。
导致hybridDB死锁的原因可能是这个表的负载很大,排查一下用户配置:同步速率设置的10M/s,那就非常有可能是这个速度和用户的数据量太大,写入负载太高导致死锁。

解决方法:根据自己数据量和需求设置同步速度,这个案例建议用户调小一些同步速率,错开高峰,把任务放到低谷时期执行。


案例二:目标数据库设置字段不能为空,数据中有null值,同步报错:

问题定位:报错显示目标数据库中的有些字段设置的是cannot be null,而数据中有null值。导致失败
解决方案:修改目标数据库中的字段设置,如果此字段必须不能为空,核对下数据来源保证不能为空,或者对数据预处理一下null值。


案例三:数据同步到rds时,MaxCompute中有重复数据,rds中设置主键,导致主键冲突。

问题定位:日志中有回滚写入操作,报错提示 Detail: Key (id)=(2022080640) already exists.可以定位是主键冲突了,
原因是rds中设置主键的这个字段在MaxCompute中存在重复,并不是唯一值。
解决方案:
1,建议重新建一张没有主键的表。
2,如果要主键,选择MaxCompute中有唯一约束的字段。

3,业务上允许的话,可以先对MaxCompute中的数据进行去重再同步。


案例四:数据同步到rds,rds端字段数据类型设置太小。

原因定位:数据同时出现回滚,报错:java.sql.BatchUpdateException: Data truncation: Data too long for column 'flash' at row 1
MaxCompute中的数据字段值,超出rds表中设置的数据类型的阈值,导致写入失败。
解决方案:去rds中调大这个字段的对应数据类型值

总结:数据同步任务涉及多种数据源,问题类型也是比较多。那从日志中排查报错是比较常见的方式。本文就罗列了一些MaxCompute到其他数据库的一些常见典型的案例,有不足的地方希望读者联系我指出来。

文章作者:上单

时间: 2017-04-05

大数据开发套件中数据同步-日志报错回滚信息的一些问题总结的相关文章

基于大数据开发套件的增量同步策略

今天我们来讨论如何使用大数据开发套件进行增量同步. 我们把需要同步的数据,根据数据写入后是否会发生变化,分为会变化的数据(人员表比如说,人员的状态会发生变化)和不会发生变化的数据(一般是日志数据).针对这两种场景,我们需要设计不同的同步策略.这里以把业务RDS数据库的数据同步到MaxCompute为例做一些说明,其他的数据源的道理是一样的.根据等幂性原则(也就是说一个任务,多次运行的结果是一样的,这样才能支持重跑调度.如果任务出现错误,也比较容易清理脏数据),我每次导入数据都是导入到一张单独的表

云享团——基于大数据开发套件的增量同步策略

免费开通大数据服务:https://www.aliyun.com/product/odps 转载自云享团 因为近期遇到用户在做ETL操作导入数据到MaxCompute的时候,对如何设置数据同步策略有疑惑,所以今天第一波我们来聊一下数据的同步策略,根据数据的特性,看看哪些数据适合增量同步,哪些适合全量同步,又是如何实现的?请认真看完下面的介绍,这些问题都不是事儿. 我们把需要同步的数据,根据数据写入后是否会发生变化分为:会变化的数据(人员表比如说,人员的状态会发生变化)和不会发生变化的数据(一般是

大数据开发套件-数据集成-云mongo跨区域如何同步到Maxcompute

在大数据开发套件中是可以实现mongo同步到Maxcompute. 数据集成文档:https://help.aliyun.com/document_detail/47677.html?spm=5176.7750354.6.599.jGn50I后端是通过华东1区的调度资源进行数据的调度传输.但是如果阿里云mongo不在华东1在其他区域,使用默认资源组就不能正常同步了.那么就需要用户通过自己添加调度机器进行同步.1,准备一台调度服务器,要求必须和云mongo相同网络类型相同的区域.官方文档:http

大数据开发套件—数据集成常见问题

我们在进行大数据开发过程中,会遇到各种问题,本文将定期收集整理一些在使用阿里云数加 大数据开发套件 过程中遇到的常见问题,供大家参考~ Q: 配置数据同步任务,在选择数据源时,出现下图中的错误,该怎么办? A: 建议您刷新页面,清空缓存,重新登录. Q:数据同步时,如何进行增量同步? A: 具体操作可参考 数据增量同步 文档 . Q:新增数据源时,RDS 数据源测试连通性不通怎么办? A:当 RDS 数据源测试连通性不通时,需要到自己的 RDS 上添加数据同步机器 IP 白名单: 10.152.

大数据开发套件—调度运维常见问题

我们在进行大数据开发过程中,会遇到各种问题,本文将定期收集整理一些在使用阿里云数加 大数据开发套件 时遇到的常见问题,供大家参考~ Q. 如果之前提交的任务修改后再次提交,是否会影响当天的任务调度? A. 根据修改的内容来确定是否会影响:如果修改的只是 sql 语句,则不会影 响:如果修改自定义参数和调度配置以后重新提交的,都会影响当天的任 务调度 . Q. 创建一个新的工作流任务,如果保存后没有提交任务,是否可以进行测试? A. 仅保存后没有提交,sql 任务可以在本地运行,但不可以提交测试

阿里云大学精品课程:深入理解阿里云数加大数据开发套件Data IDE-基本知识

阿里云大学精品课程:深入理解阿里云数加大数据开发套件Data IDE-基本知识 写在最前面 >>>进入了解更多>>>阿里云数加·MaxCompute大数据计算服务. 基于阿里云数加·MaxCompute构建大数据仓库的开发工具利器Data IDE<MaxCompute(原ODPS)开发入门指南--数据开发工具篇>,那么基于Data IDE进行数据开发想必也遇到一些不少的困惑,就自己在培训过程中的一些经验或者说阿里集团内的踩坑之路与大家在此分享,也欢迎拍砖.

【大数据新手上路】“零基础”系列课程--如何通过大数据开发套件Data IDE玩转大数据

免费开通大数据服务:https://www.aliyun.com/product/odps 老板每天都要出这些业务数据(销售总额.总交易量.总点击次数.总加入购物车次数.总加入收藏夹次数...),我得想个一劳永逸的方法了- 幸好,我有数加神器大数据开发套件Data IDE,搞定业务工作流调度,每日定时自动执行任务,分分钟输出计算结果. 妈妈再也不用担心我焦头奋战了-- 本教程是一个大数据开发套件Data IDE零基础教程,通过Data IDE将多源异构的数据集导入云端MaxCompute,进行计

【大数据开发套件调度配置实践】——不同周期任务依赖配置

大数据开发过程中常遇到不同运行周期的任务进行依赖,常见 天任务依赖小时任务. 小时任务依赖分钟任务 .那么如何通过大数据开发套件开发这两种场景呢? 本文将从这两个场景出发,结合调度依赖/参数/调度执行等,介绍不同周期调度依赖的最佳操作实践. 再此之前,我们先明确几个概念: 业务日期:业务数据产生的日期,这里指完整一天的业务数据.在大数据开发套件里任务每天能处理的最近的完整一天业务数据是昨天的数据,所以业务日期=日常调度日期-1天. 依赖关系:依赖关系是描述两个或多个节点/工作流之间的语义连接关系

【大数据开发套件调度配置实践】——调度任务各种周期配置和调度形态

数加·大数据开发套件目前支持任务调度周期有五种:天.周.月.分钟.小时.本文将介绍这五种周期的配置和调度形态. 调度规则--调度任务是否能运行起来要满足的条件: 上游任务实例是否都运行成功.若所有上游任务实例都运行成功则触发任务进入等待时间状态. 任务实例定时时间是否已经到.任务实例进入等待时间状态后会check本身定时时间是否到,如果时间到了则进入等待资源状态: 当前调度资源是否充足.任务实例进入等待资源状态后,check当前本项目调度资源是否充足,若充足则可以运行起来. 天调度任务 天调度任