问题
公司有一个场景是每天需要批量导入大量数据到es中(我们用的是datax),并且字段是动态mapping的,字段越来越多之后终于遇到了这个报错。
代码语言:javascript复制java.lang.IllegalArgumentException: Limit of total fields [1000] in index xxx
简单搜了下其实这是es的默认值,单个索引最大的字段数是1000,超过就报错,写不进去了。
解决办法
解决方法也很简单,把这个1000改大就可以了,很多文档会让你这样改
代码语言:javascript复制PUT my_index/_settings
{
"index.mapping.total_fields.limit": 2000
}
没有kibina的话可以用shell curl
代码语言:javascript复制curl --user admin:admin --header "Content-Type: application/json;charset=UTF-8" -XPUT http://127.0.0.1:9200/my_index/_settings -d '{"index.mapping.total_fields.limit": 2000}'
改完之后用get查一下,果然是2000了,这下应该没问题了吧,重跑了一下,又出错了,还是一样的错,再get一下看看配置,变回1000了,什么鬼。
回过头再分析下
1.导入的是大量数据
2.每天都导
3.用的dataX
翻了一下配置文件发现一个配置
代码语言:javascript复制"cleanup": true
意思是每次导入都重建索引,重建意思是旧索引删除了,重新建一个新的。到这里问题出来了,上面改成2000的索引被删掉了,新建索引又是1000的默认值。
那怎么解决?
重新启动任务,等索引建好了再改成2000,这次成功同步完了,完美。好像又有点不对劲,下一次再同步的时候不是又变成1000了,怎么办。
能不能把这个2000在创建索引的时候就设置好呢?
又翻了下dataX的文档,在示例配置中发现了一个settings的字段,看起来像是可以设置索引的属性,试一下。
代码语言:javascript复制"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.mapping.total_fields.limit":"2000"
}
成功了,这下完美了。
总结一下
问题其实很简单,但是不注意会掉坑里,如果用datax的话为了彻底解决问题,total_fields的配置要写到datax同步的配置文件中,不然下次还报错。