Elasticsearch bulk api奇特的json格式

bulk api奇特的json格式

{"action": {"meta"}}\n
{"data"}\n
{"action": {"meta"}}\n
{"data"}\n

[{
  "action": {
 
  },
  "data": {

  }
}]

1、bulk中的每个操作都可能要转发到不同的node的shard去执行

2、如果采用比较良好的json数组格式

允许任意的换行,整个可读性非常棒,读起来很爽,es拿到那种标准格式的json串以后,要按照下述流程去进行处理

(1)将json数组解析为JSONArray对象,这个时候,整个数据,就会在内存中出现一份一模一样的拷贝,一份数据是json文本,一份数据是JSONArray对象
(2)解析json数组里的每个json,对每个请求中的document进行路由
(3)为路由到同一个shard上的多个请求,创建一个请求数组
(4)将这个请求数组序列化
(5)将序列化后的请求数组发送到对应的节点上去

3、耗费更多内存,更多的jvm gc开销

我们之前提到过bulk size最佳大小的那个问题,一般建议说在几千条那样,然后大小在10MB左右,所以说,可怕的事情来了。假设说现在100个bulk请求发送到了一个节点上去,然后每个请求是10MB,100个请求,就是1000MB = 1GB,然后每个请求的json都copy一份为jsonarray对象,此时内存中的占用就会翻倍,就会占用2GB的内存,甚至还不止。因为弄成jsonarray之后,还可能会多搞一些其他的数据结构,2GB+的内存占用。

占用更多的内存可能就会积压其他请求的内存使用量,比如说最重要的搜索请求,分析请求,等等,此时就可能会导致其他请求的性能急速下降
另外的话,占用内存更多,就会导致java虚拟机的垃圾回收次数更多,跟频繁,每次要回收的垃圾对象更多,耗费的时间更多,导致es的java虚拟机停止工作线程的时间更多

4、现在的奇特格式

{"action": {"meta"}}\n
{"data"}\n
{"action": {"meta"}}\n
{"data"}\n

(1)不用将其转换为json对象,不会出现内存中的相同数据的拷贝,直接按照换行符切割json
(2)对每两个一组的json,读取meta,进行document路由
(3)直接将对应的json发送到node上去

5、最大的优势在于,不需要将json数组解析为一个JSONArray对象,形成一份大数据的拷贝,浪费内存空间,尽可能地保证性能


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`_bulk` 是 Elasticsearch 提供的一个 API,用于批量索引、更新或删除多个文档。 使用 `_bulk` API 可以大大提高索引、更新或删除大量文档的效率,避免多次发送单个请求。 以下是使用 `_bulk` API 的基本步骤: 1. 准备请求体:创建一个包含多个操作的请求体,每个操作都指定了要执行的操作类型(索引、更新或删除)和相应的文档数据。每个操作由两部分组成:操作指令和文档数据。操作指令用于指定要执行的操作类型和文档的元数据。 2. 发送请求:将准备好的请求体发送到 Elasticsearch 的 `_bulk` API 端点。可以使用 HTTP POST 方法发送请求,并将请求体作为请求主体发送。 3. 处理响应:Elasticsearch 将返回一个响应,其中包含每个操作的结果。你可以根据需要解析响应,并处理每个操作的结果。 以下是一个使用 `_bulk` API 的示例请求体: ``` POST /<index>/_bulk { "index" : { "_index" : "myindex", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "myindex", "_id" : "2" } } { "update" : { "_index" : "myindex", "_id" : "3" } } { "doc" : { "field2" : "value2" } } ``` 在这个示例中,请求体包含了两个索引操作、一个删除操作和一个更新操作。 注意:请求体中的每个操作都必须是一行的 JSON 格式,并以换行符分隔。 希望这个简单的解释可以帮助你理解 `_bulk` API 的基本用法。如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值