elasticsearch 大数据下 bulk 优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch 大数据下 bulk 优化相关的知识,希望对你有一定的参考价值。

参考技术A es中 bulk api 可以在单个API调用中执行许多索引/删除操作,这可以大大提高索引速度。在线上突然遇到这样错误:

业务反馈,才1w多条就报这个!如果你对nginx足够的了解会发现这个错误是它的,接下来要看nginx的配置文件,最终确人有个参数值 client_max_body_size 太小,那就改大些吧!那es能接受多大的呢?es的bulk的批量究竟该多大,之前讲过,这里不再啰嗦。

那就5000条一个批次,但是es还是比较慢!这里分享几个优化的小技巧

调整refresh时间间隔,优化点: 减少刷新频率,降低潜在的写磁盘性能损耗, 默认的刷新时间间隔是1s,对于写入量很大的场景,这样的配置会导致写入吞吐量很低,适当提高刷新间隔,可以提升写入量,代价就是让新写入的数据在60s之后可以被搜索,新数据可见的及时性有所下降。

在bulk大量数据到ES集群的时候可以关闭刷新频率,把其值设置为-1就是关闭了刷新频率,在导入完之后设置成合理的值即可。

调整replica数目,在bulk大量数据到ES集群的可以把副本数设置为0,在数据导入完成之后再设置为1或者你集群的适合的数目。

Index中默认会有_all这个字段(es6.x已经禁用),默认会把所有字段的内容都拷贝到这一个字段里面,这样会给查询带来方便,但是会增加索引时间和索引尺寸。

translog默认为512MB,flush操作达到512MB fsync刷新到硬盘(这个问题不大),而translog是默认是每次index请求都写磁盘,优化点: 减少写磁盘的频率,调整为index.translog.durability=async,index.translog.sync_interval=30s(默认值是5s)

更多

由于es自动检测和添加新字段称为动态映射,我见过由于环境问题发生mapping漏设置,这时有300~400个字段自动映射为text类型(太多),导致每批次(5000条)插入响应时间都大于3分钟。总之,检查mapping的合理性很重要。

修改配置文件调整ES的JVM内存大小,这个值不能超过32g,一般机器好点设置成十几个g速度就非常快了。具体要看自己机器的内存。

优化项按顺序进行,越靠前优化效果越明显。

以上是关于elasticsearch 大数据下 bulk 优化的主要内容,如果未能解决你的问题,请参考以下文章

java操作elasticsearch实现批量添加数据(bulk)

如何使用 elasticsearch.helpers.streaming_bulk

Elasticsearch —— bulk批量导入数据

php-elasticsearch bulk批量插入数据

Elasticsearch之批量操作bulk

Elasticsearch之批量操作bulk