1. 程式人生 > 其它 >canal adapter同步異常:field name is null or empty

canal adapter同步異常:field name is null or empty

技術標籤:問題canal adaptercanal異常

現象

在使用批量同步資料時出現錯誤:

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