Spark写入elasticsearch报错Could not write all entries for bulk operation以及Connection error

问题:org.elasticsearch.hadoop.EsHadoopException: Could not write all entries for bulk operation以及Connection error

解决方法:

添加参数

val conf = new SparkConf();
conf.set("es.nodes", elasticsearch_nodes);
conf.set("es.batch.write.retry.count", "10"); # 默认是重试3次,为负值的话为无限重试(慎用)
conf.set("es.batch.write.retry.wait", "60"); # 默认重试等待时间是10s.可适当加大
conf.set("es.http.timeout", "100s"); # 连接es的超时时间设置,默认1m,Connection error时可适当加大此参数

另外:当我把数据存在hive中的时候无论怎样设置参数往es写都会报Could not write all entries for bulk operation的错,但是把数据存mongo之后再往es写就不会出错了,具体原因还没找到,在这里标记下,日后解决,也顺便给大家个解决思路.
原因:
ES后台的bulk的线程池最大只支持接受200请求数队列,超过的请求会被rejected,抛出这个异常,使用的时候建议根据情况调整客户端的并发写入请求数(调整到一个合适的阈值),另外被rejected的http请求ES-Hadoop是有重试机制的,这是可配参数,通过修改数:
“es.batch.write.retry.count” 默认重试3次
“es.batch.write.retry.wait” 每次重试等待时间10s
修改即可。
上面提供的方案只是提供寻找客户端的最佳并发写入请求数,使得ES的写入性能最优,如果要加大索引数据的写入的性能,可通过调整refresh和flush的时间等参数来提高数据的入库速度。

Could not write all entries for bulk operation还有种情况就是某一列中的数据不一致,导致es在对数据入库的时候,不能识别两种format
如:
{“name”:“Draven”,“nickname”:“the Glorious Executioner”,“time”:“2019-02-14”}
{“name”:“Lucian”,“nickname”:“The Purifier”,“time”:“2019-02-14”}
{“name”:“Jax”,“nickname”:“Grandmaster at Arms”,“time”:“3天前”}
es在对json中的time进行格式定义时不能统一format

参考:
https://bbs.huaweicloud.com/forum/thread-7718-1-1.html
https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html

另外,想了解refresh和flush的区别的看这里:传送门1,传送门2

发布了276 篇原创文章 · 获赞 109 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/lvtula/article/details/103477221
今日推荐