zoukankan      html  css  js  c++  java
  • Elasticsearch5.4常见问题总结


      最近项目中用到了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创建了很少的线程数,并且满足我们的开发需求,再也没有出现过内存溢出的问题了。

  • 相关阅读:
    Unity 3D Customizing Your Workspace 自定义工作区
    Unity3D 学习界面 Learning the Interface
    【Python】函数功能描述
    没有显示器的情况下安装和使用树莓派
    【Linux】03-Linux用户权限相关命令
    【Linux】02-Linux远程管理常用命令
    【Linux】01-Linux基本命令
    【12c】DataGuard构建物理备用数据库(Cloud Control方式)
    【12c】一文教你详细了解如何安装Oracle Enterprise Manager Cloud Control 12c
    【12c】新特性:一文带你详细了解Oracle 12c 数据库的自动数据优化(ADO)
  • 原文地址:https://www.cnblogs.com/10158wsj/p/8207241.html
Copyright © 2011-2022 走看看