简介
这篇文章主要讨论一下ElasticSearch文档写入的关键步骤以及在使用ES Client使用过程的一些需要主要的问题。如果对ElasticSearch的基础概念不熟悉的同学可以先看一下上一篇文章【从0到1理解ElasticSearch文档写入和检索原理】。
创建索引
创建索引脚本
#创建索引 #定义索引的mapping |
---|
注意点
- close dynamic mapping防止意外字段玷污, 参考资料:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/dynamic.html
- text和keyword并用,可以用于trem和match,参考资料:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/multi-fields.html
数据写入
Curl写入
curl -X PUT "localhost:9200/product_v1/_doc/1?pretty" -H 'Content-Type: application/json' -d' |
---|
es Client写入
Es Client(<6.8.5 和 <7.5 )自身的死锁
1.ES Client的内置scheduler线程池定时调用线程A来flush()数据
2.线程A阻塞等待数据写入任务,写入数据网络异常会尝试retry(),retry()也是放入scheduler线程池中执行
3.但scheduler线程池的coreSize=1,线程A正在使用此线程,导致retry()任务一直阻塞等待空闲线
4.Retry()任务不执行,那么线程A的flush()任务也一直卡死等待
ES issue:
https://github.com/elastic/elasticsearch/issues/47599
https://github.com/elastic/elasticsearch/issues/44556
ES 客户端bulkIndex流程细节,如下:
ES 6.8.5/7.5 如何修复上述DeadLock?官方采用:初始化两个scheduler,分别给flush() 和retry()来使用
https://github.com/jakelandis/elasticsearch/commit/b7b59329c247ff61715f21f5c0f409a059249909
写入优化
- 首次批量导入,设置 index.number_of_replicas = 0关闭副本,然后在写入完成后再开启副本,恢复过程本质上只是一个字节到字节的网络传输;
- 加大translog flush间隔,目的是降低iops、writeblock默认是每个请求都持久化到translog, index.translog.durability:requestindex.translog.durability:async表示translog的刷盘策略按sync_interval周期进行③加大 index.refresh_interval的间隔,降低I/O,降低segment merge请求;
- 调整bulk请求;
- 段合并优化。
参考资料:
elastic: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index.html
上一篇:【从0到1理解ElasticSearch文档写入和检索原理】
下一篇:【从0到1快速了解ElasticSearch数据检索】
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/212303.html