1. 程式人生 > >elasticsearch5.6.0 批量插入及插入效率

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

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進行資料遷徙;

因為暫時只是單機器測試瓶頸,因此之後的優化工作之後再進行測試;

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