天天看點

apache-kylin 權威指南—讀書筆記1. 概述2.快速入門

1. 概述

kylin 是 OLAP 引擎,采用多元立方體預計算技術,可将大資料的 SQL 查詢速度提升到亞秒級别。

需求:

雖然像 spark,hive 等使用 MPP 大規模并行處理和列式存儲的方式,可以将 Hadoop 的 SQL查詢提高到了分鐘級别,

但是仍然不能滿足資料分析師的要求。在面對超大規模的資料集時,分析師不要講更多的精力花在等待查詢結果上,

而不是更加重要的建立領域模型上。

kylin 就是要打破查詢時間随着資料量成線性增長的規律,采用的思路就是 “預計算”

它會盡量的預先計算聚合結果,在查詢時刻盡量的使用預算的結果得出查詢結果,進而避免直接掃描可能無限增長的原始記錄。

預計算是 Kylin 在大規模并行處理和列式存儲外,提供給大資料分析的第 3 個關鍵技術。

工作原理

kylin 的工作原理本質上是多元立方體分析 MOLAP multidimensional online analytical processing cube.

在講解工作原理前,涉及到次元 dimension 和度量 measure 的概念。

次元就是觀察資料的角度。

度量就是被聚合的統計值,也是聚合運算的結果,一般是連續的值。

根據次元和度量可以得到下面做預計算的 Cube 理論

給定一個資料模型,可以對其上的所有次元進行組合。對于 N 個次元來說,組合的可能性就有 2^n 種。

對每種次元的組合,将度量做聚合運算,然後将運算的結果儲存為一個物化視圖,叫做 Cuboid。所有次元組合的 Cuboid 作為一個整體,就稱為 Cube。

kylin 的工作原理就是對資料模型做 Cube 預計算,并利用計算的結果加速查詢,具體工作過程如下

1)  指定資料模型,定義次元和度量

2)預計算 Cube,計算所有 Cuboid 并儲存為物化視圖

3)執行查詢時,讀取 Cuboid,運算産生查詢結果

kylin 的查詢過程不會掃描原始記錄,而是通過預計算預先完成表的關聯,聚合等複雜運算,并利用預計算的結果來執行查詢。

技術架構

kylin 分為線上查詢和離線建構兩個部分。

apache-kylin 權威指南—讀書筆記1. 概述2.快速入門

先看下離線建構的部分,資料源在左側,儲存着待分析的使用者資料。根據中繼資料的定義,下方建構引擎從資料源

抽取資料,并建構 Cube。資料以關系表的形式輸入,且必須符合星形模型 start schema。 MapReduce 是目前

主要的建構技術,建構後的 Cube 儲存在右側的存儲引擎中,一般選用 HBase 作為存儲。

完成了離線建構,使用者可以從上方查詢系統發送 SQL進行查詢分析。 Kylin 提供了各種 Rest API,JDBC/ODBC 接口。

無論哪個接口進入, SQL最終會來到 Rest 服務層,再轉交給查詢引擎進行處理。

主要特點

1. 标準 SQL接口,kylin 以标準 SQL 作為對外服務的主要接口

2. 支援超大資料集

3. 亞秒級響應

4. 可伸縮性和高吞吐率

5. BI 及可視化工具內建

2.快速入門

核心概念

資料倉庫 Data Warehouse 簡寫 dw

OLAP online analytical process 聯機分析處理,以多元度的方式分析資料,而且能夠彈性的提供上卷,下鑽,透視分析等操作

BI business intelligence :商務智能,指用現代資料倉庫技術,線上分析技術,資料挖掘和資料展現技術進行資料分析以實作商業價值。

次元和度量 在上一章已經介紹

事實表 fact table: 存儲有事實記錄的表,如系統日志,銷售記錄等;事實表的記錄在不斷的動态增長,是以其體積通常遠大于其他表。

次元表或維表,是與事實表相對應的一種表,是與事實表相對應的一種表,它儲存了次元的屬性值,可以跟事實表做關聯;

相當于将事實表上經常重複出現的屬性抽取,規範出來用一張表進行管理。常見的次元表有:日期表,地點表等。

使用次元表的好處

  • 縮小了事實表的大小
  • 便于次元的管理和維護
  • 可以為多個事實表重用,以減少重複工作

Cube,Cuboid 和 Cube Segment

Cube 也稱為 Data Cube 叫做資料立方體,是一種常用于資料分析與索引的技術,可以對原始資料建立多元度索引。

通過 Cube 對資料進行分析,可以大大加快資料的查詢效率。

Cuboid 在 kylin 中特指在某一種次元組合下所計算的資料。

Cube Segment 是指針對源資料中的某一個片段,計算出來的 Cube 資料。

在 hive 中準備資料

kylin 要分析的資料必須要先儲存為 Hive 表的形式,然後 kylin 才能從 Hive 中導入資料,建立 Cube。

星形模型 star schema

星形模型中有一張事實表,以及 0 個或多個次元表;事實表與次元表通過主鍵外鍵關聯,次元表之間沒有關聯,就像很多星星圍繞

在一個恒星周圍,是以取名為星形模型。

如果将星形模型中的某些次元的表再做規範,抽取成更細的次元表,然後讓次元表之間也進行關聯,那麼這種模型稱為雪花模型。

次元表的設計

kylin 對次元表的要求如下

1)  要有資料一緻性,主鍵必須是唯一的;kylin 會進行檢查,如果有兩行的主鍵值相同就會報錯

2)  次元表越小越好,因為 kylin 會将次元表加載到記憶體中供查詢,過大的表不适合做次元表,預設門檻值是 300M

3)    改變頻率低, kylin 會在每次建構中試圖重用次元表的快照,如果次元表經常改變的話,重用就會失效,但每次都需要将視圖進行物化

4)  次元表最好不要是 Hive 視圖

Hive 表分區

Hive 表支援多分區 partition。 簡單的說,一個分區就是一個檔案目錄,存儲了特定的資料檔案。當有新的資料生成的時候,

可以将資料加載到指定的分區,讀取資料的時候也可以指定分區。對于 SQL 查詢,如果查詢中指定了分區列的屬性條件,則

Hive 會智能的選擇特定分區(也就是目錄),進而避免全量資料的掃描,減少讀寫操作對叢集的壓力。

kylin 支援增量的 Cube 建構,通常會按照時間屬性增量的從 Hive 中抽取資料。 如果 Hive 表正好是按照時間屬性進行分區,

就可以在每次 Hive 建構的時候直接跳過不相幹日期的資料,節省 Cube 建構的時間。

這樣的列在 Kylin 裡也稱為分隔時間列 Partition Time Column, 通常也應該是 Hive 表的分區列。

次元的基數

次元的基數是指該次元在資料集中出現的不同值的個數。

如果基數超過 100 萬的次元通常稱為高基數次元 UHC ultra high cardinality 就需要引起設計者的注意。

計算基數有多種途徑,最簡單的方法就是讓 Hive 執行一個 count distinct 的SQL 查詢。

設計 Cube

導入 Hive 定義

這裡說的是将 Hive 表的定義導入到 Kylin 中。

單擊 Web 界面的 Model -> Datasource 下的 Load Hive Table 圖示,輸入表的名稱,單擊 sync,

kylin 就會使用 Hive 的API 從 Hive 中擷取表的屬性資訊。

導入成功後, Kylin 就會在背景觸發一個 MapReduce 任務,計算此表每個列的基數。

建立資料模型

資料模型是 Cube 的基礎,主要用于描述一個星形模型,有了資料模型後,定義 Cube 的時候就可以直接從此模型定義的表和列中進行選擇了,

省去了重複指定 join 的步驟。基于一個資料模型還可以建立多個 Cube,以友善減少使用者的重複性工作。

點選 Models 頁面,單擊 New -> New Model,開始建立資料模型。給模型輸入名稱後,選擇一個事實表(必須的),然後添加次元表

(可選的)。

apache-kylin 權威指南—讀書筆記1. 概述2.快速入門

接下來選擇會用作次元和度量的列。此處隻是選擇一個範圍,不代表這些列将來一定要用作 Cube 的次元或者度量,

後續建立 cube時,将隻能從這些列進行選擇。

選擇次元列時,次元可以來自事實表或者次元表。

選擇度量列時,度量隻能來自事實表。

最後一步,是為模型補充分隔時間列資訊和過濾條件。如果此模型中的事實表記錄是按照時間增長的,那麼可以指定一個日期/時間

作為模型的分隔時間列,進而可以讓 Cube 按照此列做增量建構。

Filter 過濾條件是指,如果想把一些記錄忽略掉,就可以設定一個過濾條件。 kylin 在想 Hive 請求源資料時,會帶上此過濾條件。

最後,單擊 Save 儲存此資料模型,随後,它将出現在 Models 的清單中。

建立 Cube

點選 New 選擇 New Cube 就會開啟建立 Cube 的向導。

第一頁,選擇要使用的資料模型,并為此 Cube 輸入一個唯一的名稱(必需的)和描述(可選的)

      這裡還可以輸入一個郵件通知清單,用于在建構完成或出錯時收到通知。 Notification Events 中将其去掉。

第二頁, 選擇 Cube 的次元

第三頁, 建立度量。Kylin 預設會建立一個 Count(1) 的度量,可以單擊 "+Measure" 按鈕來添加新的度量

第四頁,是關于 Cube 資料重新整理的設定。在這裡可以設定自動合并的門檻值,資料保留的最短時間

第五頁,進階設定,此頁面可以設定聚合組和 RowKey

              kylin 預設會把所有次元都放在一個聚合組中,如果次元較多,可以将次元分為多個聚合組。通過使用聚合組,

             可以大大降低 Cube 中的 Cuboid 數量。

             Mandatory 次元是指那些總是會出現在 where 條件或者 Group By 語句裡的次元;

              通過将某個次元指定為 Mandatory, Kylin 就可以不用預計算那些不包含此次元的 Cuboid,進而減少計算量。

              Hierachy 是一組有層次關系的次元,通過指定 Hierarchy Kylin 就可以省略不滿足此模式的 Cuboid

             Joint Dimensions 是将多個次元組合成一個次元,通常适用于如下兩種情形

             - 總是在一起查詢的次元

             -  基數很低的次元

            kylin 會以 key-value 的方式将 Cube 存儲到 Hbase 中。 Hbase 的 key,就是 Rowkey, 是由各個次元的值拼接

           而成的。在存儲時, kylin 會對他們進行編碼和壓縮,每個次元可以選擇合适的編碼(Encoding) 方式,預設采用

           字典 dictionary 編碼技術,除了字典外,還有整數 Int 和固定長度 Fixed Length 的編碼。

            編碼的選取規則在另一篇文章中說明。

第六頁,為 Cube 配置參數。

             Kylin 使用了很多配置參數以提高靈活性,使用者根據具體的環境,場景等配置不同的參數進行調優。

             Kylin 全局的參數可在 conf/kylin.properties 檔案中進行配置,如果 Cube 要覆寫全局配置,則需要在此頁面指定。

建構 Cube

新建立的 Cube 隻有定義,沒有計算的資料,其狀态是 Disabled。要想 Cube 有資料,還需要對其進行建構。

Cube 的建構通常有兩種:全量建構和增量建構。包含下面步驟

1. 建立臨時的 Hive 平表

2. 計算各次元的不同值,并收集 Cuboid 的統計資料

3. 建立并儲存字典

4. 儲存 Cuboid 統計資訊

5. 建立 HTable

6. 計算 Cube

7. 将 Cube 的計算結果轉成 HFile

8. 加載 HFile 到 HBase

9. 更新 Cube 中繼資料

10.  垃圾回收

第 9 步完成後,會将此次建構的 Segment 的狀态從 New 更新為 READY,表示已經可供查詢了。

全量建構和增量建構

全量建構

對資料模型中沒有指定分割時間列資訊的 Cube, Kylin 會采用全量建構,即每次從 Hive 中讀取全部的資料來開始建構。

通常适用于下面兩種情況:

1. 事實表的資料不是按照時間增長的

2. 事實表的資料比較小或者更新頻率很低,全量建構不會造成太大的開銷

增量建構

增量建構的時候,kylin 每次都會從 Hive 中讀取一個時間範圍内的資料,然後進行計算,并以一個 Segment 的形式儲存。

下次再建構時,會自動以上次結束的時間為起點時間,再選擇新的終止時間進行建構。經過多次建構, Cube 中将會有

多個 Segment 依次按照時間進行排列。

使用增量建構的好處是,每次隻需要對新增資料進行計算,進而避免了對曆史資料進行重複計算。對資料量很大的 Cube,

使用增量構架非常有必要。

合并

Cube 可能會存在較多數量的 Segment, 使查詢性能下降,并且會給 HBase 叢集管理帶來壓力。對此,需要适時的将一些

Segment 進行合并,将若幹個 Segment 合并成較大的 Segment。

查詢 Cube

Cube 建構好後,狀态變為 READY,就可以進行查詢了。

Kylin 的查詢語言是标準的 SQL 的 SELECT 語言,這是為了獲得與大多數 BI 系統和工具無縫內建的可能性。

SQL 參考如下

1. Kylin 作為 OLAP 引擎,隻支援查詢,而不支援其他操作,如 update, insert 等,也就是說所有的 SQL 都必須是

    SELECT 語句,否則 kylin 會報錯

2. 查詢 Kylin 中 SQL 語句的表名,列名,度量,連接配接關系時,需要至少跟一個 Cube 的模型比對

3.  Kylin 使用 Apache Calcite 做 SQL 文法分析,它是一個開源的 SQL 引擎,提供了标準的 SQL 解析,多查詢優化

     和連接配接各種資料源的能力

轉載于:https://www.cnblogs.com/reycg-blog/p/9076122.html

繼續閱讀