目錄
1、創建項目(Project) (HMaster 不用 會掛,Hive 掛掉也 創建不了)
一、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 引擎時提前計算各維度的聚合結果並持久化保存
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
url | http://IP:7070/kylin |
---|---|
默認用戶名 | ADMIN |
默認密碼 | KYLIN |
用戶名和密碼都必須是大寫
4、集羣模式部署(官網)
Kylin 實例是無狀態的服務,運行時的狀態信息存儲在 HBase metastore 中。 出於負載均衡的考慮,您可以啓用多個共享一個 metastore 的 Kylin 實例,使得各個節點分擔查詢壓力且互爲備份,從而提高服務的可用性。下圖描繪了 Kylin 集羣模式部署的一個典型場景:
Kylin 集羣模式部署
如果您需要將多個 Kylin 節點組成集羣,請確保他們使用同一個 Hadoop 集羣、HBase 集羣。然後在每個節點的配置文件
$KYLIN_HOME/conf/kylin.properties
中執行下述操作:
- 配置相同的
kylin.metadata.url
值,即配置所有的 Kylin 節點使用同一個 HBase metastore。- 配置 Kylin 節點列表
kylin.server.cluster-servers
,包括所有節點(包括當前節點),當事件變化時,接收變化的節點需要通知其他所有節點(包括當前節點)。- 配置 Kylin 節點的運行模式
kylin.server.mode
,參數值可選all
,job
,query
中的一個,默認值爲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預計算,並利用計算的結果加速查詢。具體工作過程如下。
-
指定數據模型Model,定義
維度
和度量
-
預計算Cube,計算所有 Cuboid 並保存爲物化視圖
-
執行查詢時,讀取Cuboid,運算,產生查詢結果
高效OLAP分析:
-
Kylin的查詢過程不會掃描原始記錄,而是通過預計算預先完成表的關聯、聚合等複雜運算
-
利用預計算的結果來執行查詢,相比非預計算的查詢技術,其速度一般要快一到兩個數量級,在超大的數據集上優勢更明顯
-
數據集達到千億乃至萬億級別時,Kylin的速度可以超越其他非預計算技術1000倍以上
技術架構
Apache Kylin系統可以分爲在線查詢
和離線構建
兩部分。
在線查詢模式主要處於上半部分,離線構建處於下半部分。以下爲Kylin技術架構的具體內容:
-
數據源主要是Hadoop Hive,數據以關係表的形式輸入,且必須符合星形模型,保存着待分析的用戶數據。根據元數據的定義,構建引擎從數據源抽取數據,並構建Cube
-
Kylin可以使用MapReduce或者Spark作爲構建引擎。構建後的Cube保存在右側的存儲引擎中,一般選用HBase作爲存儲
-
完成了離線構建後,用戶可以從上方查詢系統發送SQL進行查詢分析
-
Kylin提供了各種Rest API、JDBC/ODBC接口。無論從哪個接口進入,SQL最終都會來到Rest服務層,再轉交給查詢引擎進行處理
-
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