1. 程式人生 > >kylin 官方案例learn_kylin手動建立測試

kylin 官方案例learn_kylin手動建立測試

在上一篇文章中介紹了kylin相關的基本知識,這篇文章的主要目的是針對kylin初學者,進行一次詳細的kylin案例介紹,這裡,我們還是以官方給定的資料為例。說明,我用的是kylin2.1.0. 與kylin1.x 可能有不一樣的地方。

核心概念

  1. 事實表和維度表

    • 事實表(Fact Table)是指儲存有事實記錄的表,如系統日誌、銷售記錄等;事實表的記錄在不斷地動態增長,所以它的體積通常遠大於其他表。
    • 維度表(Dimension Table)或維表,有時也稱查詢表(Lookup Table),是與事實表相對應的一種表;它儲存了維度的屬性值,可以跟事實表做關聯;相當於將事實表上經常重複出現的屬性抽取、規範出來用一張表進行管理。常見的維度表有:日期表(儲存與日期對應的周、月、季度等的屬性)、地點表(包含國家、省/州、城市等屬性)等
  2. Cube、Cuboid和Cube Segment

    • Cuboid在Kylin中特指在某一種維度組合下所計算的資料。
    • Cube(或Data Cube),即資料立方體,是一種常用於資料分析與索引的技術;它可以對原始資料建立多維度索引。簡單來說,一個Cube就是許多按維度聚合的物化檢視的集合。
    • Cube Segment是指標對源資料中的某一個片段,計算出來的Cube資料。通常資料倉庫中的資料數量會隨著時間的增長而增長,而CubeSegment也是按時間順序來構建的。注意的是,在增量構建中,相鄰兩個segment的時間是連續的。
  3. 星型模型

    • 資料探勘有幾種常見的多維資料模型,如星形模型(Star Schema)、雪花模型(Snowflake Schema)、事實星座模型(Fact Constellation)等。
    • 星形模型中有一張事實表,以及零個或多個維度表;事實表與維度表通過主鍵外來鍵相關聯,維度表之間沒有關聯,就像很多星星圍繞在一個恆星周圍,故取名為星形模型。
      特別注意:Kylin只支援星形模型的資料集
  4. 維度表的設計原則
    除了資料模型只支援星型模型外,kylin對維度表還有一定的要求。

    • 要具有資料一致性,主鍵值必須是唯一的;Kylin會進行檢查,如果有兩行的主鍵值相同則會報錯。
    • 維度表越小越好,因為Kylin會將維度表載入到記憶體中供查詢;過大的表不適合作為維度表,預設的閾值是300MB。
    • 改變頻率低,Kylin會在每次構建中試圖重用維度表的快照,如果維度表經常改變的話,重用就會失效,這就會導致要經常對維度表建立快照。
    • 維度表最好不要是Hive檢視(View),雖然在Kylin1.5.3中加入了對維度表是檢視這種情況的支援,但每次都需要將檢視進行物化,從而導致額外的時間開銷。

hive表中資料

執行$KYLIN_HOME/bin/sample.sh 就會在hive自動建立五張表。當然你可以用vim開啟sample.sh看看這個指令碼檔案到底是怎麼樣執行的。

我們看到,它呼叫了sample_cube下的create_sample_tables.sql建立表以及載入資料,所有與官方例子有關的資料都在samp_cube資料夾下

匯入後,可以在hive檢視具體資訊。紅線框住的部分,這5張表構成一個星型模型,kylin_sales是事實表,其他的作為維度表。

匯入表

開啟kylin主介面,新建一個專案test_kylin

選擇專案test_kylin, 點選Data Source標籤,第一個圖示load hive table 需手動輸入hive表名(帶資料庫名),中間圖示load hive table from tree可直接選擇表,最後一個圖示為流式資料,暫時不管。

選擇對應的5張表。

匯入成功後,可以看到以下表資訊

建立資料模型

不廢話,直接新型操作

輸入模型名稱,注意模型名在整個kylin應用下具有唯一性,而不是隻在單個專案下的唯一性。

直接下一步,選擇維度表和事實表。事實表是唯一的,這裡我們選擇kylin_sales. 單擊 Add Lookup Table,選擇維度表。

依次新增4個維度表。新增維度表的時候,需要選擇連線的型別:是Inner還是Left,然後選擇連線的主鍵和外來鍵,這裡也支援多主鍵。

所有維度表新增完成後如下:

接下來選擇維度和度量列,度量只能在事實表中選擇,維度表在事實表和維度表中選擇,一個列只能是維度或度量中的一個。這裡只是選擇一個範圍,不代表這些列將來一定要用作Cube的維度或度量,你可以把所有可能會用到的列都選進來,後續建立Cube的時候,將只能從這些列中進行選擇。

最後一步,是為模型補充分割時間列資訊和過濾條件。如果此模型中的事實表記錄是按時間增長的,那麼可以指定一個日期/時間列作為模型的分割時間列,從而可以讓Cube按此列做增量構建,如果是想做全域性構建,這一步就不用填,我們選擇增量構建。

過濾(Filter)條件是指,如果想把一些記錄忽略掉,那麼這裡可以設定一個過濾條件。Kylin在向Hive請求源資料的時候,會帶上此過濾條件。比如要過濾掉價格小於0的列,只需要在filter中帶上條件 price > 0.

最後,單擊save,即可完成對資料模型的建立。

建立cube

model建立好以後,我們就可以根據它建立cube了。單擊new,選擇new cube。選擇model,輸入cube name,同理,cube name也是全域性唯一的。這裡還可以輸入一個郵件通知列表,用於在構建完成或出錯時收到通知。如果不想接收處於某些狀態的通知,那麼可以從“Notification Events”中將其去掉。

接下來,新增維度。這裡和kylin1.5版本有一點不一樣,在kylin2.1中,直接單擊 Add Dimensions ,根據各個表,選擇維度以及設定維度表中維度為normal 或者derived(衍生維度)。

新增完成後如下

如果是衍生維度的話,則必須是來自於某個維度表,由於這些列值都可以從該維度表的主鍵值中衍生出來,所以實際上只有主鍵列會被Cube加入計算。而在Kylin的具體實現中,往往採用事實表上的外來鍵替代主鍵進行計算和儲存。但是在邏輯上可以認為衍生列來自於維度表的主鍵。

接下來,新增度量。_COUNT_ 是預設的聚合函式。可以單擊“+Measure”按鈕來新增新的度量。Kylin支援的度量有:SUM、MIN、MAX、COUNT、COUNT DISTINCT、TOP_N、RAW等。請選擇需要的度量
型別,然後再選擇適當的引數(通常為列名)

如果param Type選擇column的話,下拉列表裡面只能是度量資訊。Return Type也是根據hive表中欄位的型別在自動生成的,當然,這裡也有一些kylin自己封裝的型別,比如hllc(10)等。
需要注意的是,在kylin2.1版本中已經支援normal維度的聚合。


所有度量聚合新增完成後:

是關於Cube資料重新整理的設定。在這裡可以設定自動合併的閾值、資料保留的最短時間,以及第一個Segment的起點時間(如果Cube有分割時間列的話)

  • “Partition Start Date”是指Cube預設的第一個Segment的起始時間。同一個Model下不同的Cube可以指定不同的起始時間
  • “Auto Merge Thresholds”用於指定Segment自動合併的閾值
  • “Retention Threshold”則用於指定將過期的Segment自動拋棄

接下來是進行高階設定,維度的優化基本上通過這個這設定,在此頁面上可以設定聚合組和Rowkey。

Kylin預設會把所有維度都放在同一個聚合組中;如果維度數較多(例如>10),那麼建議使用者根據查詢的習慣和模式,單擊“New AggregationGroup+”,將維度分為多個聚合組。通過使用多個聚合組,可以大大降低Cube中的Cuboid數量。下面來舉例說明,如果一個Cube有(M+N)個維度,那麼預設它會有2m+n 個Cuboid;如果把這些維度分為兩個不相交的聚合組,那麼Cuboid的數量將被減少為2m +2n 。

在單個聚合組中,可以對維度設定高階屬性,如Mandatory、Hierarchy、Joint等

  • Mandatory維度指的是那些總是會出現在Where條件或Group By語句裡的維度;通過將某個維度指定為Mandatory,Kylin就可以不用預計算那些不包含此維度的Cuboid,從而減少計算量。
  • Hierarchy是一組有層級關係的維度,例如“國家”“省”“市”,這裡的“國家”是高級別的維度,“省”“市”依次是低級別的維度。使用者會按高級別維度進行查詢,也會按低級別維度進行查詢,但在查詢低級別維度時,往往都會帶上高級別維度的條件,而不會孤立地審視低級別維度的資料。例如,使用者會單擊“國家”作為維度來查詢彙總資料,也可能單擊“國家”+“省”,或者“國家”+“省”+“市”來查詢,但是不會跨越國家直接Group By“省”或“市”。通過指定Hierarchy,Kylin可以省略不滿足此模式的Cuboid。
  • Joint是將多個維度組合成一個維度

Kylin以Key-Value的方式將Cube儲存到HBase中。HBase的key,也就是Rowkey,是由各維度的值拼接而成的;為了更高效地儲存這些值,Kylin會對它們進行編碼和壓縮;每個維度均可以選擇合適的編(Encoding)方式,預設採用的是字典(Dictionary)編碼技術;除了字典以外,還有整數(Int)和固定長度(Fixed Length)的編碼。

在kylin1.5(記得清楚了,好像是1.5)之後,引入了spark引擎,所以現在可以選擇mapreduce和spark構建引擎,Advance ColumnFamily裡面對應hbase裡面的資訊,CF 相當於hbase的列簇,而measure就是其中的列。

下一步,為Cube配置引數。和其他Hadoop工具一樣,Kylin使用了很多配置引數以提高靈活性,使用者可以根據具體的環境、場景等配置不同的引數進行調優。Kylin全域性的引數值可在conf/kylin.properties檔案中進行配置;如果Cube需要覆蓋全域性設定的話,則需要在此頁面中指定。單擊“+Property”按鈕,然後輸入引數名和引數值。我們這裡直接保持預設就好。

直接寫一步,完成。

構建cube

cube的模型建立好以後,我們還需要對其進行構建。

設定segment的結束日期

提交成功。等待cube的完成。

搞定,下面就可以進行sql查詢操作了。