Druid-Druid中Segment

  • 基于apache-druid-0.17

概述

  • Druid將索引存儲(chǔ)在按時(shí)間分區(qū)的Segment文件中。在基本的設(shè)置中或舞,會(huì)為每個(gè)時(shí)間間隔(time interval)創(chuàng)建一個(gè)segment文件荆姆。time interval可以由granularitySpec中的參數(shù)segmentGranularity決定。對(duì)于Druid來(lái)說(shuō)嚷那,在大量的查詢之下依舊表現(xiàn)優(yōu)秀胞枕。Segment的文件大小推薦在300MB-700MB。如果你的Segment文件大于這個(gè)范圍魏宽,那么可以考慮更改時(shí)間間隔的粒度腐泻,或者對(duì)數(shù)據(jù)進(jìn)行分區(qū)决乎,并在partitionsSpec中調(diào)整targetPartitionSize(此參數(shù)的一個(gè)良好起點(diǎn)是500萬(wàn)行)。

Segment文件核心的數(shù)據(jù)結(jié)構(gòu)

  • 描述Segment文件的內(nèi)部結(jié)構(gòu)派桩,它本質(zhì)上是柱狀的:每一列的數(shù)據(jù)以單獨(dú)的數(shù)據(jù)結(jié)構(gòu)布局构诚。通過(guò)單獨(dú)存儲(chǔ)每一列,Druid可以通過(guò)只掃描那些確實(shí)需要的列來(lái)減少查詢延遲铆惑。有三種基本的列類(lèi)型:時(shí)間戳列范嘱、維度列和度量列,如下圖所示:


    segment內(nèi)部數(shù)據(jù)結(jié)構(gòu)
  • 時(shí)間戳和度量列很簡(jiǎn)單:在數(shù)據(jù)內(nèi)部员魏,它們都是用LZ4壓縮的整數(shù)或浮點(diǎn)值數(shù)組丑蛤。一旦查詢知道需要選擇哪些行,它只需對(duì)這些行進(jìn)行解壓撕阎,提取相關(guān)行受裹,并應(yīng)用所需的聚合函數(shù)操作。與所有列一樣虏束,如果查詢不需要列棉饶,則跳過(guò)該列的數(shù)據(jù)。
  • 維度列是不同的镇匀,因?yàn)樗鼈冎С趾Y選和分組操作照藻,所以每個(gè)維度需要以下三個(gè)數(shù)據(jù)結(jié)構(gòu):
    • 1-將值(通常被視為字符串)映射為整數(shù)id的字典;
    • 2-列值的列表汗侵,使用1中的字典進(jìn)行編碼幸缕;
    • 3-對(duì)于列中的每個(gè)不同的值,使用bitmap指示哪些行包含該值晃择。
  • 為什么是這三種數(shù)據(jù)結(jié)構(gòu)?字典簡(jiǎn)單地將字符串值映射為整數(shù)id冀值,以便(2)和(3)中的值能夠緊湊地表示。(3)中的bitmap——也稱為反向索引宫屠,允許快速過(guò)濾操作(具體來(lái)說(shuō)列疗,位圖便于快速應(yīng)用AND和OR操作符)。最后浪蹂,group by和TopN查詢需要(2)中的值列表抵栈。換句話說(shuō),僅基于過(guò)濾器聚合度量的查詢不需要觸及存儲(chǔ)在(2)中的維值列表坤次。
  • 要獲得這些數(shù)據(jù)結(jié)構(gòu)的具體信息古劲,請(qǐng)考慮上面示例數(shù)據(jù)中的“page”列。表示此維度的三個(gè)數(shù)據(jù)結(jié)構(gòu)在下面的關(guān)系圖中進(jìn)行了說(shuō)明缰猴。
1: Dictionary that encodes column values
  {
    "Justin Bieber": 0,
    "Ke$ha":         1
  }

2: Column data
  [0,
   0,
   1,
   1]

3: Bitmaps - one for each unique value of the column
  value="Justin Bieber": [1,1,0,0]
  value="Ke$ha":         [0,0,1,1]
  • 注意产艾,bitmap與前兩個(gè)數(shù)據(jù)結(jié)構(gòu)不同:前兩個(gè)數(shù)據(jù)結(jié)構(gòu)在數(shù)據(jù)大小上是線性增長(zhǎng)的(在最壞的情況下),而bitmap部分的大小是數(shù)據(jù)大小*列基數(shù)的乘積。壓縮將在這里幫助我們闷堡,因?yàn)槲覀冎腊欤瑢?duì)于“列數(shù)據(jù)”中的每一行,將只有一個(gè)非零項(xiàng)的bitmap杠览。這意味著高基數(shù)列將具有非常稀疏的bitmap弯菊,因此具有高度可壓縮的bitmap。Druid利用這種壓縮算法踱阿,特別適合bitmap管钳,例如roaring bitmap compression

Multi-value列

  • 如果一個(gè)數(shù)據(jù)源使用了多值列软舌,那么段文件中的數(shù)據(jù)結(jié)構(gòu)看起來(lái)就有些不同才漆。讓我們想象一下,在上面的例子中葫隙,第二行被標(biāo)記為“Ke$ha”和“Justin Bieber”主題栽烂。在這種情況下,三個(gè)數(shù)據(jù)結(jié)構(gòu)現(xiàn)在看起來(lái)如下:
1: Dictionary that encodes column values
  {
    "Justin Bieber": 0,
    "Ke$ha":         1
  }

2: Column data
  [0,
   [0,1],  <--Row value of multi-value column can have array of values
   1,
   1]

3: Bitmaps - one for each unique value
  value="Justin Bieber": [1,1,0,0]
  value="Ke$ha":         [0,1,1,1]
                            ^
                            |
                            |
    Multi-value column has multiple non-zero entries
  • 注意對(duì)列數(shù)據(jù)中的第二行和Ke$ha bitmap數(shù)據(jù)結(jié)構(gòu) 的更改恋脚。如果一個(gè)行中有一個(gè)以上的值對(duì)應(yīng)一個(gè)列,那么它在“列數(shù)據(jù)”中的條目就是一個(gè)值數(shù)組焰手。此外糟描,在“列數(shù)據(jù)”中有n個(gè)值的行在bitmap中有n個(gè)非零值項(xiàng)。

Sql兼容null值處理

  • 默認(rèn)情況下书妻,Druid的字符串維度列使用' 'null船响,數(shù)值和度量列不能表示空值,而是強(qiáng)制空值為0躲履。但是见间,Druid也提供了一個(gè)SQL兼容的空處理模式,配置參數(shù)為:druid.generic.useDefaultValueForNull工猜,必須在系統(tǒng)級(jí)啟用米诉,通過(guò)這個(gè)設(shè)置,當(dāng)設(shè)置為fasle時(shí)篷帅,將允許Druid在提取數(shù)據(jù)的時(shí)候創(chuàng)建Segment史侣,其字符串列可以區(qū)分' 'null值中,數(shù)字列可以代表null值行魏身,而不是0惊橱。
  • 在此模式下,字符串維度列不包含任何附加的列結(jié)構(gòu)箭昵,而只是為空值保留一個(gè)附加的字典項(xiàng)税朴。然而,數(shù)值列將與一個(gè)額外的bitmap一起存儲(chǔ)在Segment中,Bitmap的集合位表示空值行正林。除了稍微增加了Segment大小之外茧跋,由于需要檢查空值Bitmap,SQL兼容的空處理還會(huì)在查詢時(shí)產(chǎn)生性能成本卓囚。這種性能開(kāi)銷(xiāo)只出現(xiàn)在實(shí)際包含null的列上瘾杭。

命名約定

  • Segment的標(biāo)識(shí)符通常使用Segment數(shù)據(jù)源、間隔開(kāi)始時(shí)間(ISO 8601格式)哪亿、間隔結(jié)束時(shí)間(ISO 8601格式)和版本來(lái)構(gòu)造粥烁。如果將數(shù)據(jù)分片到時(shí)間范圍之外,則段標(biāo)識(shí)符也將包含分區(qū)號(hào)蝇棉。
  • eg:datasource_intervalStart_intervalEnd_version_partitionNum

Segment組成

  • 一個(gè)Segment有以下幾個(gè)文件組成讨阻;
  • version.bin:
    • 4個(gè)字節(jié)表示當(dāng)前段版本為整數(shù)。E.g., for v9 segments, the version is 0x0, 0x0, 0x0, 0x9
  • meta.smoosh:
    • 帶有關(guān)于其他smoosh文件內(nèi)容的元數(shù)據(jù)(文件名和偏移量)的文件;
  • XXXXX.smoosh:
    • 存在一些二進(jìn)制的文件:
    • smoosh文件表示多個(gè)文件“smoosh”在一起篡殷,以最小化必須打開(kāi)來(lái)存放數(shù)據(jù)的文件描述符的數(shù)量钝吮。它們是最大2GB的文件(以匹配Java中映射的ByteBuffer的內(nèi)存限制)。smoosh文件包含數(shù)據(jù)中每個(gè)列的單獨(dú)文件和索引板辽。帶有關(guān)于Segment的額外元數(shù)據(jù)的drd文件奇瘦。
    • 還有一個(gè)名為_time的特殊列,它引用段的時(shí)間列劲弦。隨著代碼的發(fā)展耳标,這將變得越來(lái)越不特別,但現(xiàn)在它就像我媽媽總是告訴我的那樣特別邑跪。

列的格式

  • 每一個(gè)列存儲(chǔ)為兩部分:
    • 1-A Jackson-serialized ColumnDescriptor次坡;
    • 2-The rest of the binary for the column;
  • ColumnDescriptor本質(zhì)上是一個(gè)對(duì)象画畅,它允許我們使用Jackson的多態(tài)反序列化來(lái)添加新的砸琅、有趣的序列化方法,并且對(duì)代碼的影響最小轴踱。它包括關(guān)于列的一些元數(shù)據(jù)(它是什么類(lèi)型的症脂,它是多值的,等等)寇僧,然后是一個(gè)序列化/反序列化邏輯列表摊腋,可以反序列化二進(jìn)制的其余部分。

分片數(shù)據(jù)創(chuàng)建Segment

分片

  • 對(duì)于相同的datasource嘁傀,多個(gè)Segment可能在相同的時(shí)間間隔(interval time)兴蒸。這些Segment在一個(gè)區(qū)間內(nèi)構(gòu)成一個(gè)block。取決于用來(lái)切分?jǐn)?shù)據(jù)的shardSpec類(lèi)型细办,Druid的查詢只有在一個(gè)block完成的情況下才能完成橙凳。也就是說(shuō)蕾殴,如果一個(gè)block包含三個(gè)segment,例如:

sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_0
sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_1
sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_2

  • 在間隔為2011-01- 01t02:00:00:00的查詢完成之前岛啸,必須加載所有3個(gè)Segment钓觉。
  • 這個(gè)規(guī)則的例外是使用線性分片規(guī)范。線性分片規(guī)范并不強(qiáng)制“完整性”坚踩,即使系統(tǒng)中沒(méi)有加載分片荡灾,查詢也可以完成。例如瞬铸,如果您的實(shí)時(shí)攝取創(chuàng)建了3個(gè)線性切分規(guī)范的Segment批幌,并且系統(tǒng)中只加載了其中的兩個(gè)Segment,那么查詢將只返回這兩個(gè)Segment的結(jié)果嗓节。

結(jié)構(gòu)變化

替換Segment

  • Druid使用數(shù)據(jù)源荧缘、間隔、版本和分區(qū)號(hào)唯一地標(biāo)識(shí)Segment拦宣。只有在為某個(gè)時(shí)間粒度創(chuàng)建多個(gè)Segment時(shí)截粗,分區(qū)號(hào)才在Segment中id中可見(jiàn)。例如鸵隧,如果您有每小時(shí)的Segment绸罗,但是您在一個(gè)小時(shí)內(nèi)擁有的數(shù)據(jù)比單個(gè)Segment所能容納的數(shù)據(jù)更多,那么您可以為同一小時(shí)創(chuàng)建多個(gè)Segment掰派。這些Segment將共享相同的數(shù)據(jù)源从诲、時(shí)間間隔和版本,但分區(qū)數(shù)將線性增加靡羡。
foo_2015-01-01/2015-01-02_v1_0
foo_2015-01-01/2015-01-02_v1_1
foo_2015-01-01/2015-01-02_v1_2
  • 上面案例中 dataSource = foo, interval = 2015-01-01/2015-01-02, version = v1, and partitionNum = 0。如果在以后的某個(gè)時(shí)候俊性,您使用新的模式重新索引數(shù)據(jù)略步,那么新創(chuàng)建的Segment將具有更高的版本id。
foo_2015-01-01/2015-01-02_v2_0
foo_2015-01-01/2015-01-02_v2_1
foo_2015-01-01/2015-01-02_v2_2
  • Druid批量索引(基于hadoop或基于indextquest)保證了每隔一段時(shí)間的原子更新定页。在我們的例子中趟薄,在所有的v2段(2015-01-01 - 2015-01-02)加載到一個(gè)Druid集群之前,查詢只使用v1段典徊。一旦所有的v2段被加載并可查詢杭煎,所有的查詢都會(huì)忽略v1段并切換到v2段。不久之后卒落,v1片段將從集群中卸載羡铲。
  • 注意,跨越多個(gè)段間隔的更新只是每個(gè)間隔內(nèi)的原子更新儡毕。它們?cè)谡麄€(gè)更新中不是原子性的也切。例如,你有如下Segment:
foo_2015-01-01/2015-01-02_v1_0
foo_2015-01-02/2015-01-03_v1_1
foo_2015-01-03/2015-01-04_v1_2
  • v2 Segment將在構(gòu)建后立即加載到集群中,并在Segment重疊期間替換v1 Segment雷恃。在v2 Segment 完全加載之前疆股,您的集群可能混合了v1和v2 的Segment。
foo_2015-01-01/2015-01-02_v1_0
foo_2015-01-02/2015-01-03_v2_1
foo_2015-01-03/2015-01-04_v1_2
  • In this case, queries may hit a mixture of v1 and v2 segments.

Segment中不同的schema

  • 同一DataSource在Druid的Segment可能有不同的schemas倒槐。如果一個(gè)字符串列(維度)存在于一個(gè)Segment中而不存在于另一個(gè)Segment中旬痹,則涉及兩個(gè)Segment的查詢?nèi)匀挥行А?duì)于缺少維度的Segment的查詢將表現(xiàn)為該維度只有空值讨越。類(lèi)似地两残,如果一個(gè)Segment有一個(gè)數(shù)字列(度量)而另一個(gè)沒(méi)有,那么缺少度量的段上的查詢通常會(huì)“do the right thing”谎痢。會(huì)有丟失度量的聚合行為磕昼。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市节猿,隨后出現(xiàn)的幾起案子票从,更是在濱河造成了極大的恐慌,老刑警劉巖滨嘱,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峰鄙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡太雨,警方通過(guò)查閱死者的電腦和手機(jī)吟榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)囊扳,“玉大人吩翻,你說(shuō)我怎么就攤上這事∽断蹋” “怎么了狭瞎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搏予。 經(jīng)常有香客問(wèn)我熊锭,道長(zhǎng),這世上最難降的妖魔是什么雪侥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任碗殷,我火速辦了婚禮,結(jié)果婚禮上速缨,老公的妹妹穿的比我還像新娘锌妻。我一直安慰自己,他們只是感情好鸟廓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布从祝。 她就那樣靜靜地躺著襟己,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牍陌。 梳的紋絲不亂的頭發(fā)上擎浴,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音毒涧,去河邊找鬼贮预。 笑死,一個(gè)胖子當(dāng)著我的面吹牛契讲,可吹牛的內(nèi)容都是我干的仿吞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捡偏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唤冈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起银伟,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤你虹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后彤避,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體傅物,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年琉预,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了董饰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圆米,死狀恐怖卒暂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娄帖,我是刑警寧澤介却,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站块茁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桂肌。R本人自食惡果不足惜数焊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崎场。 院中可真熱鬧佩耳,春花似錦、人聲如沸谭跨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛮瞄,卻和暖如春所坯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挂捅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芹助, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲先。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓状土,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伺糠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒙谓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 我們知道Druid能夠同時(shí)提供對(duì)大數(shù)據(jù)集的實(shí)時(shí)攝入和高效復(fù)雜查詢的性能,主要原因就是它獨(dú)到的架構(gòu)設(shè)計(jì)和基于Data...
    零度沸騰_yjz閱讀 21,519評(píng)論 3 17
  • Druid.io(以下簡(jiǎn)稱Druid)是面向海量數(shù)據(jù)的训桶、用于實(shí)時(shí)查詢與分析的OLAP存儲(chǔ)系統(tǒng)累驮。Druid的四大關(guān)鍵...
    大詩(shī)兄_zl閱讀 6,460評(píng)論 0 9
  • 我們知道Druid能夠同時(shí)提供對(duì)大數(shù)據(jù)集的實(shí)時(shí)攝入和高效復(fù)雜查詢的性能,主要原因就是它獨(dú)到的架構(gòu)設(shè)計(jì)和基于Data...
    allin8116閱讀 480評(píng)論 0 2
  • 作者: 康凱森 日期: 2017-11-02 分類(lèi):OLAP What is Druid Why Druid Dr...
    茂盛哥哥閱讀 958評(píng)論 0 0
  • 0. Overview 后面將寫(xiě)幾篇文章介紹一下 OLAP 的大數(shù)據(jù)系統(tǒng)架構(gòu)渊迁。這里的 Druid 不是阿里巴巴的連...
    legendtkl閱讀 4,131評(píng)論 1 3