1. 程式人生 > >Elasticsearch在Hdfs上build的實現及優化

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可以解決這個問題。