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)識(shí)即可

(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原理初探(可以忽略)

對(duì)于分詞的field執(zhí)行aggregation,發(fā)現(xiàn)報(bào)錯(cuò)。。。

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

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

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

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

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

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

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

如果你的某個(gè)field不分詞,那么在index-time,就會(huì)自動(dòng)生成doc value --> 針對(duì)這些不分詞的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)行聚合的

如果一定要對(duì)分詞的field執(zhí)行聚合,那么必須將fielddata=true,然后es就會(huì)在執(zhí)行聚合操作的時(shí)候,現(xiàn)場(chǎng)將field對(duì)應(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加載的,對(duì)一個(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ī)制(忽略吧)

如果真的要對(duì)分詞的field執(zhí)行聚合,那么每次都在query-time現(xiàn)場(chǎng)生產(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)存中來,這樣的話,對(duì)分詞field的聚合性能當(dāng)然會(huì)大幅度增強(qiáng)

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

POST /test_index/_mapping
{
  "properties": {
    "test_field": {
      "type": "text",
      "fielddata": {
        "loading" : "eager_global_ordinals" 
      }
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

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