bulk Java提交数据,性能优化 – bulk提交 - ELK Stack 中文指南

在 CRUD 章节,我们已经知道 ES 的数据写入是如何操作的了。喜欢自己动手的读者可能已经迫不及待的自己写了程序开始往 ES 里写数据做测试。这时候大家会发现:程序的运行速度非常一般,即使 ES 服务运行在本机,一秒钟大概也就能写入几百条数据。

这种速度显然不是 ES 的极限。事实上,每条数据经过一次完整的 HTTP POST 请求和 ES indexing 是一种极大的性能浪费,为此,ES 设计了批量提交方式。在数据读取方面,叫 mget 接口,在数据变更方面,叫 bulk 接口。mget 一般常用于搜索时 ES 节点之间批量获取中间结果集,对于 Elastic Stack 用户,更常见到的是 bulk 接口。

bulk 接口采用一种比较简朴的数据积累格式,示例如下:

# curl -XPOST http://127.0.0.1:9200/_bulk -d'

{ "create" : { "_index" : "test", "_type" : "type1" } }

{ "field1" : "value1" }

{ "delete" : { "_index" : "test", "_type" : "type1" } }

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }

{ "field1" : "value2" }

{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }

{ "doc" : {"field2" : "value2"} }

'

格式是,每条 JSON 数据的上面,加一行描述性的元 JSON,指明下一行数据的操作类型,归属索引信息等。

采用这种格式,而不是一般的 JSON 数组格式,是因为接收到 bulk 请求的 ES 节点,就可以不需要做完整的 JSON 数组解析处理,直接按行处理简短的元 JSON,就可以确定下一行数据 JSON 转发给哪个数据节点了。这样,一个固定内存大小的 network buffer 空间,就可以反复使用,又节省了大量 JVM 的 GC。

事实上,产品级的 logstash、rsyslog、spark 都是默认采用 bulk 接口进行数据写入的。对于打算自己写程序的读者,建议采用 Perl 的 Search::Elasticsearch::Bulk 或者 Python 的 elasticsearch.helpers.* 库。

bulk size

在配置 bulk 数据的时候,一般需要注意的就是请求体大小(bulk size)。

这里有一点细节上的矛盾,我们知道,HTTP 请求,是可以通过 HTTP 状态码 100 Continue 来持续发送数据的。但对于 ES 节点接收 HTTP 请求体的 Content-Length 来说,是按照整个大小来计算的。所以,首先,要确保 bulk 数据不要超过 http.max_content_length 设置。

那么,是不是尽量让 bulk size 接近这个数值呢?当然不是。

依然是请求体的问题,因为请求体需要全部加载到内存,而 JVM Heap 一共就那么多(按 31GB 算),过大的请求体,会挤占其他线程池的空间,反而导致写入性能的下降。

再考虑网卡流量,磁盘转速的问题,所以一般来说,建议 bulk 请求体的大小,在 15MB 左右,通过实际测试继续向上探索最合适的设置。

注意:这里说的 15MB 是请求体的字节数,而不是程序里里设置的 bulk size。bulk size 一般指数据的条目数。不要忘了,bulk 请求体中,每条数据还会额外带上一行元 JSON。

以 logstash 默认的 bulk_size => 5000 为例,假设单条数据平均大小 200B ,一次 bulk 请求体的大小就是 1.5MB。那么我们可以尝试 bulk_size => 50000;而如果单条数据平均大小是 20KB,一次 bulk 大小就是 100MB,显然超标了,需要尝试下调至 bulk_size => 500。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

catalog java,Java Connection getCatalog()方法与示例

通常,目录是一个目录,其中包含有关数据集,文件或数据库的信息。而数据库目录中包含所有数据库,基本表,视图(虚拟表),同义词,值范围,索引,用户和用户组的列表。Connection…

matlab 函数 命名参数,如何处理MATLAB中的函数参数的名称/值对

我喜欢使用结构为我的选择。这给你一个简单的方法来存储选项和一个简单的方法来定义它们。此外,整个事情变得相当紧凑。function example(varargin)%# define defaults at the beginning of the code so that you do not need to%# scroll way down in case you wan…

ssrf 过滤.php,SSRF技巧之如何绕过filter_var( )

0x00 前言前几天我读了两篇非常棒的论文:第一篇是发表在blackhat.com上的“A New Era of SSRF ”,讲述的是不同编程语言的SSRF问题;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文,它主要讲述的是如何以多种…

matlab 爬虫 例子,认识爬虫(示例代码)

爬虫分为两种:1.通用爬虫。2.聚焦爬虫。通用爬虫:搜索引擎用的爬虫系统。一.目标:爬取所有网站的网页下载下来,存放到本地服务器里形成备份。二.抓取流程:a.首选选取一部分已有的url,把这些url放到待爬取队列。b.从队列…

如何用notepad写php,notepad新手怎么使用

新手使用notepad的几个小技巧:一、软件始终置于屏幕最前方有时候我们在运行程序时,需要将notepad放置到屏幕最前方,此时只需要在工具栏中点击:view——always on tops;此时notepad就会一直处于屏幕最前方。注&#xff…

rman打开oracle归档日志,Oracle RAC中使用RMAN管理归档日志

RMAN归档配置的两种方案1.在Oracle asm和集群文件系统时的归档方案对于Oracle RAC来说首选是使用Oracle asm作为reocvery区域。可选择的你也可以使用集群文件系统的归档方案。如果你使用了一种集群文件系统,那么当进行日志归档时每个节点会将归档日志写到集群文件系…

oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库

oracle --10g 中Duplicate 复制数据库本次实验通过duplicate命令,在本机环境中创建一个复制数据库。目标数据库为hongye、复制数据库为catdb。环境别名设置:alias sqlrlwrap sqlplus /nologalias rmanrlwrap rmanalias dbscd $ORACLE_HOME/dbsalias rdbc…

oracle resize什么意思,Oracle调整表空间大小resize

SQL> ALTER DATABASE DATAFILE D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA RESIZE 300m;ALTER DATABASE DATAFILE D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA RESIZE 300m*ERROR 位于第 1 行:ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据但是SQL>select d.filename,d.fi…

双网卡主机配置oracle监听,VirtualBox设置双网卡实现虚机上网及主宿机互访

VirtualBox 虚拟机之间互连、主宿机互连、以及主宿机连接互联网的功能非常实用。下面介绍实现主宿机通过虚拟网卡互连方式。1 全局配置VirtualBox安装完成后,会在系统中装一块虚拟网卡,我们在 管理> 全局设定中可以看到。这块网卡是在 Host-Only 连接…

oracle英文日期转换为中文,excel中文日期与英文日期如何转换

一、一般的转换方法假如A列为英文日期格式,譬如是:A1 19-Jul-12A2 20-Jul-12A3 21-Jul-12A4 22-Jul-12那么,如果你想将其转换为中文的日期,假如放在B列,首先你得将B列设置为中文的日期格式,方法是&…

oracle笔试题目及答案,Oracle 笔试题目带答案.doc

( )程序包用于读写操作系统文本文件。(选一项)A、Dbms_outputB、Dbms_lobC、Dbms_randomD、Utl_file( )触发器允许触发操作的语句访问行的列值。(选一项)A、行级B、语句级C、模式D、数据库级( )是oracle在启动期间用来标识物理文件和数据文件的二进制文件。(选一项)A、控制文件…

php sphinx api调用,php调用Sphinx

1.将文件 coreseek-3.2.14/testpack/api/sphinxapi.php 拷贝到任意可被php程序包含出。2.在要调用的脚本中包含文件 sphinxapi.php 如下示例namespace Admin\Controller;use Admin\Common\Controller\CommonController;require(./Public/api/sphinxapi.php); //包含sphinxclass…

oracle关于时区,关于oracle时区

关于oracle时区[more]商业和数据库很多时候必须跨时区工作,从9i开始,oracle环境开始有了时区意识,通过指定数据库的时区和使用TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE数据类型来实现该功能。TIMESTAMP WITH TIME ZONE不会…

苹果双系统运行oracle失败,oracle 11gR2 RAC for linux x86_64 grid运行root.sh 失败问题处理...

昨天一个朋友问到我,在oracle 11gR2 RAC for linux x86_64安装过程中,grid用户运行root.sh在第一节点可以成功,但在第二节点不成功,报错如下:CRS-2674: Start of ora.cssd on racnode2 failedCRS-2679: Attempting to clean ora.c…

微信公众号php提交表单,PHP教程:使用YII2框架实现微信公众号中表单提交功能...

《PHP教程:使用YII2框架实现微信公众号中表单提交功能》要点:本文介绍了PHP教程:使用YII2框架实现微信公众号中表单提交功能,希望对您有用。如果有疑问,可以联系我们。相关主题:YII框架PHP教程刚接触微信,要…

php 命名空间实现的原理,php命名空间实现的理解

[前言]之前测试命名空间,文件头部明明定义了namespace,并且类文件的存放位置与相对路径也一致,但use之后仍提示“找不到类”,为什么?[原理分析]1.根据use的值确定类文件的物理存储位置,然后通过require_one…

linux配置nginx命令行,Linux - 加上sudo后,nginx找不到命令

安装步骤切换至rootsu安装依赖库sudo apt-get install build-essential && sudo apt-get install libtoolsudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g-devsudo apt-get install openssl下载源码包并且解压wget http://nginx.org/download/…

linux编译c 优化,Linux编译选项

Linux平台都通过CC调用它们的C编译程序.除标准和CC以外,LINUX和FREEBSD还支持gcc.基本的编译命令选项有以下几种:1. -c (compile)编译产生对象文件(*.obj)/目标文件,而不链接成可执行文件,当编译几个独立的模块,而待以后由链接程序把它们链接在一起时,就可以使用…

linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法:[ function ] funname [()]{action;[return int;]}说明:可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。参数返回,可以显示加:return 返回,如果不加&…

编译linux内核成vmlinuz,内核编译之vmlinuz vmlinux system.map initrd

一、vmlinuzvmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/…