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

以上这篇基于Elasticsearch5.4的常见问题总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

    最近项目中用到了Elasticsearch5.4(ES)是比较新的一个版本,使用的过程中出现了很多的问题,很是头疼,但是问题最终还是解决掉了. 问题一:ESClient获取慢,并且不能获取Client:failed to create a child event loop 由于业务的需要没上传一批文件都要加一次ES索引,每加一次索引都要获取连接然后操作,尤其是大批量的时候,获取的次数显然非常多,而且出现这个问题的主要原因在于我们在循环频繁的操作ES,比如一批文件100个,我们就要获取100次,为

  • 基于多线程并发的常见问题(详解)

    一 概述 1.volatile 保证共享数据一旦被修改就会立即同步到共享内存(堆或者方法区)中. 2.线程访问堆中数据的过程 线程在栈中建立一个数据的副本,修改完毕后将数据同步到堆中. 3.指令重排 为了提高执行效率,CPU会将没有依赖关系的指令重新排序.如果希望控制重新排序,可以使用volatile修饰一个变量,包含该变量的指令前后的指令各自独立排序,前后指令不能交叉排序. 二 常见问题及应对 1.原子性问题 所谓原子性,指的是一个操作不可中断,即在多线程并发的环境下,一个操作一旦开始,就会在

  • 基于RequireJS和JQuery的模块化编程——常见问题全面解析

    由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护.最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还是seajs的时候,最终还是偏向于requirejs.毕竟官方文档比较专业嘛... 不过即便是有完整的官方文档,仍然遇到不少的问题,比如jquery-ui的使用. 下面就循序渐进的讲解一下我遇到的问题,以及解决的办法. 关于AMD和CMD的理解 AMD(异步模块定义)的典型就是requirejs,而CMD(通用模块定义)的典型是淘宝的seajs.

  • Java集合Map常见问题_动力节点Java学院整理

    Java集合Map常见问题,供大家参考,具体内容如下 1."你知道HashMap的工作原理吗?" "你知道HashMap的get()方法的工作原理吗?" 答:"HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象.当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象.

  • iOS10开发和Xcode 8新特性及常见问题解析

    iOS 10 开发这次更新主要表现在以下这几个方面. 1.语音识别 苹果官方在文档中新增了API Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,speech具有以下特点: 可以实现连续的语音识别 可以对语 音文件或者语音流进行识别 最佳化自由格式的听写(可理解为多语言支持)和搜索式的字符串 核心代码: #import <Speech/Speech.h> /** 语音识别同样的需要真机进行测试 ,

  • 非常不错的WAP常见问题问答大全(二)第1/3页

    WAP常见问题问答大全(二) 二.关于WML的常见问答 1. 简单说WML代表什么?     WML代表"Wireless Markup Language".WML就是无线标记语言(Wireless Markup Language),内置于移动设备中的微型浏览器能够解释这种标记语言.虽然它和HTML语言很相像,但WML其实是XML的一个应用子集. 2. 什么是WML?     WML代表Wireless Markup Language,就象HTML对普通的Web浏览器一样.有人说它是基

  • PHP 数据库 常见问题小结第1/3页

    如果只有一种 方式使用数据库是正确的-- 您可以用很多的方式创建数据库设计.数据库访问和基于数据库的 PHP 业务逻辑代码,但最终一般以错误告终.本文说明了数据库设计和访问数据库的 PHP 代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们. 问题 1:直接使用 MySQL 一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问数据库.清单 1 展示了如何直接访问数据库. 以下为引用的内容: <?phpfunction get_user_id( $name ){$db =

  • LINUX 常见问题1000个详细解答

    一. 如何建立多用户 提醒大家一句,别一直使用root用户,因为root用户在系统中有着至高无上的权力,一不小心 就可能破坏系统.比如我们想删除/temp目录下的文件却将命令不小心输成"rm / temp(在'/'后多了一个空格)",那么就极可能删去根目录下的所有文件.再者,"Linux是一个真正意义上的多 任务.多用户系统",不体会一下Linux的特色岂不可惜.为了方便自己和别人使用,就在Linux系统 下多建几个用户吧. 输入"adduser newu

  • python爬虫面试宝典(常见问题)

    是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访问资源时在空闲等待时同时访问其他资源,实现多线程机制 是否了解网络的同步和异步? 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 链表和顺序表储存时各自有什么优点? 1.顺序表存储 原理:顺序表存储是将数据元素放到一块连续的内存存储空间,存取效率高,速

  • JAVA线上常见问题排查手段(小结)

    在平时开发过程中,对于线上问题的排查以及系统的优化,免不了和Linux进行打交道.每逢大促和双十一,对系统的各种压测性能测试,优化都是非常大的一次考验.抽空整理了一下自己在线上问题排查以及系统优化的一些经验. 一.系统性能瓶颈在哪 我们常常提到项目的运行环境,那么运行环境包括哪些呢?一般包括你的操作系统.CPU.内存.硬盘.网络带宽.JRE环境.你的代码依赖的各种组件等等.所以系统性能的瓶颈往往是IO瓶颈.CPU瓶颈.内存瓶颈或者程序导致的性能瓶颈 登录到服务器上,我们使用TOP命令可以很全面的

随机推荐