1、bulk api奇特的json格式
POST /_bulk{"delete":{"_index":"bobotest","_id":"3"}}{"create":{"_index":"bobotest","_id":"3"}}{"filed":"wuyifanshuaige"}{"index":{"_index":"bobotest","_id":"2"}}{"filed":"test2"}{"update":{"_index":"bobotest","_id":"4"}}{"doc":{"filed":"test4"}}
假如采用可读性比较好的json格式,一般会按照下面的流程进行操作
- 将json数据解析为jsonArray对象,这个时候,整个内存中会出现一份一摸一样的copy,一份为json文本,一份为jsonArray对象
- 解析json中的每个json,为每个请求中的document进行路由
- 为路由到同一个shard上的多个请求,创建请求数组
- 将请求数组序列化。
- 将序列化的数据发送到对应的节点上
一般情况下我们的bulk size的大小一般为10M左右,假设有100个bulk请求发送到一个节点上,每个请求10M,`100个请求为1000M,然后为每个请求的json都copy一封jsonArray对象,此时内存占用就会翻倍,可能会占用2g+的内存。
如果内存占用过多,就会频繁的触发垃圾回收。导致es的虚拟机停止工作线程更多。影响服务。
2、使用现在的奇特的json格式
- 不用将json文本转化为jsonArray对象,根据换行符进行分割
- 对每两个一组的json读取meta,进行document进行路由
- 直接将对应的json发送到node上去
