文档章节

elasticsearch 批量入库bulk性能测试

纳兰琴
 纳兰琴
发布于 2014/11/21 14:40
字数 765
阅读 3527
收藏 2

背景

        我的需求很简单,就是用httpCilent组件,通过REST批量接口bulk提交一些数据。跑一下代码1W条数据导入完成耗时0.843秒,到这里我本可以高高兴兴的交差了,但是我又干了一件事情,用Java原生客户端跑了1W条数据,发现导入速度是0.359秒。管他呢,完成任务。但是,,但是我纠结了,作为一个有追求,有思想的码农,我纠结了。这个时间差距有点大啊。我就怀疑代码有问题了。我就又用了官方的JEST客户端试了下速度。发现速度也不快啊。然后,我的心理就一直缠绕着一个问题,批量导入哪家强?就做了一系列测试。本来测试个Http就好了,但是,,又一个但是。我就根本停不下来了。

测试结果

        单位是秒,数据量是1W条,总大小是672 kb。httpClient v1是用最笨的方法写的。V2s是加入了线程池,先初始化Client。速度取了3次的平均值。Java的客户端快的时候有0.2秒,也就是每秒5W多记录。测试10W条记录的时候发生了一点意外XContentBuilder太吃内存了,也就是JSON解析。我的2G内存的渣渣机器,跑不起来。换了服务器给3G内存测试的。测试数据很简单,下面这样。

{"create":{"_index":"nq_test2","_type":"base"}}\n{"name":"value1"}\n

第一组

  • 0.359  java

  • 0.843  httpClient v1

  • 0.593  httpClient v2

  • 0.719  jest

  • 0.581  javascript

  • 0.739  python

  • 0.389  nest (.net客户端)

第二

10W 条 6825 kb

  • 5.343 python

  • 2.746 httpClient v2

  • 2.145 java

测试结论

        http协议的REST接口,总是要比TCP协议的Java原生客户端要慢一些,意外发现是C#的Http组件,性能不错啊。


测试代码

python

def test():
    actions=[]
    for i in range(1,100001):
        actions.append({"_index": 'nq_test2', "_type": "python","_source":{ "name":"value"+str(i)}})
    starttime = time.clock()
    helpers.bulk(es,actions,chunk_size=50000)
    endtime = time.clock()
    print "cost = "+str(endtime - starttime)

JS

var client = new elasticsearch.Client({
  host: 'http://myes:9200',
  sniffOnStart: false,
  sniffInterval: 60000,
});
function buildData(){
	var actions=[];
	for(var i=1;i<=10000;i++){
		actions.push({ index:  { _index: 'nq_test2', _type: 'js'} });
		actions.push({ name: 'value'+i });
	}
	return actions;
}
function test(){
	var actions = buildData();
	var beginTime = new Date().getTime();
	client.bulk({
	  body: actions
	}, function (err, resp) {
		var endTime = new Date().getTime();
		//console.info(resp);
		$("#costDiv").html('cost = '+(endTime-beginTime)/1000.0);
		$("#tookDiv").html('took = '+resp.took);
	});
}

Java

public void test(int count) throws IOException{
		BulkRequestBuilder bulkRequest = client.prepareBulk();
		System.out.println("count ="+count);
		for(int i=1;i<=count;i++){
			bulkRequest.add(client.prepareIndex("nq_test2", "java")
			        .setSource(jsonBuilder()
			                    .startObject()
			                        .field("name", "value"+i)
			                    .endObject()
			        		)
			);
		}
		long beginTime = System.currentTimeMillis();
		BulkResponse bulkResponse = bulkRequest.execute().actionGet();
		if (bulkResponse.hasFailures()) {
			System.out.println("erros");
		}
		long endTime = System.currentTimeMillis();
		System.out.println("took ="+bulkResponse.getTookInMillis());
		System.out.println("cost = "+(endTime-beginTime)/1000f);
}

Jest

public void test() {
	Bulk.Builder builder = new Bulk.Builder()
	    .defaultIndex("nq_test2")
	    .defaultType("jest");
	    for(int i=1;i<=10000;i++){
	    	builder.addAction(new Index.Builder("{\"name\":\"value"+i+"\"}").build());
	    }
	    Bulk bulk =builder.build();
		try {
			long beginTime = System.currentTimeMillis();
			JestResult result = client.execute(bulk);
			long endTime = System.currentTimeMillis();
			System.out.println("cost = "+(endTime-beginTime)/1000f);
			System.out.println("took = "+ result.getValue("took"));
		} catch (Exception e) {
			e.printStackTrace();
		}
}

Nest (c#)

private void testBtn_Click(object sender, EventArgs e)
{
    var settings = new ConnectionSettings(
         new Uri(urlTxt.Text)
    );
    var Client = new ElasticClient(settings);

    var Descriptor = new BulkDescriptor();
    Descriptor.FixedPath("nq_test2", "dotnet");
    var Count = Convert.ToInt32(numericUpDown1.Value);
    foreach (var i in Enumerable.Range(0, Count))
    {
        Descriptor.Create<Item>(op => op.Document(new Item { name = "value"+i }));
    }
    
    var BeginTime = DateTime.Now.Millisecond;
    var Result = Client.Bulk(Descriptor);
    var EndTime = DateTime.Now.Millisecond;
    
    label1.Text = "cost = "+((EndTime - BeginTime) / 1000f).ToString()+" sec";
    label3.Text = "took = " + Result.Took.ToString() + " sec";

}


© 著作权归作者所有

共有 人打赏支持
纳兰琴
粉丝 49
博文 23
码字总数 13442
作品 0
杭州
高级程序员
私信 提问
加载中

评论(4)

六镀芯寒
六镀芯寒
大神
zmf
zmf
严谨专研值得学习
纳兰琴
纳兰琴

引用来自“去哪儿了”的评论

好厉害

17 又周五了,高兴不?
去哪儿了
去哪儿了
好厉害
logstash_forward+flume+elasticsearch+kibana日志收集框架

最开始架构定的是采用elk来做日志的收集,但是测试一段时间后,由于logstash的性能很差,对cpu和内存消耗很大,放弃了logstash。为什么没有直接使用flume的agent来收集日志,这主要是根据实际...

super_yu
2015/10/28
0
1
针对将mysql数据同步到elasticsearch,采用插件方式和采用bulk等 API方式比较

针对将mysql数据同步到elasticsearch,通常做法是用插件同步(例如logstash-input-jdbc、elasticsearch-jdbc等等),但是elasticsearch提供了bulk批量插入的api,所以我比较好奇:一种方式是...

风雨诗轩
2017/10/13
59
1
Elasticsearch _bulk批量导入数据问题

各位大神好,在下是Elasticsearch初学者,遇到如下问题 ,还请帮忙解答,不胜感激。 1 问题1,本人用如下命令批量导入数据到Elasticsearch: curl -XPOST http://192.168.6.64:9200/myindex...

余智君sir
2017/04/03
702
2
Logstash及Elasticsearch 压力测试说明书

1 整体环境说明 1.1 硬件环境 1、 磁盘:SATA磁盘2块,磁盘阵列为RAID1 2、 CPU:2个4核CPU。具体参数:Intel(R) Xeon(R) CPU E5405 @ 2.00GHz 3、 内存:8G(8*1G) 4、 网卡:1000Mb/s 1....

橡皮24
2018/11/09
0
0
python操作elasticsearch,在用helper.bulk时,数据插入到四千多条的时候会报超时,请问如何解决?

从接口里面读到数据,处理之后将数据批量插入es,但是会报超时,我已经设置超时时间为120秒了,环境的linux 批量插入代码如下: elasticsearch.helpers.bulk(es, actions, request_timeout=...

何法
2018/09/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sql根据日期查询,本周,本月,本年,今日相关统计

sql根据日期查询,本周,本月,本年,今日相关统计 昨天 select * from tb where datediff(day, 时间字段 ,getdate()) = 1 今天 select * from tb where datediff(day, 时间字段 ,getdate()) = ...

BraveLN
16分钟前
2
0
Delphi 折叠代码编译变量$REGION

编译变量$REGION,用于在delphi2006以后版本的折叠代码显示,非常方便。 procedure TForm1.Button1Click(Sender: TObject); var uStr: UnicodeString; begin {$REGION '显示uStr变量内容'} ......

dillonxiao
17分钟前
1
0
【更新】SyntaxEditor发布v2018.1,可共享相同代码库

SyntaxEditor最新版本下载 SyntaxEditor是一款强大的代码语法检验控件,采用了当今最前沿的代码编辑的技术,可以为你代码编辑提供强大的管理功能。最新版支持Visual Studio 2013和Windows 8...

电池盒
18分钟前
1
0
如何在基于Bytom开发过程中集成IPFS

本文介绍了基于Bytom开发过程中集成IPFS。 step1: 搭建bytom节点 比原相关资料:https://github.com/Bytom-Community/Bytom_Docs 搭建bytom节点有很多方式,然后开启RPC调用模式。这里推荐用...

比原链Bytom
22分钟前
0
0
sqlyog注册码

sqlyog注册码 1.方式一 用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417 a56ea5da-f30b-4fb1-8a05-95f346a9b20b a0fe8645-3916-45d4-9976-cb6b88fecc6c b70d7f66-dac2-4462-......

dragon_tech
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部