Elasticsearch在Hdfs上build的实现及优化

引言

前段时间参与Elasticsearch离线平台化项目,主要是做一套Elasticsearch的buildservice, 一方面通过bahamut的数据流定义能力,直接对接用户原始数据,实现全增量一体化,解决用户准备数据的痛点。另一方面,社区的elasticsearch并没有全量增量的概念,所有数据都是用户通过sdk一条一条发给es在线服务构建索引,很难处理海量数据的场景,而且也难免对在线的性能产生影响,尤其是索引Merge的时候会严重影响线上服务的稳定性。所以,需要给Es做一个BuildService, 使之能够在blink集群上直接构建索引。

志宸老师在阿里云Elasticsearch离线平台化建设这篇文章中介绍了总体架构,本文再详细对ElasticBuild如何在Hdfs上构建索引以及一些相关的优化做一些介绍。

加载Hdfs索引

Elasticsearch在启动的时候,会为每个Index的每个Shard初始化一个InternalEngine实例,主要工作是恢复lucene的indexWriter及es的translog,原生的es只支持从本地加载索引文件,而修改后的ElasticBuild由于索引不落盘直接写到hdfs, 所以需要实现一种绕过本地磁盘直接加载hdfs上索引的方案。

HdfsDirectory

直接想到的一种办法是将索引拖到本地后再加载,显然这种方式时间代价太大,而且blink上的实例磁盘不一定能支持这么大的索引。所幸的是,lucene的索引读写接口Directory支持各种读写扩展,参考开源的组件,引入HdfsDirectory可以解决这个问题。

猜你喜欢

转载自my.oschina.net/u/3611008/blog/2964023