DataX导入ES报错Limit of total fields [1000] in index

2023-05-20 00:50:25 浏览数 (1)

问题

公司有一个场景是每天需要批量导入大量数据到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同步的配置文件中,不然下次还报错。

0 人点赞