Kyin學習筆記(一)-----Kylin安裝、入門案例和原理介紹

目錄

一、Kylin簡介

1、Kylin的誕生背景

2、Kylin的應用場景

3、爲什麼要使用Kylin

4、Kylin的總體架構

二、Kylin安裝

1、依賴環境

2、集羣規劃

3、安裝kylin-2.6.3-bin-hbase1x

4、集羣模式部署(官網)

三、入門案例

1、測試數據表結構介紹

2、操作步驟

3、按照日期統計訂單總額/總數量(Hive方式)

4、按照日期統計訂單總額/總數量(Kylin方式)

1、創建項目(Project) (HMaster  不用 會掛,Hive 掛掉也 創建不了)

2、創建數據源(DataSource)

3、創建模型(Model)

4. 創建立方體(Cube)

 5、按照訂單渠道名稱統計訂單總額/總數量

Hive中的語句:

 Kylin開發步驟

5、按照日期、區域、產品維度統計訂單總額/總數量

Kylin開發步驟

四、Kylin的工作原理

1、維度和度量

2、Cube和Cuboid

3、工作原理


一、Kylin簡介

       Apache Kylin™是一個開源的、分佈式的分析型數據倉庫,提供Hadoop/Spark 之上的 SQL 查詢接口及多維分析(OLAP)能力以支持超大規模數據,最初由 eBay 開發並貢獻至開源社區。它能在亞秒內查詢巨大的表。(官網:http://kylin.apache.org/cn/

1、Kylin的誕生背景

  • ebay-中國團隊研發的,是第一個真正由中國人自己主導、從零開始、自主研發、併成爲Apache頂級開源項目
  • Hive的性能比較慢,支持SQL靈活查詢,特別慢
  • HBase的性能快,原生不支持SQL
  • Kylin是將先將數據進行預處理,將預處理的結果放在HBase中。效率很高

2、Kylin的應用場景

Kylin 典型的應用場景如下

  • 用戶數據存在於Hadoop HDFS中,利用Hive將HDFS文件數據以關係數據方式存取,數據量巨大,在500G以上
  • 每天有數G甚至數十G的數據增量導入
  • 有10個以內較爲固定的分析維度  

Kylin 的核心思想是利用空間換時間(筆記本耗內存),在數據 ETL 導入 OLAP 引擎時提前計算各維度的聚合結果並持久化保存

麒麟官網http://kylin.apache.org/

3、爲什麼要使用Kylin

Kylin 是一個 Hadoop 生態圈下的 MOLAP (多維度聯機事務分析)系統,是 ebay 大數據部門從2014 年開始研發的支持 TB 到 PB 級別數據量的分佈式 Olap 分析引擎。

特點包括:

  • 可擴展的超快的 OLAP 引擎
  • 提供 ANSI-SQL 接口交互式查詢能力
  • MOLAP Cube 的概念
  • 與 BI 工具可無縫整合

 Kylin 的優勢(美團)

第一,性能非常穩定。因爲 Kylin 依賴的所有服務,比如 Hive、HBase 都是非常成熟的,Kylin 本身的邏輯並不複雜,所以穩定性有一個很好的保證。目前在我們的生產環境中,穩定性可以保證在 99.99% 以上。同時查詢時延也比較理想。我們現在有一個業務線需求,每天查詢量在兩萬次以上,95% 的時延低於 1 秒,99% 在 3 秒以內。基本上能滿足我們交互式分析的需求。

第二,對我們特別重要的一點,就是數據的精確性要求。其實現在能做到的只有 Kylin,所以說我們也沒有什麼太多其他的選擇。

第三,從易用性上來講,Kylin 也有非常多的特點。首先是外圍的服務,不管是 Hive 還是 HBase,只要大家用 Hadoop 系統的話基本都有了,不需要額外工作。在部署運維和使用成本上來講,都是比較低的。其次,有一個公共的 Web 頁面來做模型的配置。相比之下 Druid 現在還是基於配置文件來做。這裏就有一個問題,配置文件一般都是平臺方或者管理員來管理的,沒辦法把這個配置系統開放出去,這樣在溝通成本和響應效率上都不夠理想。Kylin 有一個通用的 Web Server 開放出來,所有用戶都可以去測試和定義,只有上線的時候需要管理員再 review 一下,這樣體驗就會好很多。

4、Kylin的總體架構

Kylin 依賴於 Hadoop、Hive、Zookeeper 和 Hbase

 


二、Kylin安裝

1、依賴環境

軟件 版本
Apache hbase-1.1.1-bin.tar.gz 1.1.1
apache-kylin-2.6.3-bin-hbase1x.tar.gz 2.6.3

2、集羣規劃

主機名 IP 守護進程
node01 192.168.100.10 NameNode<br/>DataNode<br/>RunJar(Hive metastore)<br/>RunJar(Hive hiveserver2)<br/>QuorumPeerMain<br/>HMaster<br/>HRegionServer<br/>kylin<br/>NodeManager
node2 192.168.100.11 SecondaryNameNode<br/>JobHistoryServer<br/>DataNode<br/>HRegionServer<br/>QuorumPeerMain<br/>ResourceManager<br/>HistoryServer<br/>NodeManager
node3 192.168.100.12 HRegionServer<br/>NodeManager<br/>DataNode<br/>QuorumPeerMain

注意:

  • kylin-2.6.3-bin-hbase1x所依賴的hbase必須是Apache爲1.1.1版本
  • 要求hbase的 hbase.zookeeper.quorum() 值必須只能是host1,host2,...。不允許出現host:2181,...

3、安裝kylin-2.6.3-bin-hbase1x

## 解壓apache-kylin-2.6.3-bin-hbase1x.tar.gz
tar -zxf /export/softwares/apache-kylin-2.6.3-bin-hbase1x.tar.gz -C /export/servers/

1. 增加 kylin 依賴組件的配置

cd /export/servers/apache-kylin-2.6.3-bin-hbase1x/conf
​
# 添加下列軟鏈接
ln -s $HADOOP_HOME/etc/hadoop/hdfs-site.xml hdfs-site.xml
ln -s $HADOOP_HOME/etc/hadoop/core-site.xml core-site.xml
ln -s $HBASE_HOME/conf/hbase-site.xml hbase-site.xml
ln -s $HIVE_HOME/conf/hive-site.xml hive-site.xml
ln -s $SPARK_HOME/conf/spark-defaults.conf spark-defaults.conf

2. 配置kylin.sh

cd /export/servers/apache-kylin-2.6.3-bin-hbase1x/bin
​
vim kylin.sh
kylin.sh文件添加如下內容:

export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0
export HBASE_HOME=/export/servers/hbase-1.1.1
export SPARK_HOME=/export/servers/spark-2.2.0-bin-hadoop2.6

3. 配置 conf/kylin.properties

修改 配置文件kylin.properties 中HDFS的路徑,然後上傳到 Linux的 Kylin/conf文件夾中


#### METADATA | ENV ###
#
## The metadata store in hbase
#kylin.metadata.url=kylin_metadata@hbase
#
## metadata cache sync retry times
#kylin.metadata.sync-retries=3
#
## Working folder in HDFS, better be qualified absolute path, make sure user has the right permission to this directory
kylin.env.hdfs-working-dir=/apps/kylin
#
## DEV|QA|PROD. DEV will turn on some dev features, QA and PROD has no difference in terms of functions.
#kylin.env=QA
#
## kylin zk base path
kylin.env.zookeeper-base-path=/kylin

kylin.source.hive.keep-flat-table=false
#
## Hive database name for putting the intermediate flat tables
kylin.source.hive.database-for-flat-table=default
#
## Whether redistribute the intermediate flat table before building
kylin.source.hive.redistribute-flat-table=true
#
#
#### STORAGE ###
#
## The storage for final cube file in hbase
kylin.storage.url=hbase
#
## The prefix of hbase table
kylin.storage.hbase.table-name-prefix=KYLIN_
#
## The namespace for hbase storage
kylin.storage.hbase.namespace=default
#
## Compression codec for htable, valid value [none, snappy, lzo, gzip, lz4]
kylin.storage.hbase.compression-codec=none
#

#
#### SPARK ENGINE CONFIGS ###
#
## Hadoop conf folder, will export this as "HADOOP_CONF_DIR" to run spark-submit
## This must contain site xmls of core, yarn, hive, and hbase in one folder
kylin.env.hadoop-conf-dir=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
#
## Estimate the RDD partition numbers
kylin.engine.spark.rdd-partition-cut-mb=10
#
## Minimal partition numbers of rdd
kylin.engine.spark.min-partition=1
#
## Max partition numbers of rdd
kylin.engine.spark.max-partition=1000
#
## Spark conf (default is in spark/conf/spark-defaults.conf)
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
kylin.engine.spark-conf.spark.yarn.queue=default
kylin.engine.spark-conf.spark.driver.memory=512M
kylin.engine.spark-conf.spark.executor.memory=1G
kylin.engine.spark-conf.spark.executor.instances=2
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=512
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.eventLog.dir=hdfs://node1:8020/apps/spark2/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs://node1:8020/apps/spark2/spark-history
kylin.engine.spark-conf.spark.hadoop.yarn.timeline-service.enabled=false
#
#### Spark conf for specific job
kylin.engine.spark-conf-mergedict.spark.executor.memory=1G
kylin.engine.spark-conf-mergedict.spark.memory.fraction=0.2
#
## manually upload spark-assembly jar to HDFS and then set this property will avoid repeatedly uploading jar at runtime
kylin.engine.spark-conf.spark.yarn.archive=hdfs://node1:8020/apps/spark2/lib/spark-libs.jar
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec

4. 初始化kylin在hdfs上的數據路徑

hdfs dfs -mkdir hdfs://node01:8020/apps/kylin

5. 啓動集羣

1、啓動zookeeper

2、啓動HDFS

3、啓動YARN集羣

4、啓動HBase集羣

start-hbase.sh
5、啓動 metastore

nohup hive --service metastore &
6、啓動 hiverserver2

nohup hive --service hiveserver2 &
7、啓動Yarn history server

mr-jobhistory-daemon.sh start historyserver
8、啓動spark history server【可選】

sbin/start-history-server.sh 
9、啓動kylin

./kylin.sh start

登錄Kylin

http://node01:7070/kylin

url http://IP:7070/kylin
默認用戶名 ADMIN
默認密碼 KYLIN

用戶名和密碼都必須是大寫

4、集羣模式部署(官網)

Kylin 實例是無狀態的服務,運行時的狀態信息存儲在 HBase metastore 中。 出於負載均衡的考慮,您可以啓用多個共享一個 metastore 的 Kylin 實例,使得各個節點分擔查詢壓力且互爲備份,從而提高服務的可用性。下圖描繪了 Kylin 集羣模式部署的一個典型場景:

Kylin 集羣模式部署

如果您需要將多個 Kylin 節點組成集羣,請確保他們使用同一個 Hadoop 集羣、HBase 集羣。然後在每個節點的配置文件 $KYLIN_HOME/conf/kylin.properties 中執行下述操作:

  1. 配置相同的 kylin.metadata.url 值,即配置所有的 Kylin 節點使用同一個 HBase metastore。
  2. 配置 Kylin 節點列表 kylin.server.cluster-servers,包括所有節點(包括當前節點),當事件變化時,接收變化的節點需要通知其他所有節點(包括當前節點)。
  3. 配置 Kylin 節點的運行模式 kylin.server.mode,參數值可選 alljobquery 中的一個,默認值爲 all
    job 模式代表該服務僅用於任務調度,不用於查詢;query 模式代表該服務僅用於查詢,不用於構建任務的調度;all 模式代表該服務同時用於任務調度和 SQL 查詢。

注意:默認情況下只有一個實例用於構建任務的調度 (即 kylin.server.mode 設置爲 all 或者 job 模式)。

任務引擎高可用

從 v2.0 開始, Kylin 支持多個任務引擎一起運行,相比於默認單任務引擎的配置,多引擎可以保證任務構建的高可用。

使用多任務引擎,你可以在多個 Kylin 節點上配置它的角色爲 job 或 all。爲了避免它們之間產生競爭,需要啓用分佈式任務鎖,請在 kylin.properties 裏配置:

kylin.job.scheduler.default=2
kylin.job.lock=org.apache.kylin.storage.hbase.util.ZookeeperJobLock

並記得將所有任務和查詢節點的地址註冊到 kylin.server.cluster-servers

安裝負載均衡器

爲了將查詢請求發送給集羣而非單個節點,您可以部署一個負載均衡器,如 Nginx, F5 或 cloudlb 等,使得客戶端和負載均衡器通信代替和特定的 Kylin 實例通信。

讀寫分離部署

爲了達到更好的穩定性和最佳的性能,建議進行讀寫分離部署,將 Kylin 部署在兩個集羣上,如下:

  • 一個 Hadoop 集羣用作 Cube 構建,這個集羣可以是一個大的、與其它應用共享的集羣;
  • 一個 HBase 集羣用作 SQL 查詢,通常這個集羣是專門爲 Kylin 配置的,節點數不用像 Hadoop 集羣那麼多,HBase 的配置可以針對 Kylin Cube 只讀的特性而進行優化。

這種部署策略是適合生產環境的最佳部署方案,關於如何進行讀寫分離部署,請參考 Deploy Apache Kylin with Standalone HBase Cluster

 


三、入門案例

1、測試數據表結構介紹

(事實表)dw_sales

列名 列類型 說明
id string 訂單id
date1 string 訂單日期
channelid string 訂單渠道(商場、京東、天貓)
productid string 產品id
regionid string 區域名稱
amount int 商品下單數量
price double 商品金額

(維度表_渠道方式)dim_channel

列名 列類型 說明
channelid string 渠道id
channelname string 渠道名稱

(維度表_產品名稱)dim_product

列名 列類型 說明
productid string 產品id
productname string 產品名稱

(維度表_區域)dim_region

列名 類類型 說明
regionid string 區域id
regionname string 區域名稱

導入測試數據

爲了方便後續學習Kylin的使用,需要準備一些測試表、測試數據。

  • Hive中創建庫
  • Hive中創建表
  • 將數據從本地文件導入到Hive

2、操作步驟

1、使用 beeline 連接Hive

!connect jdbc:hive2://node01:10000

2、創建  kylin_dw  數據庫

create database kylin_dw;
use kylin_dw;

3、執行sql、創建測試表

​
-- 1、銷售表:dw_sales
-- id   唯一標識
-- date1 日期
-- channelId 渠道 ID
-- productId 產品 ID
-- regionId 區域 ID
-- amount 數量
-- price 金額
create table dw_sales(
    id string,
    date1 string,
    channelId string, 
    productId string, 
    regionId string,
    amount int,
    price double)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
​
-- 2、渠道表:dim_channel
-- channelId 渠道ID
-- channelName 渠道名稱
create table dim_channel(
    channelId string, 
    channelName string )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
​
-- 3、產品表:dim_product
create table dim_product(
    productId string, 
    productName string )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
​
--4、區域表:dim_region
create table dim_region(
    regionId string,
    regionName string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
​
-- 查看錶是否創建成功
show tables;

4、將測試數據文件上傳到Linux, 導入數據到表中

-- 導入數據
LOAD DATA LOCAL INPATH '/export/datas/kylin_demos/dw_sales_data.txt' OVERWRITE  INTO TABLE dw_sales;
LOAD DATA LOCAL INPATH '/export/datas/kylin_demos/dim_channel_data.txt' OVERWRITE  INTO TABLE dim_channel;
LOAD DATA LOCAL INPATH '/export/datas/kylin_demos/dim_product_data.txt' OVERWRITE  INTO TABLE dim_product;
LOAD DATA LOCAL INPATH '/export/datas/kylin_demos/dim_region_data.txt' OVERWRITE  INTO TABLE dim_region;
​
# dim_channel_data.txt
01,商場
02,京東
03,天貓

# dim_product_data.txt
01,meta20
02,p30
03,ihpone Xs
04,小米 9

# dim_region_data.txt
010,北京
021,上海

# dw_sales_data.txt
0001,2019-02-01,01,01,010,1,3400.00
0002,2019-02-01,02,02,021,2,6800.00
0003,2019-02-01,01,01,010,1,3400.00
0004,2019-02-01,01,02,021,1,3400.00
0005,2019-02-01,02,01,010,1,3400.00
0006,2019-02-01,01,01,021,2,6800.00
0007,2019-02-01,03,02,010,1,3400.00
0008,2019-02-01,01,01,021,1,3400.00
0009,2019-02-01,01,03,010,1,3400.00
0010,2019-02-01,02,01,021,3,10200.00
0011,2019-02-01,01,04,010,1,3400.00
0012,2019-02-01,03,01,021,1,3400.00
0013,2019-02-01,01,04,010,1,3400.00
0014,2019-02-02,01,01,010,1,3400.00
0015,2019-02-02,02,02,021,2,6800.00
0016,2019-02-02,01,01,010,1,3400.00
0017,2019-02-02,01,02,021,1,3400.00
0018,2019-02-02,02,01,010,1,3400.00
0019,2019-02-02,01,01,021,2,6800.00
0020,2019-02-02,03,02,010,1,3400.00
0021,2019-02-02,01,01,021,1,3400.00
0022,2019-02-02,01,03,010,1,3400.00
0023,2019-02-02,02,01,021,3,10200.00
0024,2019-02-02,01,04,010,1,3400.00
0025,2019-02-02,03,01,021,1,3400.00
0026,2019-02-02,01,04,010,1,3400.00
0027,2019-02-02,01,04,010,1,3400.00

5. 執行一條SQL語句,確認數據是否已經成功導入

select * from dw_sales;

3、按照日期統計訂單總額/總數量(Hive方式)

操作步驟:

1. 切換到 kylin_dw 數據庫

use kylin_dw;

2. 在代碼目錄中創建sql文件,編寫SQL語句

​select 
date1, 
sum(price) as total_money, 
sum(amount) as total_amount 
from dw_sales 
group by date1;

4、按照日期統計訂單總額/總數量(Kylin方式)

要使用Kylin進行OLAP分析,需要按照以下方式來進行。

1、創建項目(Project) (HMaster  不用 會掛,Hive 掛掉也 創建不了)

2、創建數據源(DataSource)

 

  • 將Hive中的表都導入到Kylin中

  • 添加數據庫,指定表名
  •  選擇庫之後就可以看到各個表

3、創建模型(Model)

  • 指定模型名稱

 

  • 指定事實表

 

 

  •  指定維度列

 

  •  指定待分析的指標

 

  • 指定分區和過濾條件

 

 

4. 創建立方體(Cube)

1. 選擇數據模型

2. 指定維度

3. 指定度量

4. 指定刷新設置

5. 指定執行引擎

 

6. 執行構建並等待完成

點擊頂部導航欄 Monitor 可以觀察運行進度

執行SQL語句分析

​​select
  date1,
  sum(price) as total_money,
  sum(amount) as total_amount
from
  dw_sales
group by date1;

 5、按照訂單渠道名稱統計訂單總額/總數量

Hive中的語句:

select
    t2.channelid,
    t2.channelname,
    sum(t1.price) as total_money,
    sum(t1.amount) as total_amount
from 
    dw_sales t1
inner join dim_channel t2
on t1.channelid = t2.channelid
group by t2.channelid, t2.channelname

 Kylin開發步驟

1、創建Model

 

 

 

2、創建Cube

 維度表 選擇

 

後面選擇引擎保存就可以了 

3、執行構建、等待構建完成

4、執行SQL查詢,獲取結果

select
    t2.channelid,
    t2.channelname,
    sum(t1.price) as total_money,
    sum(t1.amount) as total_amount
from 
    dw_sales t1
inner join dim_channel t2
on t1.channelid = t2.channelid
group by t2.channelid, t2.channelname

5、按照日期、區域、產品維度統計訂單總額/總數量

Hive查詢語句

select
    t1.date1, 
    t2.regionid, 
    t2.regionname, 
    t3.productid, 
    t3.productname,
    sum(t1.price) as total_money,
    sum(t1.amount) as total_amount
from
    dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by 
    t1.date1, 
    t2.regionid, 
    t2.regionname, 
    t3.productid, 
    t3.productname

Kylin開發步驟

1、創建Model

指定維度字段

next --- save

2、創建Cube

指定cube維度

next --- -save

3、執行構建、等待構建完成

4、執行SQL查詢,獲取結果

select
    t1.date1, 
    t2.regionid, 
    t2.regionname, 
    t3.productid, 
    t3.productname,
    sum(t1.price) as total_money,
    sum(t1.amount) as total_amount
from
    dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by 
    t1.date1, 
    t2.regionid, 
    t2.regionname, 
    t3.productid, 
    t3.productname
order by 
    t1.date1,
    t2.regionname,
    t3.productname

時間對比

環境(單機) 時間
Hive 42s
Hive本地模式 6s
Spark-Sql 8.7s
Kylin 0.1s

四、Kylin的工作原理

Apache Kylin的工作原理本質上是 MOLAP Cube(多維立方體分析)。

MOLAP : Multidimension OLAP

1、維度和度量

  • 維度就是觀察數據的角度,例如:

    • 電商的銷售數據,可以從時間的維度來觀察,也可以細化從時間和地區的維度來觀察

    • 統計時,可以把維度值相同的記錄聚合在一起,然後應用聚合函數做累加、平均、去重計數等聚合計算

  • 度量就是被聚合的統計值,也是聚合運算的結果。

時間(維度) 銷售額(度量)
2019 1Q 1.7M
2019 2Q 2.1M
2019 3Q 1.6M
2019 4Q 1.8M

 

時間(維度) 地區(維度) 銷售額(度量)
2019 1Q 中國 1.0M
2019 1Q 北美 0.7M
2019 2Q 中國 1.5M
2019 2Q 北美 0.6M
2019 3Q 中國 0.9M
2019 3Q 北美 0.7M
2019 4Q 中國 0.9M
2019 4Q 北美 0.9M

2、Cube和Cuboid

  • 一個數據表或數據模型上的字段就它們要麼是維度,要麼是度量(可以被聚合)

  • 給定一個數據模型,可以對其上的所有維度進行組合。對於N個維度來說,組合的所有可能性共有2^N種

  • 對於每一種維度的組合,將 度量 做聚合運算,然後將運算的結果保存爲一個物化視圖,稱爲 Cuboid(立方形)

  • 所有維度組合的 Cuboid 作爲一個整體,被稱爲Cube(立方體)一個Cube就是許多按維度聚合的物化視圖的集合

說明 維度1 維度2 維度3 維度4
取值 0或1 0或1 0或1 0或1

 

mysql的視圖:

​ 是一張虛擬的表

​ 例如: 表名(stu) -> select id,name from stu; (屏蔽掉不想要的列)

​ 爲了避免敏感信息泄露,我們可以把以上的結果存儲爲一個視圖, 視圖存儲的是sql語句,不是真實的數據. 視圖的數據直接來源於源表, 那麼當源表的數據發生改變了, 再次查詢視圖的時候, 數據就會發生變化

​ 當你修改視圖的數據的時候,還是在修改源表的數據!!!

 

物化視圖

​ MySql中沒有物化視圖, Oracle有!!!

​ 物化視圖就是一個真實存在的物理表,相當於把前面我們說的普通視圖給物理化成表了!!!

  • 普通視圖能加快查詢速度嗎? --- 不能
  • 物化視圖能加快查詢速度嗎? --- 能

物化視圖由於是一個真實的表,它佔用磁盤空間,另外當你join更多表的時候,這些表一旦發生了變化,就會觸發物化視圖的數據更新!!!( 類似於爲什麼不在所有的列上建立索引)

 

  • 數據立方體

    • Cube 是所有 dimension的組合

    • 每一種 dimension的組合稱之爲cuboid(立方形)。某一有 n 個 dimension的 cube 會有 2^n個 cuboid

    • 數據立方體只是多維模型的一個形象的說法

  • 爲什麼叫立方體?

    • 立方體本身只有三維,但多維模型不僅限於三維模型,可以組合更多的維度

    • 爲了與傳統關係型數據庫的二維表區別開來,纔有了數據立方體的叫法

3、工作原理

Apache Kylin的工作原理是對數據模型做Cube預計算,並利用計算的結果加速查詢。具體工作過程如下。

  1. 指定數據模型Model,定義維度度量

  2. 預計算Cube,計算所有 Cuboid 並保存爲物化視圖

  3. 執行查詢時,讀取Cuboid,運算,產生查詢結果

高效OLAP分析

  • Kylin的查詢過程不會掃描原始記錄,而是通過預計算預先完成表的關聯、聚合等複雜運算

  • 利用預計算的結果來執行查詢,相比非預計算的查詢技術,其速度一般要快一到兩個數量級,在超大的數據集上優勢更明顯

  • 數據集達到千億乃至萬億級別時,Kylin的速度可以超越其他非預計算技術1000倍以上

技術架構

Apache Kylin系統可以分爲在線查詢離線構建兩部分。

 

在線查詢模式主要處於上半部分,離線構建處於下半部分。以下爲Kylin技術架構的具體內容:

  1. 數據源主要是Hadoop Hive,數據以關係表的形式輸入,且必須符合星形模型,保存着待分析的用戶數據。根據元數據的定義,構建引擎從數據源抽取數據,並構建Cube

  2. Kylin可以使用MapReduce或者Spark作爲構建引擎。構建後的Cube保存在右側的存儲引擎中,一般選用HBase作爲存儲

  3. 完成了離線構建後,用戶可以從上方查詢系統發送SQL進行查詢分析

  4. Kylin提供了各種Rest API、JDBC/ODBC接口。無論從哪個接口進入,SQL最終都會來到Rest服務層,再轉交給查詢引擎進行處理

  5. SQL語句是基於數據源的關係模型書寫的,而不是Cube    

  • Kylin在設計時,刻意對查詢用戶屏蔽了Cube的概念

  • 分析師只需要理解簡單的關係模型就可以使用Kylin,沒有額外的學習門檻,傳統的SQL應用也很容易遷移

  • 查詢引擎解析SQL,生成基於關係表的邏輯執行計劃,然後將其轉譯爲基於Cube的物理執行計劃,最後查詢預計算生成的Cube併產生結果,整個過程不會訪問原始數據源

Kylin查詢流程 

Kylin On HBase問題 

      Kylin On HBase中前後綴過濾性能相差巨大的原因:如圖所示:Kylin中會將 Cuboid+所有維度拼接成HBase的Rowkey,Kylin默認會將所有普通指標拼接成HBase一個Column Family中同一列的Value。HBase只有單一Rowkey索引,所以只有查詢能夠匹配Rowkey的前綴時,查詢性能會十分高效,反之,查詢性能會比較低下,甚至會出現全表Scan。此外,即使只需要查詢一個指標,Kylin在HBase側也需要Scan所有指標列,相比列存性能也會有較大差距。 總的來說,HBase在Kylin的查詢場景下Scan和Filter效率較低下。

對於Kylin On HBase Scan和Filter效率低下的問題,我們比較自然會想到的解法是:用列存加速Scan,用索引來加速Filter。

這裏我簡單介紹下列存的優點,主要包含以下3點:

  • 因爲只需要讀取必需訪問的列,所以列存有高效的IO
  • 因爲每列數據的類型一致,格式一致,所以列存可以進行高效的編碼和壓縮
  • 列存更容易實現向量化執行,而向量化執行相比傳統的火山模型,函數調用次數更少,對CPU Cache和SIMD更加友好。 總的來說,列存相比HBase的KV模型更適合Kylin的查詢場景。

所以,要解決 Kylin On HBase Scan 和 Filter 效率低下的問題, 我們就需要爲 Kylin 增加一個列存,有高效索引的存儲引擎。


參考:作者:Kyligence
鏈接:https://www.jianshu.com/p/554f8b391704

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章