批量操作bulk
介绍bulk批量操作API
为了实现多个文档的create、index、update或delete。
官网文档:Bulk API | Elasticsearch Reference [6.2] | Elastic
请求体格式
action#请求体格式如下:
{action:{ metadata}}\n
{request body}\n
{action:{metadata}}\n
{request body}\n
...
#\n是换行的转义符号,bulk通过换行识别每一个请求数据,不换行bulk无法区分。json数据不可美化展示。(如图:不能美化展示),因为美化展示的话,就会有多余的换行,bulk无法识别。
为什么是这样的请求体格式:和Elasticsearch的架构设计有关,Elasticsearch的数据是分片的,分片分布在每个节点上,如果请求的数据不换行,会消耗很大的资源解析数据,如果批量操作的数据很大,所需要的内存和cpu资源会很高,不符合Elasticsearch实时快速的特点,Elasticsearch通过换行,在网络缓冲区中,一行一行读取数据,能够更加快速和低消耗的处理每个请求
不能美化展示、例:{"delete":{"_index":"library","_type":"books","_id":"1"}}
#多重模式
#批量操作bulk
POST /library/books/_bulk
{ "index": {"_id":1}}
{"title":"Elasticsearch: The Definitive Guide","price":5}
{"index": {"_id":2}}
{"title":"The Elasticsearch cookbook","price":15}
{"index":{"_id":3}}
{"title":"Elasticsearch Blueprints","price":9}
{"index":{"_id":4}}
{"title":"Thinking in Python","price":22}
{"index":{"_id":5}}
{"title":"Thinking in Java","price":7}
GET /library/
GET /library/books/_mget
{
"ids": ["1","2","3","4","5"]
}
#当然还可以有delete,update等操作
#注意delete下面没有具体的request body
POST /library/books/_bulk
{"delete":{"_index":"library","_type":"books","_id":"1"}}
{"create":{"_index":"music","_type":"classical","_id": "1"}}
{"title": "Ave Verum Corpus" }
{"index":{"_index": "music","_type": "classical"}}
{"title":"Litaniac de Venerabili Altaris Sacromento"}
{"update": {"_index": "library","_type":"books","_id":"2"}}
{"doc":{"price":"18"}}
GET /library/books/1
GET /library/books/_mget
{
"ids": ["1","2","3","4","5"]
}
bulk处理文档大小的最佳值
数据加载在每个节点里的RAM里
请求的数据超过一定的大小,那bulk的处理性能就会降低
文档数据大小跟硬件配置、文档复杂度,以及当前集群的负载有关
如何确定文档数据的大小
在实际环境当中,慢慢增加数据量,然后观察集群性能的变化,比如可以根据当前集群的情况,依次先处理5000个文档,如果没有什么大问题,可以在增加5000,直到开始发现性能有所下降为止,在操作的时候,最好通过,插件,监控仪表数据综合判断
网友评论