设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

大量数据写入Maybe ES overloaded?

Elasticsearch | 作者 bleedingfight | 发布于2019年09月26日 | 阅读数:2294

 
 Could not write all entries [806/806] (Maybe ES was overloaded?). Error sample (first [5] error messages):
rejected execution of org.elasticsearch.transport.TransportService$7@151a8aa2 on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@698ee61e[Running, pool size = 32, active threads = 32, queued tasks = 216, completed tasks = 681894696]]
rejected execution of org.elasticsearch.transport.TransportService$7@5c671712 on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@698ee61e[Running, pool size = 32, active threads = 32, queued tasks = 216, completed tasks = 681894696]]
ES的版本为:5.4
当前运行场景是这样的:
现在有6张hive表,数据量大小,规模均不一致。数据条数最多的有两千多万条,数据量少的有200w左右,多数表在500w条数据。表中最多的数据有大约200个字段。我处理的时候是对于每一张表,使用sparksql查到需要写入ES的数据,然后简单筛选一下。转换读取的json字符串为es能写的key-value形式。调用rdd写es的函数finalRdd.saveToEsWithMeta(resource, esConfig)将结果写入。
我的es配置大概如下(对应于es配置es.batch.size,在scala代码中做了配置文件的映射es_batch_size对应于es.bastch.size):
  • es_batch_size=1200
  • es_batch_refresh=false
  • es_batch_retry_count=10
  • es_batch_retry_wait_second=30
  • es_write_operation=upsert

写入的时候提示的错误几乎全是上面Maybe ES was overloaded?我做了如下尝试:
1.每个rdd写入es的时候数据量太大,超过了es的最大写入量(我的猜想)RDD处理的时候有一个repartition操作,可以将大量的RDD数据分散存放在不同的机器上,我尝试修改这个值让他更大,保证分到机器上RDD更小,对RDD再调用saveToEsWithMeta写入数据(50-150)。还是提示这样的错误。
2.es_batch_size比较小,每次处理的时候需要频繁的拿数据比较耗时(我的猜想),调高es_batch_size(最高设置到3000)。也是时常出现这样的错误。
3.因为偶然的因素比如集群资源波动导致es数据写入失败(我的猜想),于是我尝试添加更多的es_batch_retry_count,最多设置过60,效果依然不明显。es_batch_retry_wait_second这个时间我也修改过(改大,我猜想ES写宽表的时候可能辉比较慢,这时候当处理到宽表的时候,批处理容易超时,改大可能会好一点(最大改到了60)),效果依旧不明显。问题还是时有发生。
现在不知道还有什么方法可以尝试,想问一下大家有没有碰到类似的问题,通常是如何解决的,不同规模的数据在往es写的时候同样ES配置是同样的吗?还有上面queued tasks = 216意思是不是我的es队列大小为200,队列中等待的任务超过了200,请求写入es的操作被拒绝了。是这样吗?
已邀请:

zqc0512 - andy zhou

赞同来自:

节点刚不住了,有拒绝了。调整小写入数据,或者加节点。

doom

赞同来自:

es序列化具体设置:es.batch.size.bytes (default 1mb)
es.batch.size.entries (default 1000)
你的字段比较多,单个doc文档比较大,es.batch.size.entries可适当调小,es.batch.size.bytes 可以大一点;
这个你可以自己根据硬盘性能和分片数自己设置;
例如:硬盘读写60M/s,集群12台,24个分片,2个副本,平均一台集群上有2个主分片需要写入,4个副本分片需要同步;那么每秒写入的理论上是60*12/3= 240M/s; 所以,可以适当调整es.batch.size.bytes;然后计算你单个doc的字节数;es.batch.size.bytes除以单个doc,就可以预估一个es.batch.size.entries的值;

要回复问题请先登录注册