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進行資料遷徙;
因為暫時只是單機器測試瓶頸,因此之後的優化工作之後再進行測試;
——————————————————————————————————————————————