zoukankan      html  css  js  c++  java
  • 33.bulk json格式的理解

    bulk json格式的理解

    一、常规格式

    按常规理解,bulk中json格式可以是以下方式

    [{

    "action": {

    },

    "data": {

    }

    }]

    这种方式对程序员友好,可读性好。但是如果写成这样的话,es拿到这种格式的json串以后,要按照下述流程去进行处理:

    1)将json数组解析为JSONArray对象,这个时候,整个数据,就会在内存中出现一份一模一样的拷贝,一份数据是json文本,一份数据是JSONArray对象。(主要问题就出在这里)

    2)解析json数组里的每个json,对每个请求中的document进行路由

    3)为路由到同一个shard上的多个请求,创建一个请求数组

    4)将这个请求数组序列化

    5)将序列化后的请求数组发送到对应的节点上去

       

    由上述步骤分析可以看出,这种方式下会产生以下影响

    耗费更多内存,更多的java虚拟机开销

    举例如下:我们之前学好到过bulk size最佳大小的那个问题,一般建议说在几千条那样,然后大小在10MB左右。现在有100bulk请求发送到了一个节点上去,然后每个请求是10MB,此时document占用内存大约是1GB,然后每个请求的jsoncopy一份为jsonarray对象,此时内存中的占用就会翻倍,就会占用2GB的内存,甚至更好。因为json数据在转换成jsonarray对象之后,还可能会有其他内存消耗。占用更多的内存可能就会挤压其他请求的内存使用量,比如说最重要的搜索请求、分析请求等等,此时就可能会导致其他请求的性能急速下降。另外,json数据在转换成jsonarray对象所产生的内存消耗均是临时内存消耗,这种情况下就会导致java虚拟机的垃圾回收次数更多,更频繁,每次要回收的垃圾对象更多,耗费的时间更多,导致esjava虚拟机停止工作线程的时间更多。

       

    二、bulk规定的格式

    {"action": {"meta"}}

    {"data"}

    这种格式下es处理的好处:

    1)不用将其转换为json对象,直接按照换行符切割json,不会出现内存中的相同数据的拷贝。

    2)对每两个一组的json,读取meta,进行document路由

    3)直接将对应的json发送到node上去

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

  • 相关阅读:
    【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
    hdu3415 Max Sum of Max-K-sub-sequence 单调队列
    HBase总结(十八)Hbase rowkey设计一
    Makefile生成器,使用C++和Boost实现
    quartz cron表达式在线生成
    NS3网络仿真(6): 总线型网络
    连载:面向对象葵花宝典:思想、技巧与实践(35)
    zoj 2921 Stock(贪心)
    11g RAC 加节点 之 手动加入vip 资源
    [Unity3D]Unity+Android交互教程——让手机"动"起来
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8465650.html
Copyright © 2011-2022 走看看