es分布式文档系统_bulk api的奇特json格式与底层性能优化关系
1、bulk api奇特的json格式
{"action":{"meta"}}\n
{"data"}\n
{"action":{"meta"}}\n
{"data"}\n
2、如果采用比较良好的json数组格式
[{
"action":{
"meta"
},
"data":{
}
}]
允许任意的换行,整个可读性非常的棒,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的内存,甚至还不止,因为弄成JSONAray之后,还可能会多搞一些其他的数据结构,2GB+的内存占用。
占用更多的内存就会挤压其他请求的内存使用量,比如最重要的搜索请求,分析请求等等,此时就可能会导致其他请求的性能急速下降。另外,占用内存更多,就会导致java虚拟机的垃圾回收次数更多,更频繁,每次需要回收的垃圾对象更多,导致es的java虚拟机停止工作线程的时间更多。
4、现在的奇特格式
(1)不用将其转化为JSONArray对象,不会出现内存中的相同数据的拷贝,直接按照换行符切割json
(2)对每两个一组的json,读取meta,进行document路由
(3)直接将对应的json发送到node上
最大的优势是,不需要将json数组解析为一个JSONArray对象,形成一份大数据的拷贝,浪费内存空间,最终尽可能地保证性能。
es分布式文档系统_bulk api的奇特json格式与底层性能优化关系的更多相关文章
- Elasticsearch由浅入深(六)批量操作:mget批量查询、bulk批量增删改、路由原理、增删改内部原理、document查询内部原理、bulk api的奇特json格式
mget批量查询 批量查询的好处就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的 ...
- 分布式文档系统_document查询内部原理
1.客户端发送请求到任意一个node,成为coordinate node2.coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮 ...
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...
- ElasticSearch 5学习(8)——分布式文档存储(wait_for_active_shards新参数分析)
学完ES分布式集群的工作原理以及一些基本的将数据放入索引然后检索它们的所有方法,我们可以继续学习在分布式系统中,每个分片的文档是被如何索引和查询的. 路由 首先,我们需要明白,文档和分片之间是如何匹配 ...
- 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等
本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...
- Elasticsearch必知必会的干货知识一:ES索引文档的CRUD
若在传统DBMS 关系型数据库中查询海量数据,特别是模糊查询,一般我们都是使用like %查询的值%,但这样会导致无法应用索引,从而形成全表扫描效率低下,即使是在有索引的字段精确值查找,面对海量数 ...
- elasticsearch 基础 —— _mget取回多个文档及_bulk批量操作
取回多个文档 Elasticsearch 的速度已经很快了,但甚至能更快. 将多个请求合并成一个,避免单独处理每个请求花费的网络延时和开销. 如果你需要从 Elasticsearch 检索很多文档,那 ...
- ElasticSearch权威指南学习(分布式文档存储)
路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...
- es删除文档或者删除索引
es删除文档或者删除索引 学习了:https://www.imooc.com/video/15771 删除文档: DELETE http://127.0.0.1:9200/people/man/1 删 ...
随机推荐
- 执行start-dfs.sh后,datenode没有启动的解决办法
执行start-dfs.sh后,datenode没有启动,很大一部分原因是因为在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令(hdfs namenode -format) ...
- linux memcached开机启动
方法一: 在/etc/rc.d/rc.local 加入以下代码 /usr/local/memcached/bin/memcached -u root -d -m -l -P /tmp/memcache ...
- 4、一、Introduction(入门):3、System Permissions(系统权限)
3.System Permissions(系统权限) Android is a privilege-separated operating system, in which each applic ...
- SQL创建索引
http://www.w3school.com.cn/sql/sql_create.asp 注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新.因此,理想的做法 ...
- redis aof和rdb区别
转自https://blog.csdn.net/m0_38110132/article/details/76906422 1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由 ...
- AndroidのInputFillter之按字符过滤长度,一个中文当两个字符
/** * 以Byte数的方式来实现的LengthFilter * @author bvin */ public class OneByteInputFilter implements InputFi ...
- C# Post HTTP Request
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Secu ...
- oracle 创建表同时添加注释
创建数据库表.添加注释的方法: create table WARNINGRECORD ( RecordID ) primary key not null ); comment on column WA ...
- Java 正则表达式 过滤html标签
extends:http://aguang520.iteye.com/blog/1056686# 前段时间开发的时候要读取一篇文章的简介内容(也就是前200个字符),使用了隐藏字段,可能有人就要问了, ...
- 01List.ashx(班级列表动态页面)
01List.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...