34、聚合分析的內(nèi)部原理竣贪,_string field聚合實(shí)驗(yàn)以及fielddata原理初探

主要內(nèi)容: 聚合分析的內(nèi)部原理军洼,_string field聚合實(shí)驗(yàn)以及fielddata原理初探

1巩螃、聚合分析的內(nèi)部原理

doc value:正排索引

1、doc value原理

(1)index-time生成

PUT/POST的時(shí)候匕争,就會(huì)生成doc value數(shù)據(jù)避乏,也就是正排索引

(2)核心原理與倒排索引類似

正排索引,也會(huì)寫入磁盤文件中甘桑,然后呢拍皮,os cache先進(jìn)行緩存,以提升訪問doc value正排索引的性能
如果os cache內(nèi)存大小不足夠放得下整個(gè)正排索引跑杭,doc value铆帽,就會(huì)將doc value的數(shù)據(jù)寫入磁盤文件中

(3)性能問題:給jvm更少內(nèi)存,

es官方是建議德谅,es大量是基于os cache來進(jìn)行緩存和提升性能的爹橱,不建議用jvm內(nèi)存來進(jìn)行緩存,那樣會(huì)導(dǎo)致一定的gc開銷和oom問題窄做,給jvm更少的內(nèi)存愧驱,給os cache更大的內(nèi)存,os cache可以提升doc value和倒排索引的緩存和查詢效率椭盏。(64g服務(wù)器冯键,給jvm最多16g)

2、column壓縮

合并相同值庸汗,550惫确,doc1和doc2都保留一個(gè)550的標(biāo)識即可

(1)所有值相同,直接保留單值
(2)少于256個(gè)值蚯舱,使用table encoding模式:一種壓縮方式
(3)大于256個(gè)值改化,看有沒有最大公約數(shù),有就除以最大公約數(shù)枉昏,然后保留這個(gè)最大公約數(shù)
(4)如果沒有最大公約數(shù)陈肛,采取offset結(jié)合壓縮的方式:

3、disable doc value

如果的確不需要doc value兄裂,比如聚合等操作句旱,那么可以禁用,減少磁盤空間占用

PUT my_index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "keyword",
        "doc_values": false
      }
    }
  }
}

2晰奖、_string field聚合實(shí)驗(yàn)以及fielddata原理初探(可以忽略)

對于分詞的field執(zhí)行aggregation谈撒,發(fā)現(xiàn)報(bào)錯(cuò)。匾南。啃匿。

GET /test_index/_search 
{
  "aggs": {
    "group_by_test_field": {
      "terms": {
        "field": "test_field"
      }
    }
  }
}

對分詞的field,直接執(zhí)行聚合操作,會(huì)報(bào)錯(cuò)溯乒,大概意思是說夹厌,你必須要打開fielddata,然后將正排索引數(shù)據(jù)加載到內(nèi)存中裆悄,才可以對分詞的field執(zhí)行聚合操作矛纹,而且會(huì)消耗很大的內(nèi)存

給分詞的field,設(shè)置fielddata=true光稼,可以執(zhí)行聚合

POST /test_index/_mapping/ 
{
  "properties": {
    "test_field": {
      "type": "text",
      "fielddata": true
    }
  }
}

如果對不分詞的field執(zhí)行聚合操作或南,直接就可以執(zhí)行,不需要設(shè)置fieldata=true

3钟哥、分詞field+fielddata的工作原理

(正常情況下不對未分詞的字段進(jìn)行聚合操作)

如果你的某個(gè)field不分詞,那么在index-time瞎访,就會(huì)自動(dòng)生成doc value --> 針對這些不分詞的field執(zhí)行聚合操作的時(shí)候腻贰,自動(dòng)就會(huì)用doc value來執(zhí)行

分詞的field,是沒有doc value的扒秸。播演。。在index-time伴奥,如果某個(gè)field是分詞的写烤,那么是不會(huì)給它建立doc value正排索引的,因?yàn)榉衷~后拾徙,占用的空間過于大洲炊,所以默認(rèn)是不支持分詞field進(jìn)行聚合的

如果一定要對分詞的field執(zhí)行聚合,那么必須將fielddata=true尼啡,然后es就會(huì)在執(zhí)行聚合操作的時(shí)候暂衡,現(xiàn)場將field對應(yīng)的數(shù)據(jù),建立一份fielddata正排索引崖瞭,然后基于內(nèi)存中的fielddata正排索引執(zhí)行分詞field的聚合操作

為什么fielddata必須在內(nèi)存狂巢?

分詞的字符串,需要按照term進(jìn)行聚合书聚,需要執(zhí)行更加復(fù)雜的算法和操作唧领,如果基于磁盤和os cache,那么性能會(huì)很差

3雌续、fielddata核心原理(同上斩个,忽略)

1、fielddata核心原理

fielddata加載到內(nèi)存的過程是lazy加載的驯杜,對一個(gè)analzyed field執(zhí)行聚合時(shí)萨驶,才會(huì)加載,而且是field-level加載的
一個(gè)index的一個(gè)field艇肴,所有doc都會(huì)被加載腔呜,而不是少數(shù)doc
不是index-time創(chuàng)建叁温,是query-time創(chuàng)建

2、fielddata內(nèi)存限制

indices.fielddata.cache.size: 20%核畴,超出限制膝但,清除內(nèi)存已有fielddata數(shù)據(jù)
fielddata占用的內(nèi)存超出了這個(gè)比例的限制,那么就清除掉內(nèi)存中已有的fielddata數(shù)據(jù)
默認(rèn)無限制谤草,限制內(nèi)存使用跟束,但是會(huì)導(dǎo)致頻繁evict和reload,大量IO性能損耗丑孩,以及內(nèi)存碎片和gc

3冀宴、監(jiān)控fielddata內(nèi)存使用

GET /_stats/fielddata?fields=* 
GET /_nodes/stats/indices/fielddata?fields=* ##節(jié)點(diǎn)的使用情況
GET /_nodes/stats/indices/fielddata?level=indices&fields=*

4、_fielddata預(yù)加載機(jī)制(忽略吧)

如果真的要對分詞的field執(zhí)行聚合温学,那么每次都在query-time現(xiàn)場生產(chǎn)fielddata并加載到內(nèi)存中來略贮,速度可能會(huì)比較慢

我們是不是可以預(yù)先生成加載fielddata到內(nèi)存中來?仗岖?逃延?

1、fielddata預(yù)加載 (程序報(bào)錯(cuò)轧拄,遇到再研究)

POST /test_index/_mapping
{
  "properties": {
    "test_field": {
      "type": "text",
      "fielddata": {
        "loading" : "eager" 
      }
    }
  }
}

query-time的fielddata生成和加載到內(nèi)存揽祥,變?yōu)閕ndex-time,建立倒排索引的時(shí)候檩电,會(huì)同步生成fielddata并且加載到內(nèi)存中來拄丰,這樣的話,對分詞field的聚合性能當(dāng)然會(huì)大幅度增強(qiáng)

2俐末、序號標(biāo)記預(yù)加載

POST /test_index/_mapping
{
  "properties": {
    "test_field": {
      "type": "text",
      "fielddata": {
        "loading" : "eager_global_ordinals" 
      }
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愈案,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹅搪,更是在濱河造成了極大的恐慌站绪,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽柿,死亡現(xiàn)場離奇詭異恢准,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甫题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門馁筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坠非,你說我怎么就攤上這事敏沉。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵盟迟,是天一觀的道長秋泳。 經(jīng)常有香客問我,道長攒菠,這世上最難降的妖魔是什么迫皱? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮辖众,結(jié)果婚禮上卓起,老公的妹妹穿的比我還像新娘。我一直安慰自己凹炸,他們只是感情好戏阅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啤它,像睡著了一般奕筐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚕键,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天救欧,我揣著相機(jī)與錄音衰粹,去河邊找鬼锣光。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铝耻,可吹牛的內(nèi)容都是我干的誊爹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瓢捉,長吁一口氣:“原來是場噩夢啊……” “哼频丘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泡态,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搂漠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后某弦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐汤,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年靶壮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怔毛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腾降,死狀恐怖拣度,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤抗果,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布瓢湃,位于F島的核電站控轿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晒喷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宫峦。 院中可真熱鬧血公,春花似錦、人聲如沸睦霎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽副女。三九已至蛤高,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碑幅,已是汗流浹背戴陡。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沟涨,地道東北人恤批。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像裹赴,于是被迫代替她去往敵國和親喜庞。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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