天天看點

Apache Kylin權威指南3.2 設計增量Cube

<b>3.2 設計增量cube</b>

<b></b>

3.2.1 設計增量cube的前提

并非所有的cube都适用于增量建構,cube的定義必須包含一個時間次元,用來分割不同的segment,我們将這樣的次元稱為分割時間列(partition date column)。盡管由于曆史原因該命名中存在“date”的字樣,但是分割時間列既可以是hive中的date類型、也可以是timestamp類型或string類型。無論是哪種類型,kylin都要求使用者顯式地指定分割時間列的資料格式,例如精确到年月日的date類型(或者string類型)的資料格式可能是yyyymmdd或yyyy-mm-dd,如果是精确到時分秒的timestamp類型(或者string類型),那麼資料格式可能是yyyy-mm-dd hh:mm:ss。

在一些場景中,時間由長整數unix time來表示,由于對該類型的支援存在争議(詳情可參見https://issues.apache.org/jira/browse/kylin-1698),是以在目前的版本中并不支援使用長整數類型作為分割時間列。作為一種變通的方法,可以在etl過程中克服這個問題。具體來說,就是在hive中為包含長整數時間列的表建立一個視圖,将長整數時間列轉化為符合kylin規範的任意類型,在後續的cube設計中,應使用該視圖而不是原始的表。

滿足了設計增量cube的前提之後,在進行增量建構時,将增量部分的起始時間和結束時間作為增量建構請求的一部分送出給kylin的任務引擎,任務引擎會根據起始時間和結束時間從hive中抽取相應時間的資料,并對這部分資料做預計算處理,然後将預計算的結果封裝成為一個新的segment,并将相應的資訊儲存到中繼資料和存儲引擎中。一般來說,增量部分的起始時間等于cube中最後一個segment的結束時間。

3.2.2 增量cube的建立

建立增量cube的過程和建立普通cube的過程基本類似,隻是增量cube會有一些額外的配置要求。

1.?model層面的設定

每個cube背後都關聯着一個model,cube之于model就好像java中的object之于class。如同3.2.1節中所描述的,增量建構的cube需要指定分割時間列。同一個model下不同分割時間列的定義應該是相同的,是以我們将分割時間列的定義放到了model之中。model的建立和修改在第2章中已經介紹過,這裡将跳過重複的部分,直接進入model designer的最後一步settings來添加分割時間列,如圖3-1所示。

圖3-1 定義分割時間列

目前分割時間列必須是事實表上的列,且它的格式必須滿足3.2.1節中所描述的要求。一般來說如果年月日已經足夠幫助分割不同的segment,那麼在大部分情況下日期列是分割時間列的首選。當使用者需要更細的分割粒度時,例如使用者需要每6小時增量建構一個新的segment,那麼對于這種情況,則需要挑選包含年月日時分秒的列作為分割時間列。

在一些使用者場景中,年月日和時分秒并不展現在同一個列上,例如在使用者的事實表上有兩個列,分别是“日期”和“時間”,分别儲存記錄發生的日期(年月日)和時間(時分秒),對于這樣的場景,允許使用者指定一個額外的分割時間列來指定除了年月日之外的時分秒資訊。為了區分,我們将之前的分割時間列稱為正常分割時間列,将這個額外的列稱為補充分割時間列。在勾選了“has a separate "time of the day" column?”選項之後(如圖3-2所示),使用者可以選擇一個符合時分秒時間格式的列作為補充的分割時間列。由于日期的資訊已經展現在了正常的分割時間列之上,是以補充的分割時間列中不應該再具有日期的資訊。反過來說,如果這個列中既包含年月日資訊,又包含時分秒資訊,那麼使用者應該将它指定為格式是yyyy-mm-dd hh:mm:ss的正常分割時間列,而不需要勾選“has a separate "time of the day"column?”。在大部分場景下使用者可以跳過補充分割時間列。

2.?cube層面的設定

cube的建立和修改在第2章中已經做過介紹,這裡将跳過重複的部分,直接進入cube designer的“refresh settings”。這裡的設定目前包含“auto merge thresholds”、“retention threshold”和“partition start date”。“partition start date”是指cube預設的第一個segment的起始時間。同一個model下不同的cube可以指定不同的起始時間,是以該設定項出現在cube designer之中。“auto merge thresholds”用于指定segment自動合并的門檻值,而“retention threshold”則用于指定将過期的segment自動抛棄。3.4節将詳細介紹這兩個功能。