1、bulk api奇特的json格式

  1. POST /_bulk
  2. {"delete":{"_index":"bobotest","_id":"3"}}
  3. {"create":{"_index":"bobotest","_id":"3"}}
  4. {"filed":"wuyifanshuaige"}
  5. {"index":{"_index":"bobotest","_id":"2"}}
  6. {"filed":"test2"}
  7. {"update":{"_index":"bobotest","_id":"4"}}
  8. {"doc":{"filed":"test4"}}

假如采用可读性比较好的json格式,一般会按照下面的流程进行操作

  1. 将json数据解析为jsonArray对象,这个时候,整个内存中会出现一份一摸一样的copy,一份为json文本,一份为jsonArray对象
  2. 解析json中的每个json,为每个请求中的document进行路由
  3. 为路由到同一个shard上的多个请求,创建请求数组
  4. 将请求数组序列化。
  5. 将序列化的数据发送到对应的节点上

一般情况下我们的bulk size的大小一般为10M左右,假设有100个bulk请求发送到一个节点上,每个请求10M,`100个请求为1000M,然后为每个请求的json都copy一封jsonArray对象,此时内存占用就会翻倍,可能会占用2g+的内存。
如果内存占用过多,就会频繁的触发垃圾回收。导致es的虚拟机停止工作线程更多。影响服务。

2、使用现在的奇特的json格式

  1. 不用将json文本转化为jsonArray对象,根据换行符进行分割
  2. 对每两个一组的json读取meta,进行document进行路由
  3. 直接将对应的json发送到node上去