Kylin的誕生背景
- Kylin-中國團隊研發的,是第一個真正由中國人自己主導、從零開始、自主研發、併成爲Apache頂級開源項目
- Hive的性能比較慢,支持SQL靈活查詢,特別慢
- HBase的性能快,原生不支持SQL - phoenix:可以寫sql語句來查詢hbase!!
- Kylin是將先將數據進行預處理,將預處理的結果放在HBase中。效率很高
Kylin的應用場景
Kylin 典型的應用場景如下:
- 用戶數據存在於Hadoop HDFS中,利用Hive將HDFS文件數據以關係數據方式存取,數據量巨大,在500G以上
- 每天有數G甚至數十G的數據增量導入
- 有10個以內較爲固定的分析維度
Kylin 的核心思想是利用空間換時間,在數據 ETL 導入 OLAP 引擎時提前計算各維度的聚合結果並持久化保存
爲什麼要使用Kylin
- Kylin 是一個 Hadoop 生態圈下的 MOLAP 系統,是 ebay 大數據部門從2014 年開始研發的支持 TB 到 PB 級別數據量的分佈式 Olap 分析引擎。其特點包括:
- 可擴展的超快的 OLAP 引擎
- 提供 ANSI-SQL 接口
- 交互式查詢能力
- MOLAP Cube 的概念
- 與 BI 工具可無縫整合
Kylin的總體架構
- Kylin 依賴於 Hadoop、Hive、Zookeeper 和 Hbase
一、Kylin安裝
依賴環境
軟件 |
版本 |
Apache hbase-1.1.1-bin.tar.gz |
1.1.1 |
spark-2.2.0-bin-2.6.0-cdh5.14.0.tgz |
2.2.0-bin-cdh5.14.0 |
apache-kylin-2.6.3-bin-hbase1x.tar.gz |
2.6.3 |
集羣規劃
主機名 |
IP |
守護進程 |
node1 |
192.168.88.120 |
NameNode DataNode RunJar(Hive metastore) RunJar(Hive hiveserver2) QuorumPeerMain HMaster HRegionServer kylin NodeManager |
node2 |
192.168.88.121 |
SecondaryNameNode JobHistoryServer DataNode HRegionServer QuorumPeerMain ResourceManager HistoryServer NodeManager |
node3 |
192.168.88.122 |
HRegionServer NodeManager DataNode QuorumPeerMain |
注意:
- kylin-2.6.3-bin-hbase1x所依賴的hbase爲1.1.1版本
- 要求hbase的hbase.zookeeper.quorum值必須只能是host1,host2,...。不允許出現host:2181
安裝kylin-2.6.3-bin-hbase1x
tar -zxf /export/softwares/apache-kylin-2.6.3-bin-hbase1x.tar.gz -C /export/servers/
增加kylin依賴組件的配置
/export/servers/apache-kylin-2.6.3-bin-hbase1x/conf
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml hdfs-site.xml
cp $HADOOP_HOME/etc/hadoop/core-site.xml core-site.xml
cp $HBASE_HOME/conf/hbase-site.xml hbase-site.xml
cp $HIVE_HOME/conf/hive-site.xml hive-site.xml
cp $SPARK_HOME/conf/spark-defaults.conf spark-defaults.conf
配置kylin.sh
/export/servers/apache-kylin-2.6.3-bin-hbase1x/bin
vim 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-2.6.0-cdh5.14.0
配置conf/kylin.properties
修改 資料\Kylin\kylin_配置文件\kylin.properties 中HDFS的路徑,然後上傳到 Linux的 Kylin/conf文件夾中
初始化kylin在hdfs上的數據路徑
hadoop fs -mkdir -p /apps/kylin
啓動集羣
1、啓動zookeeper
2、啓動HDFS
3、啓動YARN集羣
4、啓動HBase集羣
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
10、登錄Kylin
http://node1:7070/kylin
url
默認用戶名
ADMIN
默認密碼
KYLIN
- 用戶名和密碼都必須是大寫
二、入門案例
測試數據表結構介紹
1、(事實表)dw_sales
列名 |
列類型 |
說明 |
id |
string |
訂單id |
date1 |
string |
訂單日期 |
channelid |
string |
訂單渠道(商場、京東、天貓) |
productid |
string |
產品id |
regionid |
string |
區域名稱 |
amount |
int |
商品下單數量 |
price |
double |
商品金額 |
2、(維度表_渠道方式)dim_channel
列名 |
列類型 |
說明 |
channelid |
string |
渠道id |
channelname |
string |
渠道名稱 |
3、(維度表_產品名稱)dim_product
列名 |
列類型 |
說明 |
productid |
string |
產品id |
productname |
string |
產品名稱 |
4、(維度表_區域)dim_region
列名 |
類類型 |
說明 |
regionid |
string |
區域id |
regionname |
string |
區域名稱 |
導入測試數據
爲了方便後續學習Kylin的使用,需要準備一些測試表、測試數據。
- Hive中創建表
- 將數據從本地文件導入到Hive
操作步驟
1、使用 beeline 連接Hive
!connect jdbc:hive2://node1:10000
2、創建並切換到 itcast_dw 數據庫
create database itcast_kylin_dw;
use itcast_kylin_dw;
3、找到資料中的hive.sql文件,執行sql、創建測試表
文件免費下載地址:hive.sql
hive -f hive.sql
-- 查看錶是否創建成功
show tables;
4、在home目錄創建~/dat_file 文件夾,並將測試數據文件上傳到該文件夾中
mkdir ~/dat_file
導入數據到表中
5、執行一條SQL語句,確認數據是否已經成功導入
select * from dw_sales;
按照日期統計訂單總額/總數量(Hive方式)
操作步驟:
1、使用beeline連接Hive
2、切換到itcast_dw數據庫
3、編寫SQL語句
操作步驟:
1、使用beeline連接Hive
2、切換到itcast_dw數據庫
use itcast_dw
3、在代碼目錄中創建sql文件,編寫SQL語句
select date1, sum(price) as total_money, sum(amount) as total_amount from dw_sales group by date1,channelid;
按照日期統計訂單總額/總數量(Kylin方式)
要使用Kylin進行OLAP分析,需要按照以下方式來進行。
1、創建項目(Project)
2、創建數據源(DataSource)
- 指定有哪些數據需要進行數據分析
3、創建模型(Model)
- 指定具體要對哪個事實表、那些維度進行數據分析
4、創建立方體(Cube)
- 指定對哪個數據模型執行數據預處理,生成不同維度的數據
5、執行構建、等待構建完成
6、再執行SQL查詢,獲取結果
- 從Cube中查詢數據
操作步驟
創建項目(Project)
創建數據源(DataSource)
- 將Hive中的表都導入到Kylin中
- 在添加表名中,指定數據庫名
itcast_kylin_dw.dim_channel,itcast_kylin_dw.dim_product,itcast_kylin_dw.dim_region,itcast_kylin_dw.dw_sales
創建模型(Model)
1、 指定模型名稱
2、 指定事實表
3、 指定維度表
4、 指定待分析的指標
5、 指定分區和過濾條件
創建立方體(Cube)
1、選擇數據模型
2、指定維度
3、指定度量
4、指定刷新設置
5、指定執行引擎
執行構建
執行SQL語句分析
在Insight選項卡中,執行以下SQL語句
select
date1,
sum(price) as total_money,
sum(amount) as total_amount
from
dw_sales
group by date1;
按照訂單渠道名稱統計訂單總額/總數量
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
按照日期、區域、產品維度統計訂單總額/總數量
1、創建Model
指定關聯表、關聯條件
指定維度字段
2、創建Cube
- 指定cube維度
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
三、Kylin的工作原理
Apache Kylin的工作原理本質上是 MOLAP(多維立方體分析)
維度和度量
- 維度就是觀察數據的角度,例如:
- 電商的銷售數據,可以從時間的維度來觀察,也可以細化從時間和地區的維度來觀察
- 統計時,可以把維度值相同的記錄聚合在一起,然後應用聚合函數做累加、平均、去重計數等聚合計算
- 度量就是被聚合的統計值,也是聚合運算的結果。
時間(維度) |
銷售額(度量) |
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 |
Cube和Cuboid
- 一個數據表或數據模型上的字段就它們要麼是維度,要麼是度量(可以被聚合)
- 給定一個數據模型,可以對其上的所有維度進行組合。對於N個維度來說,組合的所有可能性共有2 的N 次方種
- 對於每一種維度的組合,將度量做聚合運算,然後將運算的結果保存爲一個物化視圖,稱爲Cuboid(立方形)
- 所有維度組合的Cuboid作爲一個整體,被稱爲Cube(立方體)。一個Cube就是許多按維度聚合的物化視圖的集合。
說明 |
維度1地區 |
維度2時間 |
維度3 |
維度4 |
取值 |
0或1 |
0或1 |
0或1 |
0或1 |
- 數據立方體
- Cube 是所有 dimession 的組合
- 每一種 dimession 的組合稱之爲cuboid(立方形)。某一有 n 個 dimession 的 cube 會有 2^n個 cuboid
- 數據立方體只是多維模型的一個形象的說法
- 爲什麼叫立方體?
- 立方體本身只有三維,但多維模型不僅限於三維模型,可以組合更多的維度
- 爲了與傳統關係型數據庫的二維表區別開來,纔有了數據立方體的叫法
工作原理
Apache Kylin的工作原理是對數據模型做Cube預計算,並利用計算的結果加速查詢。具體工作過程如下。
- 指定數據模型,定義維度和度量
- 預計算Cube,計算所有Cuboid並保存爲物化視圖(存儲到hbase中)
- 執行查詢時,讀取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在每次Cube的構建都會從Hive中批量讀取數據,而對於大多數業務場景來說,Hive中的數據處於不斷增長的狀態。爲了支持Cube中的數據能夠不斷地得到更新,且無需重複地爲已經處理過的歷史數據構建Cube,因此對於 Cube引入了增量構建的功能
理解Cube、Cuboid與Segment的關係
Kylin將Cube劃分爲多個Segment(對應就是HBase中的一個表),每個Segment用起始時間和結束時間來標誌。Segment代表一段時間內源數據的預計算結果。一個Segment的起始時間等於它之前那個Segment的結束時間,同理,它的結束時間等於它後面那個Segment的起始時間。同一個Cube下不同的Segment除了背後的源數據不同之外,其他如結構定義、構建過程、優化方法、存儲方式等都完全相同。
一個Cube,可以包含多個Cuboid,而Segment是指定時間範圍的Cube,可以理解爲Cube的分區。對應就是HBase中的一張表。該表中包含了所有的Cuboid。
例如:以下爲針對某個Cube的Segment
Segment名稱 |
分區時間 |
HBase表名 |
201910110000000-201910120000000 |
20191011 |
KYLIN_41Z8123 |
201910120000000-201910130000000 |
20191012 |
KYLIN_5AB2141 |
201910130000000-201910140000000 |
20191013 |
KYLIN_7C1151 |
201910140000000-201910150000000 |
20191014 |
KYLIN_811680 |
201910150000000-201910160000000 |
20191015 |
KYLIN_A11AD1 |
全量構建與增量構建
全量構建
在全量構建中,Cube中只存在唯一的一個Segment,該Segment沒有分割時間的概念,也就沒有起始時間和結束時間。全量構建和增量構建各有其適用的場景,用戶可以根據自己的業務場景靈活地進行切換。對於全量構建來說,每當需要更新Cube數據的時候,它不會區分歷史數據和新加入的數據,也就是說,在構建的時候會導入並處理所有的原始數據。
增量構建
增量構建只會導入新Segment指定的時間區間內的原始數據,並只對這部分原始數據進行預計算。
全量構建和增量構建的對比
全量構建 |
增量構建 |
每次更新時都需要更新整個數據集 |
每次只對需要更新的時間範圍進行更新,因此離線計算量相對較小 |
查詢時不需要合併不同Segment的結果 |
查詢時需要合併不同Segment的結果,因此查詢性能會受影響 |
不需要後續的Segment合併 |
累計一定量的Segment之後,需要進行合併 |
適合小數據量或全表更新的Cube |
適合大數據量的Cube |
全量構建與增量構建的Cube查詢方式對比:
- 全量構建Cube
- 查詢引擎只需向存儲引擎訪問單個Segment所對應的數據,無需進行Segment之間的聚合
- 爲了加強性能,單個Segment的數據也有可能被分片存儲到引擎的多個分區上,查詢引擎可能仍然需要對單個Segment不同分區的數據做進一步的聚合
- 增量構建Cube
- 由於不同時間的數據分佈在不同的Segment之中,查詢引擎需要向存儲引擎請求讀取各個Segment的數據
- 增量構建的Cube上的查詢會比全量構建的做更多的運行時聚合,通常來說增量構建的Cube上的查詢會比全量構建的Cube上的查詢要慢一些。
對於小數據量的Cube,或者經常需要全表更新的Cube,使用全量構建需要更少的運維精力,以少量的重複計算降低生產環境中的維護複雜度。而對於大數據量的Cube,例如,對於一個包含兩年曆史數據的Cube,如果需要每天更新,那麼每天爲了新數據而去重複計算過去兩年的數據就會變得非常浪費,在這種情況下需要考慮使用增量構建
增量構建Cube過程
1、指定分割時間列
增量構建Cube的定義必須包含一個時間維度,用來分割不同的Segment,這樣的維度稱爲分割時間列(Partition Date Column)。
2、增量構建過程
- 在進行增量構建時,將增量部分的起始時間和結束時間作爲增量構建請求的一部分提交給Kylin的任務引擎
- 任務引擎會根據起始時間和結束時間從Hive中抽取相應時間的數據,並對這部分數據做預計算處理
- 將預計算的結果封裝成爲一個新的Segment,並將相應的信息保存到元數據和存儲引擎中。一般來說,增量部分的起始時間等於Cube中最後一個Segment的結束時間。
增量Cube的創建
創建增量Cube的過程和創建普通Cube的過程基本類似,只是增量Cube會有一些額外的配置要求
1、配置Model
增量構建的Cube需要指定分割時間列。例如:將日期分區字段添加到維度列中
在設置中,配置分區列,並指定日期格式
注意事項
- 注意構建Cube時,選擇的分區時間爲,起始時間(包含)、結束時間(不保存),對應了從Hive從獲取數據源的條件
INSERT OVERWRITE TABLE `kylin_intermediate_cube_order_1582ee64_45f9_cf22_bef2_e0b455efc284` SELECT
`FACT_ORDER`.`DT` as `FACT_ORDER_DT`
,`FACT_ORDER`.`USER_ID` as `FACT_ORDER_USER_ID`
,`FACT_ORDER`.`PRICE` as `FACT_ORDER_PRICE`
FROM `ITCAST_KYLIN_DW`.`FACT_ORDER` as `FACT_ORDER`
INNER JOIN `ITCAST_KYLIN_DW`.`DIM_USER` as `DIM_USER`
ON `FACT_ORDER`.`USER_ID` = `DIM_USER`.`ID`
WHERE 1=1 AND (`FACT_ORDER`.`DT` >= '20191011' AND `FACT_ORDER`.`DT` < '20191012');
2、參看Segment
3、構建 20191012、20191013的Cube數據
INSERT OVERWRITE TABLE `kylin_intermediate_cube_order_16b6b739_cf24_fa63_c9bb_f8932b8c5d15` SELECT
`FACT_ORDER`.`DT` as `FACT_ORDER_DT`
,`FACT_ORDER`.`USER_ID` as `FACT_ORDER_USER_ID`
,`FACT_ORDER`.`PRICE` as `FACT_ORDER_PRICE`
FROM `ITCAST_KYLIN_DW`.`FACT_ORDER` as `FACT_ORDER`
INNER JOIN `ITCAST_KYLIN_DW`.`DIM_USER` as `DIM_USER`
ON `FACT_ORDER`.`USER_ID` = `DIM_USER`.`ID`
WHERE 1=1 AND (`FACT_ORDER`.`DT` >= '20191012' AND `FACT_ORDER`.`DT` < '20191013');
4、查看增量構建Cube對應的Segment
REST API觸發增量構建
在Web GUI上進行的所有操作,其背後調用的都是同一套Rest API。將來可以SHELL腳本調度REST API觸發構建。
屬性 |
值 |
URL |
http://node1:7070/kylin/api/cubes/{Cube名稱}/rebuild |
請求方式 |
PUT |
RequestBody(JSON字符串) |
{"startTime":時間戳, "endTime": "時間戳", "buildType": "BUILD/MERGE/REFRESH"} |
注意:
- Kylin中Cube構建的時間採用CST(北京時間),而REST提交的時間採用的是UTC(世界標準時間)
- CST = UTC + 8
- startTime、endTime提交到Kylin,應該 +8 個小時
參考JSON:
{
"startTime": "1570838400000",
"endTime": "1570924800000",
"buildType": "BUILD"
}
時間戳轉換工具:
http://tool.chinaz.com/Tools/unixtime.aspx
五、Cube碎片管理
增量構建的問題
日積月累,增量構建的Cube中的Segment越來越多,該Cube的查詢性能也會越來越慢,因爲需要在單點的查詢引擎中完成越來越多的運行時聚合。爲了保持查詢性能:
- 需要定期地將某些Segment合併在一起
- 或者讓Cube根據Segment保留策略自動地淘汰那些不會再被查詢到的陳舊Segment
管理Cube碎片
上述案例,每天都會生成一個Segment,對應就是HBase中的一張表。增量構建的Cube每天都可能會有新的增量。這樣的Cube中最終可能包含上百個Segment,這將會導致Kylin性能受到嚴重的影響。
- 從執行引擎的角度來說,運行時的查詢引擎需要聚合多個Segment的結果才能返回正確的查詢結果
- 從存儲引擎的角度來說,大量的Segment會帶來大量的文件,給存儲空間的多個模塊帶來巨大的壓力,例如Zookeeper、HDFS Namenode等
因此,有必要採取措施控制Cube中Segment的數量。
手動觸發合併Segment
Kylin提供了一種簡單的機制用於控制Cube中Segment的數量:合併Segments。在Web GUI中選中需要進行Segments合併的Cube,
操作步驟:
1、單擊Action→Merge
2、選中需要合併的Segment,可以同時合併多個Segment,但是這些Segment必須是連續的
單擊提交後系統會提交一個類型爲“MERGE”的構建任務,它以選中的Segment中的數據作爲輸入,將這些Segment的數據合併封裝成爲一個新的Segment。新的Segment的起始時間爲選中的最早的Segment的起始時間,它的結束時間爲選中的最晚的Segment的結束時間。
注意事項
- 在MERGE類型的構建完成之前,系統將不允許提交這個Cube上任何類型的其他構建任務
- 在MERGE構建結束之前,所有選中用來合併的Segment仍然處於可用的狀態
- 當MERGE構建結束的時候,系統將選中合併的Segment替換爲新的Segment,而被替換下的Segment等待將被垃圾回收和清理,以節省系統資源
刪除Segment
使用WebUI刪除Cube的segment
1、disable Cube
2、點擊 delete Segment,刪除指定的segment
使用Postman發送請求刪除Segment
屬性 |
值 |
URL |
http://node1:7070/kylin/api/cubes/{cubeName}/segs/{segmentName} |
請求方式 |
DELETE |
自動合併
手動維護Segment很繁瑣,人工成本很高,Kylin中是可以支持自動合併Segment。
在Cube Designer的“Refresh Settings”的頁面中有:
- Auto Merge Thresholds
- Retention Threshold
兩個設置項可以用來幫助管理Segment碎片。這兩項設置搭配使用這兩項設置可以大大減少對Segment進行管理的麻煩。
1、Auto Merge Thresholds
- 允許用戶設置幾個層級的時間閾值,層級越靠後,時間閾值就越大
- 每當Cube中有新的Segment狀態變爲 READY的時候,會自動觸發一次系統自動合併
- 合併策略
達到了閾值就跳過,沒有達到閾值就合併到這個閾值,沒滿足不合並。
嘗試最大一級的時間閾值,例如:針對(7天、28天)層級的日誌,先檢查能否將連續的若干個Segment合併成爲一個超過28天的大Segment
- 如果有個別的Segment的時間長度本身已經超過28天,系統會跳過Segment
- 如果滿足條件的連續Segment還不能夠累積超過28天,那麼系統會使用下一個層級的時間閾值重複尋找
示例1 - 理解Kylin自動合併策略
- 假設自動合併閾值設置爲7天、28天
- 如果現在有A-H8個連續的Segment,它們的時間長度爲28天(A)、7天(B)、1天(C)、1天(D)、1天(E)、1天(F)、1天(G)、1天(H)
- 此時,第9個Segment I加入,時間長度爲1天。
自動合併策略爲:
- Kylin判斷時候能將連續的Segment合併到28天這個閾值,由於Segment A已經超過28天,會被排除
- 剩下的連續Segment,所有時間加一起 B + C + D + E + F + G + H + I (7 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 14) < 28天,無法滿足28天閾值,開始嘗試7天閾值
- 跳過A(28)、B(7)均超過7天,排除
- 剩下的連續Segment,所有時間加一起 C + D + E + F + G + H + I(1 + 1 + 1 + 1 + 1 + 1 + 1 = 7)達到7天閾值,觸發合併,提交Merge任務。並構建一個Segment X(7天)
- 合併後,Segment爲:A(28天)、B(7天)、X(7天)
- 繼續觸發檢查,A(28天)跳過,B + X(7 + 7 = 14)< 28天,不滿足第一閾值,重新使用第二閾值觸發
- 跳過B、X,嘗試終止
2、示例:配置自動合併4天的Segment
操作步驟:
1、配置自動合併閾值爲(4、28)
2、分別按照天構建分區Cube
3、自動觸發合併Segment構建
自動刪除Segment
自動合併是將多個Segment合併爲一個Segment,以達到清理碎片的目的。自動刪除Segment則是及時清理不再使用的Segment。
在很多場景中,只會對過去一段時間內的數據進行查詢,例如:
- 對於某個只顯示過去1年數據的報表
- 支撐它的Cube其實只需要保留過去一年類的Segment即可
- 由於數據在Hive中已經存在備份,則無需在Kylin中備份超過一年的歷史數據
可以將Retention Threshold設置爲365。每當有新的Segment狀態變爲READY的時候,系統會檢查每一個Segment。如果它的結束時間距離最晚的一個Segment的結束時間已經大於等於“Retention Threshold”,那麼這個Segment將被視爲無需保留。系統會自動地從Cube中刪除這個Segment。
需求:
- 配置保留Segment爲2天,分別構建增量Segment,測試Segment保留情況
操作步驟:
1、在Cube中設置Retension Threshold爲2
2、重新構建Cube
3、測試超過指定保留時間的Segment,是否被自動移除
六、使用JDBC連接操作Kylin
- 要將數據以可視化方式展示出來,需要使用Kylin的JDBC方式連接執行SQL,獲取Kylin的執行結果
- 使用Kylin的JDBC與JDBC操作MySQL一致
- jdbc url
- jdbc:kylin://node1:7070/itcast_dw
- 用戶名密碼:ADMIN/KYLIN
需求
通過JDBC方式,查詢按照日期、區域、產品維度統計訂單總額/總數量結果
開發步驟
- 導入驅動依賴
<dependencies>
<!-- Kylin -->
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
</dependencies>
1、加載驅動
2、創建Connection連接對象
3、構建SQL語句
4、創建Statement對象,並執行executeQuery
5、打印結果
參考代碼
public static void main(String[] args) throws Exception {
// 1、加載驅動
Class.forName("org.apache.kylin.jdbc.Driver");
// 2、創建Connection連接對象
// 連接字符串:jdbc:kylin://ip地址:7070/項目名稱(project)
Connection connection = DriverManager.getConnection("jdbc:kylin://node1:7070/itcast_dw",
"ADMIN",
"KYLIN");
// 3、創建Statement對象,並執行executeQuery,獲取ResultSet
Statement statement = connection.createStatement();
// 構建SQL和語句
String sql = "select\n" +
" t1.date1,\n" +
" t2.regionname,\n" +
" productname,\n" +
" sum(t1.price) as total_money,\n" +
" sum(t1.amount) as total_amount\n" +
"from\n" +
" dw_sales t1\n" +
"inner join dim_region t2\n" +
"on t1.regionid = t2.regionid\n" +
"inner join dim_product t3\n" +
"on t1.productid = t3.productid\n" +
"group by\n" +
" t1.date1,\n" +
" t2.regionid,\n" +
" t2.regionname,\n" +
" t3.productid,\n" +
" t3.productname";
ResultSet resultSet = statement.executeQuery(sql);
// 4、打印ResultSet
while(resultSet.next()) {
// 4.1 獲取時間
String date1 = resultSet.getString("date1");
// 4.2 獲取區域名稱
String regionname = resultSet.getString("regionname");
// 4.3 獲取產品名稱
String productname = resultSet.getString("productname");
// 4.4 總金額
String total_money = resultSet.getString("total_money");
// 4.5 總數量
String total_amount = resultSet.getString("total_amount");
System.out.println(date1 + " " + regionname + " " + productname + " " + total_money + " " + total_amount);
}
connection.close();
}