大家有没有在bulk过程中处理NoNodeAvailableException的最佳实践??
Elasticsearch | 作者 ggchangan | 发布于2017年05月02日 | 阅读数:7186
通过bulk地方式,大批量(例如1千万)索引数据时,有可能出现NoNodeAvailableException异常,我采用
1.客户端仍然在生产数据
2.此策略过于被动,没有进行es集群状态检测。
对于这种场景,不知道哪些更好、更优雅地处理方式,希望大神们不吝赐教。
另外,还引入了另一个问题,就是在索引过程中,虽然发生了NoNodeAvailableException,并且打印处理异常索引的文档信息,但是最终在es查询时,可证明这些文档被正常索引了,(我索引1千万数据,出现NoNodeAvailableException时,有3000个文档信息被打印出来),然而,索引完毕后,es中存在这1千万个文档,也就是这3000个文档也被正确索引了。为什么这3000个文档会被正常索引?是ES有容错机制吗?
使用的elasticsearch版本是2.1.1
@Override public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
logger.error("index exceptions : " + failure);
StringBuilder exceptionData = new StringBuilder();
exceptionData.append("exception data :");
for(ActionRequest<?> ar : request.requests()) {
IndexRequest ir = (IndexRequest)ar;
exceptionData.append("index=").append(ir.index()).append(",type=").append(ir.type()).append(",id=").append(ir.id()).append("\n");
}
logger.error(exceptionData.toString());
if (failure instanceof NoNodeAvailableException) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.warn("{}", e);
Thread.currentThread().interrupt();
}
}
}
日志记录地方式来处理此问题,然而这种方法并不好:1.客户端仍然在生产数据
2.此策略过于被动,没有进行es集群状态检测。
对于这种场景,不知道哪些更好、更优雅地处理方式,希望大神们不吝赐教。
另外,还引入了另一个问题,就是在索引过程中,虽然发生了NoNodeAvailableException,并且打印处理异常索引的文档信息,但是最终在es查询时,可证明这些文档被正常索引了,(我索引1千万数据,出现NoNodeAvailableException时,有3000个文档信息被打印出来),然而,索引完毕后,es中存在这1千万个文档,也就是这3000个文档也被正确索引了。为什么这3000个文档会被正常索引?是ES有容错机制吗?
使用的elasticsearch版本是2.1.1
4 个回复
jerryhouse - 搜索工程师,技术网站:www.dcharm.com
赞同来自:
execute(BulkRequest bulkRequest, long executionId)方法:
ggchangan - 关注elasticsearch原理,源码,应用
赞同来自:
Jea - 一只猿
赞同来自:
我不会java从你后面的几个 ? 来回答吧
在es中, 有一个完整的translog 在数据索引和删除时会记录到translog中, 如果发生了操作失败, 那么在之后会触发并恢复数据来保证数据的写入或删除
另外, 之前帮人解决过类似的问题也是 NoNodeAvailableException , 和你的错误不知道是否一样, es的监听发生了错误, 在yml中配置network.host来解决
linyongzhi
赞同来自: