前段時間參與Elasticsearch離線平臺化項目,主要是作一套Elasticsearch的buildservice, 一方面經過bahamut的數據流定義能力,直接對接用戶原始數據,實現全增量一體化,解決用戶準備數據的痛點。另外一方面,社區的elasticsearch並無全量增量的概念,全部數據都是用戶經過sdk一條一條發給es在線服務構建索引,很難處理海量數據的場景,並且也不免對在線的性能產生影響,尤爲是索引Merge的時候會嚴重影響線上服務的穩定性。因此,須要給Es作一個BuildService, 使之可以在blink集羣上直接構建索引。架構
志宸老師在阿里雲Elasticsearch離線平臺化建設這篇文章中介紹了整體架構,本文再詳細對ElasticBuild如何在Hdfs上構建索引以及一些相關的優化作一些介紹。elasticsearch
Elasticsearch在啓動的時候,會爲每一個Index的每一個Shard初始化一個InternalEngine實例,主要工做是恢復lucene的indexWriter及es的translog,原生的es只支持從本地加載索引文件,而修改後的ElasticBuild因爲索引不落盤直接寫到hdfs, 因此須要實現一種繞過本地磁盤直接加載hdfs上索引的方案。性能
直接想到的一種辦法是將索引拖到本地後再加載,顯然這種方式時間代價太大,並且blink上的實例磁盤不必定能支持這麼大的索引。所幸的是,lucene的索引讀寫接口Directory支持各類讀寫擴展,參考開源的組件,引入HdfsDirectory能夠解決這個問題。優化