在使用大資料開發套件時最常用的就是資料同步子產品,工單裡最常見的問題就是其中資料同步的問題,這裡總結一些常見一些從maxcompute(原名odps)到其他資料源的同步任務報錯案例,主要是日志中出現資料復原寫入的問題。
那首先看下日志中資料復原的原因,當資料寫入rds或者hybriddb等一些支援事務的資料庫中,資料批量寫入,一旦由于各種原因沒有寫入成功,這個批次的資料會復原重新寫入,如果再次寫入失敗,就會報髒資料的錯誤導緻任務失敗。資料寫入失敗可能是以下原因導緻復原。
1,髒資料(資料值超過資料類型最大範圍,資料類型不對應等等)
2,目标資料源字段設定,比如預設不允許為空
3,主鍵沖突
4,目标資料源本身負載太高,寫入時死鎖
5,同步的設定的速度太大,比如資料量很大,速度設為10m/s。
常見復原日志報錯示例:
下面來看幾個案例
<b></b>
案例一: maxcompute到hybriddb的資料同步任務報錯,錯誤提示:
問題定位:
有資料復原操作,初步定位為資料在hybriddb寫入失敗,復原寫入失敗,出現髒資料大于使用者設定的0條。任務終止。
問題排查:
看到日志中出現下面報錯:

排檢視到日志中有顯眼的一句:
那麼問題基本定位到:是因為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到其他資料庫的一些常見典型的案例,有不足的地方希望讀者聯系我指出來。
文章作者:上單