基于Elasticsearch5.4的常見問題總結(jié)
最近項目中用到了Elasticsearch5.4(ES)是比較新的一個版本,使用的過程中出現(xiàn)了很多的問題,很是頭疼,但是問題最終還是解決掉了。
問題一:ESClient獲取慢,并且不能獲取Client:failed to create a child event loop
由于業(yè)務(wù)的需要沒上傳一批文件都要加一次ES索引,每加一次索引都要獲取連接然后操作,尤其是大批量的時候,獲取的次數(shù)顯然非常多,而且出現(xiàn)這個問題的主要原因在于我們在循環(huán)頻繁的操作ES,比如一批文件100個,我們就要獲取100次,為了降低ES Client獲取的時間,最終采取了一個方案,那就是在服務(wù)啟動的時候初始化連接,一次性獲取,然后在后邊直接調(diào)用,整個批次文件上傳完成后,最后添加ES索引,而不是一個文件一個文件的去添加了。這種方式顯然不需要每個批次都獲取連接,大大提升了執(zhí)行效率。
首先,我們在服務(wù)啟動的時候,在啟動類中初始化靜態(tài)ES Client:
private static ElasticSearchUtil ElasticSearchUtil=new ElasticSearchUtil(); public static TransportClient client=ElasticSearchUtil.getClient();
然后在用到的時候直接調(diào)用:
Client client=Main.client;
這樣可以大大減少ES Client的連接次數(shù),從而提升效率。
ES代碼如下:
public TransportClient getClient() {
String[] ipArr = configUtil.getValue("ESIP").split(",");
Settings settings = Settings.builder().put("thread_pool.generic.core",5)
.put("thread_pool.generic.max", 10)
.put("processors", 5)
.put(Constants.ESCLUSTERNAME,configUtil.getValue("clusterName")).build();
TransportClient client = new PreBuiltTransportClient(settings);
for (String ip : ipArr) {
TransportAddress address = new InetSocketTransportAddress
(InetAddresses.forString(ip),9300);
client.addTransportAddresses(address);
}
return client;
}
問題2:內(nèi)存溢出:java.lang.OutOfMemory:unable to create new native thread
在項目開發(fā)過程中,發(fā)生內(nèi)存溢出是很讓人頭疼的一件事,在使用ES的過程中,就遇到了,而且很頻繁,尤其是在大批量壓力測試的時候根本進(jìn)行不下去,從jvm內(nèi)存調(diào)優(yōu)方面想了很多辦法,沒有什么效果,問題依然得不到解決,最后在看源碼的時候,發(fā)現(xiàn)了一個原因,和報錯異常結(jié)合來看,這是由與ES在使用過程中,自動創(chuàng)建了大量的線程,超出了系統(tǒng)的容納量,所以導(dǎo)致了內(nèi)存溢出,研究源碼的時候發(fā)現(xiàn):ES創(chuàng)建的線程數(shù)是可以通過設(shè)置來控制的。下面是默認(rèn)的ES創(chuàng)建線程數(shù):
thread_pool.generic.core=默認(rèn)值---4 thread_pool.generic.max=默認(rèn)值-- min(512,max(4*processor數(shù),128)) processor數(shù)=CPU的processor數(shù)
我們的CPU是10核40線程
從計算結(jié)果來看,如果使用默認(rèn)值的話,ES可以創(chuàng)建的線程數(shù)是一個很大的數(shù)值,這遠(yuǎn)遠(yuǎn)超出了系統(tǒng)本身的容納數(shù),主要是調(diào)整setting的數(shù)值,經(jīng)過調(diào)整,我們將ES的默認(rèn)值改變?nèi)缦拢?/p>
Settings settings = Settings.builder().put("thread_pool.generic.core",5)
.put("thread_pool.generic.max", 10)
.put("processors", 5) .put(Constants.ESCLUSTERNAME,configUtil.getValue("clusterName")).build();
這是之前的
Settings settings = Settings.builder().put("thread_pool.generic.core",5)
.put(Constants.ESCLUSTERNAME,configUtil.getValue("clusterName")).build();
經(jīng)過測試,ES創(chuàng)建了很少的線程數(shù),并且滿足我們的開發(fā)需求,再也沒有出現(xiàn)過內(nèi)存溢出的問題了。
以上這篇基于Elasticsearch5.4的常見問題總結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaSwing GridLayout 網(wǎng)格布局的實現(xiàn)代碼
這篇文章主要介紹了JavaSwing GridLayout 網(wǎng)格布局的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
基于Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié)
這篇文章主要介紹了Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
關(guān)于集合和字符串的互轉(zhuǎn)實現(xiàn)方法
下面小編就為大家?guī)硪黄P(guān)于集合和字符串的互轉(zhuǎn)實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
Java攔截器Interceptor實現(xiàn)原理及代碼示例
本文詳細(xì)講解了Java攔截器Interceptor實現(xiàn)原理及代碼示例,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
解決Spring Boot 正常啟動后訪問Controller提示404問題
今天小編再次搭建Spring Boot項目的時候遇到訪問Controller報404錯誤,之前都很順利。到底怎么回事呢?下面小編給大家?guī)砹私鉀QSpring Boot 正常啟動后訪問Controller提示404問題,感興趣的朋友一起看看吧2018-08-08
SpringBoot使用SensitiveWord實現(xiàn)敏感詞過濾
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用SensitiveWord實現(xiàn)敏感詞過濾功能,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01

