分析Elasticsearch的Aggregation有感(一)

分析Elasticsearch的Aggregation有感(一)

Elasticsearch除了全文檢索之外憎茂,引以為傲的便是各種聚合算法芋绸,如kibana中最為常用的以時間軸的刻度為桶bucket進行統(tǒng)計节腐、累加等聚合計算臭挽。


分析Elasticsearch的聚合統(tǒng)計為什么能做到實時響應(yīng)遭笋?其實原理相當簡tong單,主要依賴fielddata(內(nèi)存常駐壶硅,逐漸被doc_values取代)威兜,將需要排序的字段記錄事先排好序記錄在內(nèi)存中或保存在節(jié)點磁盤上;加上集群分布式計算能力庐椒,能做到聚合計算極快椒舵。

桶中桶的聚合計算則是Elasticsearch的噩夢,經(jīng)常在不怎么大的數(shù)據(jù)量下出現(xiàn)OOM约谈;Elasticsearch所有的計算都采用以下方式笔宿;


當請求發(fā)現(xiàn)集群中的任何一個節(jié)點,該節(jié)點必須負責將數(shù)據(jù)進行整理匯聚棱诱,再返回給客戶端泼橘,也就是一個簡單的節(jié)點上進行Map計算,在一個固定的節(jié)點上進行Reduces得到最終Map集合向客戶端返回迈勋。

當進行桶中桶計算時炬灭,Elasticsearch將該過程只進行了簡單拆分,分別計算出兩個聚合的桶的結(jié)果集靡菇,再進行兩個結(jié)果集的Join重归。

也就是Hadoop進行Join計算時的Redece端進行Join計算米愿,這時所匯聚的數(shù)據(jù)量以及Join計算時K(k1-k2)所產(chǎn)生的新的鍵值急速膨脹,最終導致匯聚節(jié)點的OOM提前。


Elasticsearch當前始終堅持采用簡單的查詢發(fā)起節(jié)點負責數(shù)據(jù)匯聚吗货,跟Elasticsearch及搜索引擎技術(shù)的特點有關(guān),即保證TopN的檢索效率狈网,每個計算節(jié)點只返回各自的TopN宙搬,再由匯聚節(jié)點整合計算出TopN,這樣節(jié)點向匯聚節(jié)點所傳輸?shù)臄?shù)據(jù)始終較型夭浮勇垛;這樣設(shè)計帶來的問題是,無法進行復雜的計算士鸥,如桶中桶闲孤,Any Join等這些其他類型的數(shù)據(jù)倉庫所具備的功能。

當前解決這個問題的辦法烤礁,首先能想到的就是與分布式計算引擎來結(jié)合讼积,復雜的計算交給分布式計算引擎來完成,所以自然出現(xiàn)了Elasticsearch-Hadoop的連接組件脚仔。但嘗試使用過Elasticsearch-Hadoop的人最終都放棄了勤众,原因是當前Hadoop與Elasticsearch結(jié)合時,僅僅把Elasticsearch當前類似Txt類型的存儲鲤脏,進行計算時Hadoop的Map任務(wù)通過Elasticsearch-Hadoop提供InputFormat们颜,只是簡單通過Elasticsearch的Scroll對數(shù)據(jù)進行全量的讀取。

這里我們測試過一般硬件配置配置(32核猎醇,128G內(nèi)存窥突,3*4TB硬盤,千兆網(wǎng)卡)組成的4節(jié)點集群硫嘶,最大的Scroll性能只能到20W-30W條/s(1k每條記錄)阻问;簡單計算下,當需要分析10億級別的數(shù)據(jù)時沦疾,光數(shù)據(jù)從Elasticsearch集群加載到Hadoop集群所需要的時間是多少则拷。

所以只是將Elasticsearch當作普通存儲來進行兩個集群的結(jié)合顯然不合適,如何發(fā)揮兩個集群各種的計算特點來適應(yīng)各種不同的計算需求曹鸠,下面來看看我們的研究方向:

修改Elasticsearch的底層計算邏輯,在進行復雜計算時斥铺,不是采用簡單的計算任務(wù)拆分彻桃,下發(fā)計算,再匯聚這樣粗暴的方式晾蜘,而是類似Hadoop上的優(yōu)化邻眷,在進行第一層節(jié)點計算后眠屎,中間在穿插一層shuffle過程,將需要進行Join計算的Maps肆饶,進行相應(yīng)的排序改衩,遷移評估,再執(zhí)行遷移驯镊,保證數(shù)據(jù)在節(jié)點間最小遷移的情況下葫督,再在遷移后的節(jié)點上進行Join,再進行Reduce板惑,是不是已經(jīng)暈了橄镜。所以暫時我們也沒有計算對這部分進行如此徹底的修改。

? ? ? ? 如何將Elastcicearch如何與Hadoop的有機結(jié)合冯乘,但不是如何提高scroll速度或Map任務(wù)直接對Lucese文件進行直接的IO等洽胶,將數(shù)據(jù)全量讀取到Hadoop集群,而接下來的任何分析都與Elasticsearch沒有任何關(guān)系的做法裆馒。

根據(jù)Elasticsearch數(shù)據(jù)shard的分布姊氓,設(shè)置Hadoop的Map任務(wù),保持Map采用Local方式訪問一個或多個分片喷好,將Map操作的數(shù)據(jù)流控制在Local上翔横。

publicList getSplits(JobContext job)throwsIOException {

// getshards splits

List originalSplits =ElasticserchCatShards(job);

// Get active servers

String[] servers = getActiveServersList(job);

if(servers ==null)

returnnull;

// reassign splits to active servers

List splits =newArrayList(originalSplits.size());

intnumSplits = originalSplits.size();

intcurrentServer = 0;

for(inti = 0; i < numSplits; i++, currentServer = i>getNextServer(currentServer,?servers.length)){

String server = servers[currentServer]; // Current server

booleanreplaced =false;

// For every remaining split

for(InputSplitsplit : originalSplits){

FileSplit fs = (FileSplit)split;

// For every split location

for(String l : fs.getLocations()){

// If this split is local to the server

if(l.equals(server)){

// Fix split location

splits.add(newFileSplit(fs.getPath(), fs.getStart(),

fs.getLength(),newString[] {server}));

originalSplits.remove(split);

replaced =true;

break;

}

}

if(replaced)

break;

}

// If no local splits are found for this server

if(!replaced){

// Assign first available split to it

FileSplit fs = (FileSplit)splits.get(0);

splits.add(newFileSplit(fs.getPath(), fs.getStart(), fs.getLength(),

newString[] {server}));

originalSplits.remove(0);

}

}

returnsplits;

}

對計算任務(wù)進行拆分,在進行底層數(shù)據(jù)Input時绒窑,采用的scroll+query方式棕孙,指定分片進行查詢。

publicbooleannext(Kkey, Vvalue)throwsIOException {

if(scrollQuery==null) {

if(beat!=null) {

beat.start();

}

#set querey shards and host:127.0.0.1

scrollQuery=queryBuilder.build(client, scrollReader,shards,host);

size=scrollQuery.getSize();

if(log.isTraceEnabled()) {

log.trace(String.format("Received scroll [%s], size [%d] for query [%s]", scrollQuery, size, queryBuilder));

}

}

booleanhasNext=scrollQuery.hasNext();

if(!hasNext) {

returnfalse;

}

Object[] next=scrollQuery.next();

// NB: the left assignment is not needed since method override

// the writable content however for consistency, they are below

currentKey=setCurrentKey(key, next[0]);

currentValue=setCurrentValue(value, next[1]);

// keep on counting

read++;

returntrue;

}

? ? ? ? ? 當然這樣的做法些膨,還是無法徹底解決單個shards數(shù)據(jù)量過大的情況下蟀俊,單個Map任務(wù)加載速度過慢情況的出現(xiàn)。通過Demo測試订雾,性能要較原生的Elasticsearch-Hadoop控件有50倍左右提升肢预。

? ? ? ? ? 研究的另一個方向是對doc_values數(shù)據(jù)文件的分析,doc_values文件的設(shè)計是解決fielddata占用內(nèi)存過大洼哎,通過分析doc_value和fielddata烫映,一個字段的數(shù)據(jù)進行排序存儲在內(nèi)存和磁盤,其不就是天生的列式存儲么噩峦!采用將Map任務(wù)直接對Doc_value文件的讀取加載锭沟,理論上是可以繞過Elasticsearch的計算節(jié)點的,需要我們小伙伴們加快研究步伐识补,解決Elastticsearch無法進行復雜計算的痛病族淮,至少實現(xiàn)桶中桶,在進行soc分析經(jīng)常被提及的需求。

->

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祝辣,一起剝皮案震驚了整個濱河市贴妻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙斜,老刑警劉巖名惩,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孕荠,居然都是意外死亡娩鹉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門岛琼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底循,“玉大人,你說我怎么就攤上這事槐瑞∥醯樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵困檩,是天一觀的道長祠挫。 經(jīng)常有香客問我,道長悼沿,這世上最難降的妖魔是什么等舔? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮糟趾,結(jié)果婚禮上慌植,老公的妹妹穿的比我還像新娘。我一直安慰自己义郑,他們只是感情好蝶柿,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著非驮,像睡著了一般交汤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫笙,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天芙扎,我揣著相機與錄音,去河邊找鬼填大。 笑死戒洼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的允华。 我是一名探鬼主播施逾,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敷矫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汉额?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榨汤,失蹤者是張志新(化名)和其女友劉穎蠕搜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體收壕,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妓灌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜宪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虫埂。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圃验,靈堂內(nèi)的尸體忽然破棺而出掉伏,到底是詐尸還是另有隱情,我是刑警寧澤澳窑,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布斧散,位于F島的核電站,受9級特大地震影響摊聋,放射性物質(zhì)發(fā)生泄漏鸡捐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一麻裁、第九天 我趴在偏房一處隱蔽的房頂上張望箍镜。 院中可真熱鬧,春花似錦煎源、人聲如沸色迂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚草。三九已至,卻和暖如春原献,著一層夾襖步出監(jiān)牢的瞬間馏慨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工姑隅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留写隶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓讲仰,卻偏偏與公主長得像慕趴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容