canal adapter同步異常:field name is null or empty
阿新 • • 發佈:2021-01-29
現象
在使用批量同步資料時出現錯誤:
curl http://127.0.0.1:8081/etl/es7/test-user/test_user.yml -X POST {"succeeded":false,"resultMessage":"匯入ES 資料:666 條","errorMessage":"test_user etl failed! ==>field name is null or empty\ntest_user etl failed! ==>field name is null or empty"}
adapter日誌異常
ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - java.lang.NullPointerException java.lang.RuntimeException: java.lang.NullPointerException at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:116) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:64) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:115) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:94) ~[na:na] at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.batchSync(AdapterProcessor.java:139) ~[client-adapter.launcher-1.1.5-SNAPSHOT.jar:na]
原因分析
提示資訊為欄位名為null或空,誤導以為是欄位的問題,其實不是,應該是欄位空值導致,但不是對任何欄位都有空值錯誤,最後確定只有在es索引的主鍵_id欄位為空時才會出現異常。
因為在我的匯入場景中,es使用了userid作為主鍵,批量匯入時資料較多,其中存在個別userid為空的情況沒有發現,導致在全量匯入時出現了異常。
解決方案
方案一:
使用非空欄位作為es的主鍵_id;
方案二:
在esMapping匯入配置中增加條件賽選非空資料,如:
etlCondition: "where userid between {} and {}" #指定userid