基于Elasticsearch5.4的常见问题总结

作者:我心自在 时间:2022-07-15 15:02:49 

最近项目中用到了Elasticsearch5.4(ES)是比较新的一个版本,使用的过程中出现了很多的问题,很是头疼,但是问题最终还是解决掉了。

问题一:ESClient获取慢,并且不能获取Client:failed to create a child event loop

由于业务的需要没上传一批文件都要加一次ES索引,每加一次索引都要获取连接然后操作,尤其是大批量的时候,获取的次数显然非常多,而且出现这个问题的主要原因在于我们在循环频繁的操作ES,比如一批文件100个,我们就要获取100次,为了降低ES Client获取的时间,最终采取了一个方案,那就是在服务启动的时候初始化连接,一次性获取,然后在后边直接调用,整个批次文件上传完成后,最后添加ES索引,而不是一个文件一个文件的去添加了。这种方式显然不需要每个批次都获取连接,大大提升了执行效率。

首先,我们在服务启动的时候,在启动类中初始化静态ES Client:


private static ElasticSearchUtil ElasticSearchUtil=new ElasticSearchUtil();
public static TransportClient client=ElasticSearchUtil.getClient();

然后在用到的时候直接调用:


Client client=Main.client;

这样可以大大减少ES Client的连接次数,从而提升效率。

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:内存溢出:java.lang.OutOfMemory:unable to create new native thread

在项目开发过程中,发生内存溢出是很让人头疼的一件事,在使用ES的过程中,就遇到了,而且很频繁,尤其是在大批量压力测试的时候根本进行不下去,从jvm内存调优方面想了很多办法,没有什么效果,问题依然得不到解决,最后在看源码的时候,发现了一个原因,和报错异常结合来看,这是由与ES在使用过程中,自动创建了大量的线程,超出了系统的容纳量,所以导致了内存溢出,研究源码的时候发现:ES创建的线程数是可以通过设置来控制的。下面是默认的ES创建线程数:


thread_pool.generic.core=默认值---4
thread_pool.generic.max=默认值--
min(512,max(4*processor数,128))
processor数=CPU的processor数

我们的CPU是10核40线程

从计算结果来看,如果使用默认值的话,ES可以创建的线程数是一个很大的数值,这远远超出了系统本身的容纳数,主要是调整setting的数值,经过调整,我们将ES的默认值改变如下:


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();

经过测试,ES创建了很少的线程数,并且满足我们的开发需求,再也没有出现过内存溢出的问题了。

来源:https://www.cnblogs.com/10158wsj/p/8207241.html

标签:Elasticsearch,5.4,常见问题
0
投稿

猜你喜欢

  • C#中的不可变数据类型介绍(不可变对象、不可变集合)

    2022-06-13 19:08:33
  • SpringCloud OpenFeign超详细讲解模板化远程通信的实现

    2023-04-27 06:43:29
  • JavaWeb使用Session和Cookie实现登录认证

    2023-12-11 19:13:29
  • Android实现记住账号密码功能

    2021-10-02 01:51:24
  • Android开发使用自定义View将圆角矩形绘制在Canvas上的方法

    2021-06-08 01:03:17
  • Java线程的全方位详解

    2023-04-11 14:02:55
  • Android 屏幕双击事件的捕获简单示例

    2022-08-30 11:02:55
  • Java如何自定义异常打印非堆栈信息详解

    2022-05-06 09:43:36
  • SpringBoot整合freemarker实现代码生成器

    2023-07-17 20:31:08
  • java 解析由String类型拼接的XML文件方法

    2022-07-10 12:47:14
  • SpringBoot加密配置文件的SQL账号密码方式

    2023-08-23 08:59:42
  • C#使用SQL Dataset数据集代码实例

    2023-02-24 08:23:07
  • C# Winform实现自定义漂亮的通知效果

    2021-08-10 08:15:29
  • C++多重继承与虚继承分析

    2023-04-22 14:49:16
  • utf8编码检测方法分享

    2023-05-18 12:34:27
  • Kotlin协程Dispatchers原理示例详解

    2022-09-26 00:09:45
  • Android Loader的使用以及手机通讯录的获取方法

    2023-12-22 02:10:05
  • c# 重载WndProc,实现重写“最小化”的实现方法

    2022-10-22 10:16:13
  • java内部类原理与用法详解

    2022-12-04 14:41:25
  • Spring Boot Actuator监控端点小结

    2023-02-15 05:04:23
  • asp之家 软件编程 m.aspxhome.com