现象
在使用批量同步数据时出现错误:
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