Kylin 入門

yyK## 1 Kylin 概述

1.1 Kylin定義

Apache Kylin 是一個開源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查詢接口及多維分析(MOLAP)能力以支持超大規模數據,它能在亞秒內查詢巨大的 Hive 表。

1.2 術語解釋

Data Warehouse(數據倉庫):數據倉庫是一個各種數據(包括歷史數據和當前數據)的中心存儲系統,是BI( business intelligence ,商業智能)的核心部件

Business Intelligence(商業智能):商業智能通常被理解為將企業中現有的數據轉化為知識,幫助企業做出明智的業務經營決策的工具

OLAP(online analytical processing):OLAP(online analytical processing)是一種軟件技術,它使分析人員能夠迅速、一致、交互地從各個方面觀察信息,以達到深入理解數據的目的,從各方面觀察信息,也就是從不同的維度分析數據,因此 OLAP 也成為多維分析

![tps://upload-images.jianshu.io/upload_images/12941957-7d3cc5a6a099469f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

image
image

星型模型:

image

事實和維度:

image
image

1.3 架構

image

1、REST Server:是一套面向應用程序開發的入口點,旨在實現針對 Kylin 平臺的應用開發工作,此類應用程序可以提供查詢、獲取結果、觸發 Cube 構建任務、獲取元數據以及獲取用戶權限等等,另外可以通過 Restful 接口實現 SQL 查詢

2、查詢引擎(Query Engine):當 Cube 準備就緒后,查詢引擎就能夠獲取并解析用戶查詢,它隨后會與系統中的其它組件進行交互,從而向用戶返回對應的結果

3、路由器(Routing):在最初設計時曾考慮過將 Kylin 不能執行的查詢引導去 Hive 中繼續執行,但在實踐后發現 Hive與 Kylin 的速度差異過大,導致用戶無法對查詢的速度有一致的期望,很可能大多數查詢幾秒內就返回結果了,而有些查詢則要等幾分鐘到幾十分鐘,因此體驗非常糟糕,最后這個路由功能在發行版中默認關閉

4、元數據管理工具(Metadata):Kylin 是一款元數據驅動型應用程序,元數據管理工具是一大關鍵性組件,用于對保存在 Kylin 當中的所有元數據進行管理,其中包括最為重要的 Cube 元數據,其它全部組件的正常運作都需以元數據管理工具為基礎,Kylin 的元數據存儲在 HBase 中

5、任務引擎(Cube Build Engine):這套引擎的設計目的在于處理所有離線任務,其中包括 shell 腳本、Java API、MR 等,任務引擎對 Kylin 當中的全部任務加以管理與協調,從而確保每一項任務都能得到切實執行并解決其間出現的故障

1.4 特點

  • 標準 SQL 接口:Kylin 是以標準的 SQL 作為對外服務的接口

  • 支持超大數據集:Kylin 對于大數據的支撐能力可能是目前所有技術中最為領先的

  • 亞秒級響應:Kylin 擁有優異的查詢相應速度,這點得益于預計算,很多復雜的計算,比如連接、聚合,在離線的預計算過程中就已經完成,這大大降低了查詢時刻所需的計算量,提高了響應速度

  • 可伸縮性和高吞吐率:單節點 Kylin 可實現每秒 70 個查詢,還可以搭建 Kylin 的集群

  • BI 工具集成

    • ODBC:與 Tableau、Excel、PowerBI 等工具集成

    • JDBC:與 Saiku、BIRT 等 Java 工具集成

    • RestAPI:與 JavaScript、Web 網頁集成

    • Zepplin:訪問 Kylin 服務

2 安裝部署

1、先決條件是必須安裝 hadoop、hive、hbase、zookeeper

2、需要在 /etc/profile 文件中配置 HADOOP_HOME、HIVE_HOME、HBASE_HOME、并 source 使其生效

3、解壓 apache-kylin-2.5.1-bin-hbase1x.tar.gz到 /opt/module

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="bash" cid="n210" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> [djm@hadoop102 sorfware]$ tar -zxvf apache-kylin-2.5.1-bin-hbase1x.tar.gz -C /opt/module/</pre>

4、啟動和關閉

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="bash" cid="n212" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> [djm@hadoop102 kylin]bin/kylin.sh start [djm@hadoop102 kylin] bin/kylin.sh stop</pre>

5、測試

http://hadoop102:7070/kylin

username:ADMIN

password:KYLIN

3 快速入門

3.1 創建項目

image
image

3.2 創建 Model

image
image
image
image
image
image
image
image
image

3.3 創建 Cube

image
image
image
image
image
image

高階模塊(默認)

image
image
image

4 Cube 構建原理

4.1 構建流程

image
image
image
image
image
image

4.2 構建算法

4.2.1 逐層構建算法

image

一個 n 維的立方體由 2^(n-1) 個立方體組成,在逐層算法中,按維度逐層減少來計算,每個層級的計算都是基于其上一層的結果來計算的,當 0 層維度被計算出來的時候,整個 Cube 的計算就完成了

每一輪的計算都是一個 MapReduce 任務,且串行執行,n 維的 Cube,至少需要 n 次 MapReduce Job

算法優點:

  • 充分利用了 MapReduce 的優點,處理了中間復雜的排序和 shuffle 工作,代碼清晰簡單,易于維護

  • 受益于 Hadoop 的日趨成熟,此算法非常穩定,即便是集群資源緊張時,也能保證最終能夠完成

算法缺點:

  • 當 Cube 有比較多維度的時候,所需要的 MapReduce 任務也相應增加

  • 由于 Hadoop 的任務調度需要耗費額外資源,特別是集群較龐大的時候,反復遞交任務造成的額外開銷會相當可觀

  • 由于 Mapper 邏輯中并未進行聚合操作,所以每輪 MR 的 shuffle 工作量都很大,導致效率低下

  • 對 HDFS 的讀寫操作較多,由于每一層計算的輸出會用做下一層計算的輸入,這些 KV 需要寫到 HDFS 上,當所有計算都完成后,Kylin 還需要額外的一輪任務將這些文件轉成 HBase 的 HFile 格式,以導入到 HBase 中

4.2.2 快速構建算法

image

也被稱作逐段(By Segment)或逐塊(By Split)算法,從 1.5.x 開始引入該算法,該算法的主要思想是,每個 Mapper 將其所分配到的數據塊,計算成一個完整的小 Cube 段(包含所有 Cuboid),每個 Mapper 將計算完的 Cube 段輸出給Reducer 做合并,生成大 Cube,也就是最終結果

image

與舊算法相比,快速算法主要有兩點不同:

  • Mapper 會利用內存做預聚合,算出所有組合,Mapper 輸出的每個Key 都是不同的,這樣會減少輸出到 Hadoop MapReduce 的數據量,Combiner 也不再需要

2)一輪 MapReduce 便會完成所有層次的計算,減少 Hadoop 任務的調配

5 Cube 構建優化

在沒有采取任何優化措施的情況下,Kylin 會對每一種維度的組合進行預計算,每種維度的組合的預計算結果被稱為Cuboid,假設有4個維度,我們最終會有 16 個 Cuboid 需要計算。

但在現實情況中,用戶的維度數量一般遠遠大于 4 個,假設用戶有 10 個維度,那么沒有經過任何優化的 Cube 就會存在1024 個 Cuboid,而如果用戶有 20 個維度,那么Cube 中總共會存在 1048576 個 Cuboid,雖然每個 Cuboid 的大小存在很大的差異,但是單單想到 Cuboid 的數量就足以讓人想象到這樣的 Cube 對構建引擎、存儲引擎來說壓力有多么巨大,因此,在構建維度數量較多的 Cube 時,尤其要注意 Cube 的優化。

5.1 衍生維度

衍生維度用于在有效維度內將維度表上的非主鍵維度排除掉,并使用維度表的主鍵(其實是事實表上相應的外鍵)來替代它們,Kylin 會在底層記錄維度表主鍵與維度表其他維度之間的映射關系,以便在查詢時能夠動態地將維度表的主鍵翻譯成這些非主鍵維度,并進行實時聚合。

雖然衍生維度具有非常大的吸引力,但是也不是說所有的維度表都適合衍生維度,如果從維度主建到某個維度的聚合工作量較大,不建議使用,時間換空間還是空間換時間,看業務需求權衡。

image

5.2 聚合組

5.2.1 強制維度

如果一個維度被定義為強制維度,那么整個分組中產生的 cubeid 必須包含該維度,每個分組中都可以有 0 個或多個強制維度。如果根據這個分組的業務邏輯,則相關的查詢一定會在過濾條件或分組條件中,因此可以在該分組中把該維度設置為強制維度。

image

5.2.2 層級維度

每個層級中包含兩個或多個維度,假設 D1、D2 被設置為層級維度,那么分組中的 cubeid 如果 D2 出現時,D1 必須也出現,但是 D1 可以單獨出現,一般適用于日期、地址,每個分組中可以有0個、1個或多個層級,不同的層級之間不應當有共享的維度。如果根據這個分組的業務邏輯,則多個維度直接存在層級關系,因此可以在該分組中把這些維度設置為層級維度。

image

5.2.3 聯合維度

每個聯合維度包含兩個或多個維度,如果某些列形成一個聯合,那么在該分組產生的任何 Cuboid 中,這些聯合維度要么一起出現,要么都不出現,每個分組中可以有 0 個或多個聯合,但是不同的聯合之間不應當有共享的維度(否則它們可以合并成一個聯合),如果根據這個分組的業務邏輯,多個維度在查詢中總是同時出現,則可以在該分組中把這些維度設置為聯合維度。

image

這些操作可以在 Cube Designer 的 Advanced Setting 中的 Aggregation Groups 區域完成

5.3 RowKey 優化

Kylin 會把所有的維度按照順序組合成一個完整的 RowKey,并且按照這個 RowKey 升序排列 Cuboid 中所有的行,設計良好的 RowKey 將更有效地完成數據的查詢過濾和定位,減少 IO 次數,提高查詢速度,維度在 RowKey 中的次序,對查詢性能有顯著的影響。

RowKey 的設計原則如下:

  • 被用作 where 過濾的維度放在前邊

  • 基數大的維度放在基數小的維度前邊

5.4 并發粒度優化

當 Segment 中某一個 Cuboid 的大小超出一定的閾值時,系統會將該 Cuboid 的數據分片到多個分區中,以實現 Cuboid數據讀取的并行化,從而優化 Cube 的查詢速度,具體的實現方式如下:

構建引擎根據 Segment 估計的大小,以及參數 kylin.hbase.region.cut 的設置決定 Segment 在存儲引擎中總共需要幾個分區來存儲,如果存儲引擎是 HBase,那么分區的數量就對應于 HBase 中的 Region 數量,kylin.hbase.region.cut 的默認值是 5.0,單位是 GB,也就是說對于一個大小估計是 50GB 的 Segment,構建引擎會給它分配 10 個分區,用戶還可以通過設置 kylin.hbase.region.count.min、kylin.hbase.region.count.max 來決定每個 Segment 最少或最多被劃分成多少個分區

由于每個 Cube 的并發粒度控制不盡相同,因此建議在 Cube Designer 的 Configuration Overwrites 中為每個 Cube 量身定制控制并發粒度的參數,假設將把當前 Cube 的 kylin.hbase.region.count.min 設置為 2,kylin.hbase.region.count.max設置為 100,這樣無論 Segment 的大小如何變化,它的分區數量最小都不會低于 2,最大都不會超過 100,相應地,HBase 為了存儲這個 Segment,也不會使用小于兩個或超過 100 個的分區,我們還調整了默認的kylin.hbase.region.cut,這樣 50GB 的 Segment 基本上會被分配到50個分區,相比默認設置,我們的 Cuboid可能最多會獲得 5 倍的并發量

6 集成 BI 工具

6.1 JDBC

導入依賴:

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="xml" cid="n312" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> <dependencies>
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies></pre>

編碼:

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n314" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> package com.djm;
?
import java.sql.*;
?
public class TestKylin {
?
public static void main(String[] args) throws Exception {
//Kylin_JDBC 驅動
String KYLIN_DRIVER = "org.apache.kylin.jdbc.Driver";
//Kylin_URL
String KYLIN_URL = "jdbc:kylin://hadoop102:7070/FirstProject";
//Kylin的用戶名
String KYLIN_USER = "ADMIN";
//Kylin的密碼
String KYLIN_PASSWD = "KYLIN";
//添加驅動信息
Class.forName(KYLIN_DRIVER);
//獲取連接
Connection connection = DriverManager.getConnection(KYLIN_URL, KYLIN_USER, KYLIN_PASSWD);
//預編譯SQL
PreparedStatement ps = connection.prepareStatement("SELECT sum(sal) FROM emp group by deptno");
//執行查詢
ResultSet resultSet = ps.executeQuery();
//遍歷打印
while (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
}
}</pre>

6.2 Zepplin

1、解壓 zeppelin-0.8.0-bin-all.tgz 到 /opt/module

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="bash" cid="n317" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> [djm@hadoop102 sorfware]$ tar -zxvf zeppelin-0.8.0-bin-all.tgz -C /opt/module/</pre>

2、修改文件夾名稱

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="bash" cid="n319" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> [djm@hadoop102 module]$ mv zeppelin-0.8.0-bin-all/ zeppelin</pre>

3、啟動

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="bash" cid="n321" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> [djm@hadoop102 zeppelin]$ bin/zeppelin-daemon.sh start</pre>

4、訪問

http://hadoop102:8080

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容