Cube的使用包含創(chuàng)建和構(gòu)建兩個(gè)過程。
創(chuàng)建可以理解為“定義數(shù)據(jù)結(jié)構(gòu)的過程”
構(gòu)建可以理解為“往定義好的數(shù)據(jù)結(jié)構(gòu)中添加計(jì)算數(shù)據(jù)的過程”
Segment
在增量構(gòu)建中,將 Cube 劃分為多個(gè) Segment,每個(gè) Segment 用起始時(shí)間和結(jié)束時(shí)間標(biāo)志。Segment 代表一段時(shí)間內(nèi)源數(shù)據(jù)的預(yù)計(jì)算結(jié)果。一個(gè) Segment 的起始時(shí)間等于它之前那個(gè) Segment 的結(jié)束時(shí)間(前閉后開),同理,它的結(jié)束時(shí)間等于它后面那個(gè) Segment 的起始時(shí)間。同一個(gè) Cube 下不同的 Segment 的結(jié)構(gòu)定義、構(gòu)建過程、優(yōu)化方法、存儲(chǔ)方式等完全相同。
前提
并非所有的 Cube 都適用于增量構(gòu)建,Cube 的定義必須包含一個(gè)時(shí)間維度,用來分割不同的 Segment,該維度稱為分割時(shí)間列。同一個(gè) Model 下不同 Cube 的分割時(shí)間列應(yīng)該是相同的,因此在 Kylin 中將分割時(shí)間列的定義放到了 Model 中。
Cube 的配置
Cube 每次增量構(gòu)建都會(huì)生成一個(gè) Segment,隨著時(shí)間的推移,當(dāng)前 Cube 會(huì)存在大量的 Segments,這時(shí)候會(huì)產(chǎn)生以下兩個(gè)問題:
- 執(zhí)行查詢時(shí)查詢引擎要聚合多個(gè) Segments 的結(jié)果才能返回正確的查詢結(jié)果,聚合的 Segments 越多,查詢的性能越差
- 每個(gè) Segments 都對(duì)應(yīng) Hbase 的一張表,過多的 Segments 會(huì)在底層的存儲(chǔ)系統(tǒng)產(chǎn)生大量的文件,會(huì)給存儲(chǔ)系統(tǒng) HDFS NameNode 帶來壓力
可以在Cube層面進(jìn)行以下設(shè)置來讓 Kylin 按照一定的規(guī)則自動(dòng)合并 Segments:
- Partition Start Date:指 Cube 默認(rèn)的第一個(gè) Segment 的起始時(shí)間。同一個(gè) Model 下不同的 Cube 可以指定不同的起始時(shí)間
- Auto Merge Thresholds:用于指定 Segment 自動(dòng)合并的閾值,將在后文詳述
- Retention Threshold:保留最近設(shè)置閾值的 cube segments 個(gè)數(shù),默認(rèn)是 0,它會(huì)保留所有歷史構(gòu)建的 segments
觸發(fā)增量構(gòu)建
在進(jìn)行增量構(gòu)建時(shí),將增量部分的起始時(shí)間和結(jié)束時(shí)間作為增量構(gòu)建的一部分提交給 Kylin 的任務(wù)引擎,任務(wù)引擎會(huì)根據(jù)起始時(shí)間和結(jié)束時(shí)間從 Hive 中抽取相應(yīng)時(shí)間的數(shù)據(jù),并對(duì)這部分?jǐn)?shù)據(jù)做預(yù)計(jì)算處理,然后將預(yù)計(jì)算的結(jié)果封裝為一個(gè)新的 Segment,并將相應(yīng)的信息保存到元數(shù)據(jù)和存儲(chǔ)引擎中。
當(dāng)我們?yōu)橐粋€(gè)已經(jīng)有 Segment 的 Cube 觸發(fā)增量構(gòu)建的時(shí)候,起始時(shí)間的值已經(jīng)被確定,不能被修改。如果 Cube 中不存在任何的 Segment,那么 Start Date 的值會(huì)被設(shè)置為 Partition Start Date(在 Model 中設(shè)定)。
僅當(dāng) Cube 中不存在任何 Segment,或者不存在任何未完成的構(gòu)建任務(wù)時(shí),Kylin 才接受 Cube 上新的構(gòu)建任務(wù)。未完成的構(gòu)建任務(wù)不僅包含正在運(yùn)行中的構(gòu)建任務(wù),還包括已經(jīng)出錯(cuò)并處于 ERROR 的任務(wù)。
Kylin 提供 Rest API 以幫助自動(dòng)化地觸發(fā)增量構(gòu)建:
Build cube(http://kylin.apache.org/cn/docs/howto/howto_use_restapi.html#build-cube)
管理Cube碎片(Segments)
Auto Merge Thresholds允許用戶設(shè)置幾個(gè)層級(jí)的時(shí)間閾值,層級(jí)約靠后,時(shí)間閾值就越大。舉例來說,[7days, 28days]這個(gè)層級(jí),每當(dāng) Cube 中有新的 Segment 生成時(shí),就會(huì)觸發(fā)一次自動(dòng)合并的嘗試:
- 首先查看是否能將連續(xù)的若干個(gè) Segments 合并成為一個(gè)超過 28 天的大 Segment。
在挑選連續(xù) Segments 的過程中:
- 如果遇到已經(jīng)有個(gè)別 Segment 的時(shí)間長(zhǎng)度已經(jīng)超過 28 天,那么系統(tǒng)會(huì)跳過該 Segment,從它之后的所有 Segment 中挑選連續(xù)的積累超過 28 天的 Segment
- 如果滿足條件的連續(xù) Segments 還不能夠積累超過 28 天,則系統(tǒng)會(huì)使用下一個(gè)層級(jí)的時(shí)間閾值重復(fù)尋找過程