高峰只对攀登它而不是仰望它的人来说才有真正意义。

大家有没有在bulk过程中处理NoNodeAvailableException的最佳实践??

Elasticsearch | 作者 ggchangan | 发布于2017年05月02日 | 阅读数:6763

通过bulk地方式,大批量(例如1千万)索引数据时,有可能出现NoNodeAvailableException异常,我采用
        @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
已邀请:

jerryhouse - 搜索工程师,技术网站:www.dcharm.com

赞同来自:

BulkProcessor的handler自己有重试机制,参考代码BulkRequestHandler中的
execute(BulkRequest bulkRequest, long executionId)方法:
 
Retry.on(EsRejectedExecutionException.class)
.policy(backoffPolicy)
.withAsyncBackoff(client, bulkRequest, new ActionListener<BulkResponse>() {
@Override
public void onResponse(BulkResponse response) {
try {
listener.afterBulk(executionId, bulkRequest, response);
} finally {
semaphore.release();
}
}

@Override
public void onFailure(Exception e) {
try {
listener.afterBulk(executionId, bulkRequest, e);
} finally {
semaphore.release();
}
}
});

ggchangan - 关注elasticsearch原理,源码,应用

赞同来自:

我使用的是elasticsearch是2.1.1版本,并没有BulkRequestHandler这个类。

Jea - 一只猿

赞同来自:

被邀请了 - -#
我不会java从你后面的几个 ? 来回答吧
 
在es中, 有一个完整的translog 在数据索引和删除时会记录到translog中, 如果发生了操作失败, 那么在之后会触发并恢复数据来保证数据的写入或删除
 
另外, 之前帮人解决过类似的问题也是 NoNodeAvailableException , 和你的错误不知道是否一样, es的监听发生了错误, 在yml中配置network.host来解决

linyongzhi

赞同来自:

这个看起来很像单个节点压力过大,导致报出的异常。

要回复问题请先登录注册