前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DataX导入ES报错Limit of total fields [1000] in index

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

原创
作者头像
用户6404053
发布2023-05-20 00:50:25
9350
发布2023-05-20 00:50:25
举报
文章被收录于专栏:CatororyCatorory

问题

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决办法
  • 回过头再分析下
  • 那怎么解决?
  • 总结一下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档