Elasticsearch 中的 Bulk 批量执行方式可以有效地避免内存的消耗

1.Bulk API 的 JSON 格式

    执行了一个 Bulk 指令,使用了 POST _bulk 索引发送指令请求,我 们逐行分析指令的内容。

  •   Index 这一行用来创建索引文档,紧接在这一行后面的 doc 这行就是创建索引文 档的内容。

  •   Create 行也是用来创建索引文档,紧接在这一行后面的 doc 这行也是创建索引文 档的内容。

  •   Delete 这行是用来删除索引文档的,它后面不用跟一行描述删除的内容,因为删 除的内容在_id 这个字段中就可以描述了。

  •   Update 这行是用来更新索引文档的,紧接在这一行后面的 doc 这行用来提供索引 文档的更新。

 

从上面的例子我们可以将 Bulk API 的 JSON 格式进行总结。Bulk 请求报文通常是 成对出现的 JSON 字符串:第一行字符串表示要执行的指令(create、index、 update),第二行字符串是指令执行的内容,字符串之间通过换行符分隔。于是我 们将它的 JSON 格式抽象成如图 3 所示的内容,

Action 的部分表示执行的命令,meta_data 表示目标,也就是索引、类型、文档 ID。

2.Bulk API 底层原理

上面介绍了 Bulk 请求的 JSON 结构以后,这里再来谈谈它的底层原理,为什么使 用这种奇特的 JSON 结构就能够提高系统的性能。先来看看普通请求的 JSON 结 构,如图 4 所示,action 和 data 按照 JSON 的文件结构简历,非常容易阅读,但 是在读取、存储、路由,执行的时候会存在如下问题:

  •   在路由过程中,协调节点收到该请求之后,需要先对该 JSON 字符串进行序列 化,将其序列化为 JSONArray。同时会拷贝到一份数据到内存中,内存中就会同 时存在一份 JSON 文本数据和一份 JSON 对象数据。

  •   然后再解析出 JSONArray 中的每个 JSON 对象,也就是每个指令对象,然后构造 请求报文,并使用路由算法将请求路由到其他节点上,最后执行

这种阅读良好的 JSON 存在的问题很明显,需要更多的内存空间保存 JSON 文件

和 JSON 对象,在网络传输中也会占用带宽。
再来看看 Bulk 是如何处理指令的:
协调节点收到 Bulk 请求之后,直接按照换行符对指令进行分隔。除了 delete 指令 以外的指令都是每两个字符串组成一条指令。通过这种方式获取多个指令,拿到指 令以后读取 metadata 的信息进行路由处理。去掉了将 JSON 文件和 JSON 对象存 放到内存中的步骤,既减少了内存的占用,又降低了网络传输,特别是在海量数据 更新的场景,这种请求方式就显得格外有利。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值