阿里云大数据工厂DataWorks学习之--数据同步任务常见日志报错总结

阿⾥云⼤数据⼯⼚DataWorks学习之--数据同步任务常见⽇志
报错总结
在使⽤⼤数据开发套件时最常⽤的就是数据同步模块,⼯单⾥最常见的问题就是其中数据同步的问题,这⾥总结⼀些常见⼀些从
Maxcompute到其他数据源的同步任务报错案例,主要是⽇志中出现数据回滚写⼊的问题。
那⾸先看下⽇志中数据回滚的原因,当数据写⼊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'@'' 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,f
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 by 2017-03-23 00:51:37.976 [24934082-0-9-writer] WARN  CommonRdbmsWriter$Task - 回滚此次写⼊, 采⽤每次写⼊⼀⾏⽅式提交. 因为:Batch entry 0 INSERT INT 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 iveErrorResponse(QueryExecutorImpl.java:2198) ~[postgresql-9.3-1102-jdbc4.jar:na]
at v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927) ~[postg
resql-9.3-1102-jdbc4.jar:na]
at ute(QueryExecutorImpl.java:255) ~[postgresql-9.3-1102-jdbc4.jar:na]
at org.postgresql.ute(AbstractJdbc2Statement.java:561) ~[postgresql-9.3-1102-jdbc4.jar:na]
at org.postgresql.uteWithFlags(AbstractJdbc2Statement.java:419) ~[postgresql-9.3-1102-jdbc4.jar:na]
at org.postgresql.ute(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时,odps中有重复数据,rds中设置主键,导致主键冲突。
问题定位:⽇志中有回滚写⼊操作,报错提⽰ Detail: Key (id)=(2022080640) already exists.可以定位是主键冲突了,
原因是rds中设置主键的这个字段在odps中存在重复,并不是唯⼀值。
解决⽅案:
1,建议重新建⼀张没有主键的表。
2,如果要主键,选择odps中有唯⼀约束的字段。
3,业务上允许的话,可以先对odps中的数据进⾏去重再同步
案例三:数据同步到rds,rds端字段数据类型设置太⼩。
原因定位:数据同时出现回滚,报错:java.sql.BatchUpdateException: Data truncation: Data too long for column 'flash' at row 1
Maxcompute中的数据字段值,超出rds表中设置的数据类型的阈值,导致写⼊失败。
解决⽅案:去rds中调⼤这个字段的对应数据类型值
案例四、odps同步数据超过24⼩时
maxcompute tunnel session 超时时间为24⼩时。
数据规模太⼤,传输时间已经超过24⼩时会报异常。
解决⽅案:
另外也建议把数据分开上传
总结:数据同步任务涉及多种数据源,问题类型也是⽐较多。那从⽇志中排查报错是⽐较常见的⽅式。本⽂就罗列了⼀些Maxcompute到其他数据库的⼀些常见典型的案例,有不⾜的地⽅希望读者联系我指出来啊
有对⼤数据技术感兴趣的,可以加笔者的 wx4085116.⽬前笔者已经从阿⾥离职,博客不代表阿⾥⽴场。笔者开了⼀个⼤数据培训班。有兴趣的加我。

本文发布于:2024-09-21 13:42:47,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/386817.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   设置   任务   导致   主键   数据类型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议