elasticsearch5.6.0 批量插入及插入效率

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixin2151408/article/details/78276705

PS:多线程并不能提高插入效率


上一篇文章有写一些elasticsearch的单条查询和单条插入;

我又试了一下es的批量插入去检测一下插入效率;

不多说,先上代码:

 public static void main(String[] args) {
    try {
    	
        //设置集群名称

        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        //创建client
        @SuppressWarnings("resource")
		TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("0.0.0.0"), 9300));
        //写入数据
        System.out.println("123");
       // createDate(client);
        //搜索数据
        GetResponse response = client.prepareGet("gtbdc", "ql_xz", "SCH30761").execute().actionGet();
        //输出结果
        System.out.println(response.getSource());
        long startTimeall = System.currentTimeMillis();
      for(int i =100;i<200;i++){
    	  long startTime = System.currentTimeMillis();
    	  createManyDates(client,response.getSource(),i);
    	  long endTime = System.currentTimeMillis(); // 获取结束时间  
    	  System.out.println("十万条插入时间: " + (endTime - startTime) + "ms");
      }
      long endTimeall = System.currentTimeMillis(); // 获取结束时间  
      System.out.println("所有运行时间: " + (endTimeall - startTimeall) + "ms");
        
        //关闭client
        client.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    }


/**
     * 批量插入(每次插入100000条)
     * @param client
     * @param map
     * @param j
     */
    public static void createManyDates(TransportClient client,Map<String, Object> map,Integer j){
    	int count = (j*100000+1);
    	int k = j*100000;
    	String index = "gtbdc";
    	String type = "others";
    	BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
    	for(int i = (j-1)*100000+1;i <count;i++){
        	map.put("bdcqzh", i);
    		//Map<String, Object> map = new HashMap<String, Object>();
    		bulkRequestBuilder.add(client.prepareIndex(index, type, i+"").setSource(map));    		
    	if(i%k ==0){
    		bulkRequestBuilder.execute().actionGet();
    	}
    	}
    	
    }


因为我的内存设置较低,因此每次如果大量插入(20W以上),则会报栈内存溢出,因此我设置for循环去插入,每次插入10W条;


我得到的结果:

十万条运行时间: 22612ms
十万条运行时间: 19194ms
十万条运行时间: 17998ms
十万条运行时间: 18385ms
十万条运行时间: 19359ms
十万条运行时间: 19655ms
十万条运行时间: 20093ms
十万条运行时间: 20236ms
十万条运行时间: 22524ms
十万条运行时间: 19901ms
十万条运行时间: 22010ms
十万条运行时间: 22815ms
十万条运行时间: 22306ms
十万条运行时间: 21933ms
十万条运行时间: 21978ms
十万条运行时间: 20136ms
十万条运行时间: 23080ms
十万条运行时间: 20023ms
十万条运行时间: 21207ms
十万条运行时间: 20920ms
十万条运行时间: 22446ms
十万条运行时间: 24086ms
十万条运行时间: 20545ms
十万条运行时间: 21766ms
十万条运行时间: 20292ms
十万条运行时间: 22580ms
十万条运行时间: 22724ms
十万条运行时间: 19281ms
十万条运行时间: 21032ms
十万条运行时间: 23261ms
十万条运行时间: 18215ms
十万条运行时间: 21009ms
十万条运行时间: 18559ms
十万条运行时间: 21903ms
十万条运行时间: 23451ms
十万条运行时间: 21945ms
十万条运行时间: 24714ms
十万条运行时间: 20003ms
十万条运行时间: 23795ms
十万条运行时间: 23055ms
十万条运行时间: 21338ms
十万条运行时间: 18769ms
十万条运行时间: 21750ms
十万条运行时间: 23223ms
十万条运行时间: 24285ms
十万条运行时间: 21593ms
十万条运行时间: 20012ms
十万条运行时间: 22539ms
十万条运行时间: 21833ms
十万条运行时间: 24598ms
十万条运行时间: 22352ms
十万条运行时间: 23833ms
十万条运行时间: 21144ms
十万条运行时间: 18474ms
十万条运行时间: 24494ms


55*100000 = 550W条数据;
平均每10万条数据:
1181270/50 = 23625ms = 23.625s


之后再次进行插入,这次是1000万一共:

所有程序运行时间: 2264874ms
平均每10万条数据:

22648.74ms


————————————————————————————

接上,经过1天的插入,现在数据量为1.5亿

现在的插入效率及其低下,已经需要优化了:

十万条运行时间: 187353ms
正在插入第144100000条
十万条运行时间: 98992ms
正在插入第144200000条
十万条运行时间: 87411ms
正在插入第144300000条
十万条运行时间: 142822ms
正在插入第144400000条
十万条运行时间: 64623ms
正在插入第144500000条
十万条运行时间: 62817ms
正在插入第144600000条
十万条运行时间: 198715ms
正在插入第144700000条
十万条运行时间: 89855ms
正在插入第144800000条
十万条运行时间: 69009ms
正在插入第144900000条
十万条运行时间: 100727ms
正在插入第145000000条
十万条运行时间: 103191ms
正在插入第145100000条
十万条运行时间: 72862ms
正在插入第145200000条
十万条运行时间: 126082ms
正在插入第145300000条
十万条运行时间: 68585ms
正在插入第145400000条
十万条运行时间: 130717ms
正在插入第145500000条
十万条运行时间: 62654ms
正在插入第145600000条
十万条运行时间: 57092ms
正在插入第145700000条
十万条运行时间: 156218ms
正在插入第145800000条
十万条运行时间: 70963ms
正在插入第145900000条
十万条运行时间: 96373ms
正在插入第146000000条
十万条运行时间: 101747ms
正在插入第146100000条
十万条运行时间: 70566ms
正在插入第146200000条
十万条运行时间: 194005ms
正在插入第146300000条
十万条运行时间: 149298ms
正在插入第146400000条
十万条运行时间: 92109ms
正在插入第146500000条
十万条运行时间: 185779ms
正在插入第146600000条
十万条运行时间: 119495ms
正在插入第146700000条
十万条运行时间: 103495ms
正在插入第146800000条
十万条运行时间: 263103ms
正在插入第146900000条
十万条运行时间: 133064ms
正在插入第147000000条
十万条运行时间: 143670ms
正在插入第147100000条
十万条运行时间: 88551ms
正在插入第147200000条
十万条运行时间: 85575ms

可见,随着数据的大批量插入,插入速度越来越慢,与我自己的机器也有关系,我自己机器的物理内存已经用到不能再用了,很卡。

我自己的机器是:D盘1T容量,8G内存,分了3个节点:每个节点给2G内存现在查询效率比较低,全表查询count时间为8s左右;

增加节点4,给予内存1G,es会自动对节点4进行数据迁徙;


因为暂时只是单机器测试瓶颈,因此之后的优化工作之后再进行测试;

——————————————————————————————————————————————

猜你喜欢

转载自blog.csdn.net/lixin2151408/article/details/78276705