開源分散式支援超大規模資料分析型資料倉儲Apache Kylin實踐-上

2023-02-10 06:01:02

@

概述

定義

Apache Kylin 官網中文地址 https://kylin.apache.org/cn/

Apache Kylin 官網中文最新檔案 https://kylin.apache.org/cn/docs/

Apache Kylin 原始碼地址 https://github.com/apache/kylin

Apache Kylin™是一個開源的、分散式的分析型資料倉儲,提供Hadoop/Spark 之上的 SQL 查詢介面及多維分析(OLAP)能力以支援超大規模資料,最初由 eBay 公司中國團隊開發並貢獻給Apache,使用神獸麒麟命名,查詢速度快能在亞秒內響應。最新版本為v4.0.3

Apache Kylin4.0 是一個重大改革版本,其中4.0之前採用HBase 作為儲存引擎來儲存 cube 構建後產生的預計算結果,構建引擎為MR,下推引擎採用的是HIVE JDBC;4.0之後採用了全新的 Spark 構建引擎和 Parquet 作為儲存,同時使用 Spark 作為查詢引擎。版本功能詳細對比如下:

使用 Apache Parquet + Spark 來代替 HBase 使用理由如下:

  • HBase 作為 HDFS 之上面向列族的資料庫,查詢表現已經算是比較優秀,但是它仍然存在以下幾個缺點:
    • HBase 不是真正的列式儲存;
    • HBase 沒有二級索引,Rowkey 是它唯一的索引;
    • HBase 沒有對儲存的資料進行編碼,kylin 必須自己進行對資料編碼的過程;
    • HBase 不適合雲上部署和自動伸縮;
    • HBase 不同版本之間的 API 版本不同,存在相容性問題(比如,0.98,1.0,1.1,2.0);
    • HBase 存在不同的供應商版本,他們之間有相容性問題。
  • Parquet針對上面問題有如下特點
    • Parquet 是一種開源並且已經成熟穩定的列式儲存格式;
    • Parquet 對雲更加友好,可以相容各種檔案系統,包括 HDFS、S3、Azure Blob store、Ali OSS 等;
    • Parquet 可以很好地與 Hadoop、Hive、Spark、Impala 等整合;
    • Parquet 支援自定義索引。

特性

  • 可延伸超快的基於巨量資料的分析型資料倉儲:為減少在 Hadoop/Spark 上百億規模資料查詢延遲而設計。
  • 互動式查詢能力:對 Hadoop 資料實現亞秒級互動響應,在同等的資料規模比 Hive 效能更好。
  • 實時 OLAP:在資料產生時進行實時處理,可在秒級延遲下進行實時資料的多維分析。
  • Hadoop ANSI SQL 介面:作為一個分析型資料倉儲(也是 OLAP 引擎),為 Hadoop 提供標準 SQL 支援大部分查詢功能。
  • 多維立方體(MOLAP Cube):能夠在百億以上資料集定義資料模型並構建立方體。
  • 與BI工具無縫整合:提供與 BI 工具的整合能力,如Tableau,PowerBI/Excel,MSTR,QlikSense,Hue 和 SuperSet。
  • 其他特性
    • Job管理與監控
    • 壓縮與編碼
    • 增量更新
    • 利用HBase Coprocessor
    • 基於HyperLogLog的Dinstinc Count近似演演算法
    • 友好的web介面以管理,監控和使用立方體
    • 專案及表級別的存取控制安全
    • 支援LDAP、SSO

術語

  • 資料倉儲是一個各種資料(包括歷史資料、當前資料)的中心儲存系統,是BI(business intelligence,商業智慧)的核心部件。例如資料包含來自企業各個業務系統的訂單、交易、客戶、採購、庫存、供應商、競爭對手資料。

  • 商業智慧通常被理解為將企業中現有的資料轉化為知識,幫助企業做出明智的業務經營決策的工具。為了將資料轉化為知識,需要利用到資料倉儲、聯機分析(OLAP)工具和資料探勘等技術。

  • OLAP是一種軟體技術,它使分析人員能夠迅速、一致、互動地從各個方面、各個維度觀察資訊,以達到深入理解資料的目的,OLAP也稱為多維分析。

    • ROLAP(Relational OLAP):基於關係型資料庫,不需要預計算。
    • MOLAP(Multidimensional OLAP):基於多維資料集,需要預計算。
  • 星型模型:由一個或多個參照任意數量維表的事實表組成。

  • 事實表:由業務流程的測量、度量或事實組成。

  • 查詢表:是一個陣列,它用一個更簡單的陣列索引操作代替執行時計算。

  • 維度:是一種對事實和度量進行分類的結構,以便使使用者能夠回答業務問題。常用的維度有人物、產品、地點和時間。

  • 度量:是可以進行計算(例如總和、計數、平均、最小值、最大值)的屬性。

  • 連線:一個SQL連線子句組合來自關聯式資料庫中兩個或多個表的記錄。

技術概念

  • OLAP Cube:OLAP多維資料集是用0維或多維來理解的資料陣列;一個多維的資料集稱為一個OLAP Cube.給定一個資料模型,我們可以對其上的所有維度進行聚合,對於 N 個維度來說,組合的所有可能性共有 2^n-1種。對於每一種維度的組合,將度量值做聚合計算,然後將結果儲存 為一個物化檢視,稱為 Cuboid。所有維度組合的 Cuboid 作為一個整體,稱為 Cube。簡單點來講:就是每一種維度的組合都叫一個Cuboid, 所有的維度的組合就叫做Cube。

    • Table:這是將蜂窩表定義為多維資料集的源,必須在構建多維資料集之前同步。
    • Data Model:描述了一個STAR SCHEMA資料模型,它定義了事實/查詢表和篩選條件。
    • Cube Descriptor:它描述了多維資料集範例的定義和設定,定義使用哪個資料模型,擁有什麼維度和度量,如何劃分到段以及如何處理自動合併等。
    • Cube Instance:一個多維資料集範例,由一個多維資料集描述符構建,根據分割區設定由一個或多個多維資料集段組成。
    • Partition:使用者可以在多維資料集描述符上定義DATE/STRING列作為分割區列,將一個多維資料集劃分為具有不同日期週期的幾個段。
    • Cube Segment:Cube資料的實際載體。一個構建作業為多維資料集範例建立一個新段。一旦資料在指定的資料週期內發生變化,可以對相關的資料段進行重新整理,從而避免重新構建整個多維資料集。
    • Aggregation Group:每個聚合組是維度的子集,並在其中組合構建長方體。它的目標是修剪優化。
  • 維度與度量

    • Mandotary:此維度型別用於長方體修剪,如果一個維度被指定為「強制」,那麼那些沒有該維度的組合將被修剪。
    • Hierarchy:其維度型別用於長方體修剪,如果維度A、B、C形成「層次」關係,則只保留與A、AB或ABC的組合。
    • Derived :在查詢表中,可以從它的PK生成一些維度,因此它們與事實表中的FK之間存在特定的對映。所以這些維度是衍生的,不參與長方體的生成。
    • Count Distinct(HyperLogLog) :針對Immediate COUNT DISTINCT難以計算的問題,引入了一種近似演演算法HyperLogLog,使錯誤率保持在較低的水平。
    • Count Distinct(Precise) - Precise Count Distinct將基於RoaringBitmap預計算,目前只支援int或bigint。
    • Top N:例如使用這種測量型別,使用者可以很容易地獲得指定的頂級賣家/買家數量等。
  • Cube Actions

    • BUILD:給定分割區列的間隔,此操作是構建一個新的多維資料集段。
    • REFRESH:此操作將在某個分割區期間重建多維資料集段,用於源表增加的情況。
    • MERGE:這個動作將多個連續的立方體片段合併為一個。這可以通過多維資料集描述符中的自動合併設定來實現。
    • PURGE*:清除-清除多維資料集範例下的段。這隻會更新後設資料,不會從HBase中刪除多維資料集資料。
  • Job Status

    • NEW:這表示剛剛建立了一個作業。
    • PENDING:這表示一個作業被作業排程器暫停並等待資源。
    • RUNNING:這表示一個作業正在進行中。
    • FINISHED:這表示一項工作已成功完成。
    • ERROR:這表示一個作業因錯誤而中止。
    • DISCARDED:這表示一個作業被終端使用者取消了。
  • Job Action

    • RESUME -一旦作業處於ERROR狀態,該操作將嘗試從最近的成功點恢復它。
    • DISCARD -無論作業的狀態如何,使用者都可以通過DISCARD動作結束作業並釋放資源。

架構和元件

Kylin 提供與多種資料視覺化工具的整合能力,如 Tableau、PowerBI 等,很方便使用 BI 工具對 Hadoop 資料進行分析。

  • REST Server:是面向應用程式開發的入口點,此類應用程式可以提供查詢、獲取結果、觸發Cube構建任務、獲取後設資料及使用者許可權等,還可以通過Restful介面實現SQL查詢。
  • Query Engine(查詢引擎):當 cube 準備就緒後,查詢引擎就能夠獲取並解析使用者查詢。隨後會與系統中的其它元件進行互動,從而向用戶返回對應的結果。4.0版本採用Spark作為查詢引擎。
  • Routing(路由器):在最初設計時曾考慮過將 Kylin 不能執行的查詢引導去 Hive 中繼續執行,但在實踐後 發現 Hive 與 Kylin 的速度差異過大,導致使用者無法對查詢的速度有一致的期望,很可能大 多數查詢幾秒內就返回結果了,而有些查詢則要等幾分鐘到幾十分鐘,因此體驗非常糟糕。 最後這個路由功能在發行版中預設關閉。
  • Metadata(後設資料管理工具):Kylin 是一款後設資料驅動型應用程式。後設資料管理工具是一大關鍵性元件,用於對儲存 在 Kylin 當中的所有後設資料進行管理,其中包括最為重要的 cube 後設資料。其它全部元件的 正常運作都需以後設資料管理工具為基礎。 Kylin 4.0的後設資料儲存在 MySQL 中。
  • Build Engine(構建引擎):Kylin4.0的構建引擎從MR改為Spark,使使用者能否快速得到想要的Cube資料,構建引擎最終得到的資料存放在Parquet檔案中,然後Spark更夠更好讀取Parquet檔案資料。

生態圈

  • Kylin 核心:Kylin 基礎框架,包括後設資料(Metadata)引擎,查詢引擎,Job引擎及儲存引擎等,同時包括REST伺服器以響應使用者端請求。
  • 擴充套件:支援額外功能和特性的外掛。
  • 整合:與排程系統,ETL,監控等生命週期管理系統的整合。
  • 使用者介面:在Kylin核心之上擴充套件的第三方使用者介面。
  • 驅動:ODBC 和 JDBC 驅動以支援不同的工具和產品,比如Tableau。

部署

Docker部署

為了讓使用者輕鬆試用麒麟,並方便開發人員在修改原始碼後進行驗證和偵錯。可以通過麒麟的docker映象快速部署。該映象包含麒麟所依賴的每個服務:

  • JDK 1.8
  • Hadoop 2.8.5
  • Hive 1.2.1
  • Spark 2.4.7
  • Kafka 1.1.1
  • MySQL 5.1.73
  • Zookeeper 3.4.6
# 拉取映象,dcoker hub上已有kylin 5.0.0版本映象,二進位制未更新
docker pull apachekylin/apache-kylin-standalone:5.0.0
# 執行容器
docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
apachekylin/apache-kylin-standalone:5.0.0

以下服務在容器啟動時自動啟動:NameNode、 DataNode、ResourceManager、NodeManager、Kylin,相關web UI地址如下:

基於hadoop環境安裝

前置條件

  • HDFS,YARN,MapReduce,Hive,Zookeeper 等服務的 Hadoop 叢集;建議單獨部署在Hadoop client 節點上,該節點上 Hive,HDFS 等命令列已安裝好;執行 Kylin 的 Linux 賬戶要有存取 Hadoop 叢集的許可權,包括建立/寫入 HDFS 資料夾,Hive 表的許可權。
  • 硬體要求:執行 Kylin 的伺服器建議最低設定為 4 core CPU,16 GB 記憶體和 100 GB 磁碟。
  • 作業系統要求:Linux only、CentOS 6.5+ 或Ubuntu 16.0.4+。
  • 安裝環境軟體要求
    • Hadoop: cdh5.x, cdh6.x, hdp2.x, EMR5.x, EMR6.x, HDI4.x
    • Hive: 0.13 - 1.2.1+
    • Spark: 2.4.7/3.1.1
    • Mysql: 5.1.7 及以上
    • JDK: 1.8+

安裝

  • 下載解壓檔案
# 下載最新版本v4.0.3 for Apache Spark 3.1.x
wget https://dlcdn.apache.org/kylin/apache-kylin-4.0.3/apache-kylin-4.0.3-bin-spark3.tar.gz
# 解壓檔案
tar -zxvf  apache-kylin-4.0.3-bin-spark3.tar.gz
# 進入kylin根目錄
cd apache-kylin-4.0.3-bin-spark3
# 根目錄結構說明如下
bin:啟動/停止Kylin服務、備份/恢復後設資料的shell指令碼,以及一些實用指令碼。
conf: XML組態檔,這些xml檔案的功能可以在設定頁面中找到。
lib:對外使用的Kylin jar檔案,如Hadoop作業jar、JDBC驅動程式、HBase協處理器jar等。
meta_backups:執行" bin/metastore.sh backup "命令時的預裝置份資料夾;
sample_cube:用於建立樣例多維資料集及其表的檔案。
spark: spark由$KYLIN_HOME/bin/download.sh下載。
tomcat:執行Kylin應用程式的tomcat web伺服器。
tool:命令列工具的jar檔案。
# 設定麒麟環境變數
vim /etc/profile
export KYLIN_HOME=/home/commons/apache-kylin-4.0.3-bin-spark3
# 執行環境變數生效
source /etc/profile
  • 下載和設定Spark。
# 前面用apache-kylin-4.0.3-bin-spark3使用spark3需要下載spark-3.1.1版本
wget https://archive.apache.org/dist/spark/spark-3.1.1/spark-3.1.1-bin-hadoop3.2.tgz
# 解壓
tar -xvf spark-3.1.1-bin-hadoop3.2.tgz
# 進入目錄
mv spark-3.1.1-bin-hadoop3.2 spark-yarn
# 由於需要用到yarn作為資源管理器,設定spark使用yarn的資源
vim conf/spark-env.sh
YARN_CONF_DIR=/home/commons/hadoop/etc/hadoop

並將MySQL連線驅動拷貝到spark的jars目錄下,讓spark能夠正常連線MySQL。

將可使用的hive-site.xml拷貝到spark的conf目錄,用於spark操作hive的後設資料等。

將上面spark-yarn目錄分發到所有的yarn的node manager上,並且修改所有node manager的spark環境變數

vim /etc/profile
export SPARK_HOME=/home/commons/spark-yarn
export PATH=$SPARK_HOME/bin:$PATH
# 執行環境變數生效
source /etc/profile
  • 設定MySQL後設資料

    • 建立資料庫及使用者
    -- 建立一個kylin資料庫
    CREATE DATABASE kylin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    -- 建立一個kylin使用者
    CREATE USER 'kylin'@'%' IDENTIFIED BY 'kylin';
    -- 向用戶授予剛剛建立的資料庫的所有許可權
    GRANT ALL PRIVILEGES ON kylin.* TO kylin@'%' WITH GRANT OPTION;
    ALTER USER 'kylin'@'%' IDENTIFIED WITH mysql_native_password BY 'kylin';
    FLUSH PRIVILEGES;
    
    • 下載MySQL JDBC驅動程式(MySQL -connector-java-.jar),這裡使用MySQL8,驅動程式mysql-connector-java-8.0.28.jar,並將其放在$KYLIN_HOME/ext/目錄下,先 mkdir ext建立ext資料夾

    • 如果需要加密資料庫使用者密碼,可使用kylin自帶工具加密mysql密碼,並在kylin.metadata.url中增加passwordEncrypted=true
    java -classpath kylin-server-base-4.0.3.jar\
    :kylin-core-common-4.0.3.jar\
    :spring-beans-5.2.22.RELEASE.jar\
    :spring-core-5.2.22.RELEASE.jar\
    :commons-codec-1.6.jar \
    org.apache.kylin.rest.security.PasswordPlaceholderConfigurer \
    AES kylin
    
  • 修改kylin的組態檔,vim conf/kylin.properties

kylin.metadata.url=kylin_metadata@jdbc,url=jdbc:mysql://mysqlserver:3306/kylin,username=kylin,password=kylin,maxActive=10,maxIdle=10,driverClassName=com.mysql.cj.jdbc.Driver
# HDFS工作空間
kylin.env.hdfs-working-dir=/kylin
# kylin在zookeeper的工作目錄
kylin.env.zookeeper-base-path=/kylin
# 不使用kylin自帶的zookeeper
kylin.env.zookeeper-is-local=false
# 外部zookeeper連線字串設定
Kylin.env.zookeeper-connect-string=zk1:2181,zk2:2181,zk3:2181
# SPARK BUILD ENGINE CONFIGS,hadoop conf目錄位置
kylin.env.hadoop-conf-dir=/home/commons/hadoop/etc/hadoop
  • 環境檢查,Kylin執行在Hadoop叢集上,對各個元件的版本、存取許可權和CLASSPATH有一定的要求。
# 為了避免遇到各種環境問題,可以執行$KYLIN_HOME/bin/check-env.sh指令碼進行環境檢查,檢視是否存在問題。如果識別出任何錯誤,指令碼將列印出詳細的錯誤訊息。如果沒有錯誤訊息,說明您的環境適合Kylin操作。
$KYLIN_HOME/bin/check-env.sh

  • 由於hadoop和hive依賴衝突報類找不到

  • 將commons-configuration-1.6.jar上傳到$KYLIN_HOME/tomcat/webapps/kylin/WEB-INF/lib/下。

  • 啟動Kylin
# 啟動
$KYLIN_HOME/bin/kylin.sh start
# 麒麟啟動的預設埠為7070。可以使用$KYLIN_HOME/bin/kylin-port-replace-util.sh set number修改埠。修改後的埠號為「7070 +編號」。
$KYLIN_HOME/bin/kylin-port-replace-util.sh set number 1
# 停止
$KYLIN_HOME/bin/kylin.sh start
# 重啟
$KYLIN_HOME/bin/kylin.sh restart

# 可以檢視執行紀錄檔
tail -f logs/kylin.log

使用步驟

Apache Kylin™ 令使用者僅需三步就可實現超巨量資料集上的亞秒級查詢。

  • 定義資料集上的一個星型或雪花模型。
  • 在定義的資料表上構建cube。
  • 使用標準 SQL 通過 ODBC、JDBC 或 RESTFUL API 進行查詢,僅需亞秒級響應時間即可獲得查詢結果。

官方樣例Cube說明

# 使用Kylin安裝目錄下範例快速體驗Kylin,先執行一個指令碼來建立一個範例多維資料集
$KYLIN_HOME/bin/sample.sh

執行指令碼完成後,檢視hive default預設資料庫下已經有相應的

通過kylin的WebUI click System -> Configuration -> Reload Metadata 載入後設資料資訊

重新載入後設資料後,可以在左上角的project中看到一個名為learn_kylin的專案,這個專案包含一個批次處理多維資料集kylin_sales_cube和一個流資料集kylin_streaming_cube。

可以直接構建kylin_sales_cube,並且可以在構建完成後查詢它。

範例演示

準備演示資料

  • hive中建立kylin資料庫,並建立dept部門表和emp員工表
create database kylin;
use kylin;
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';

create external table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string, 
sal double, 
comm double,
deptno int)
row format delimited fields terminated by '\t';
  • 製作範例資料
mkdir tmpdata
# 製作部門表(dept.txt)資料
vim tmpdata/dept.txt
100	ACCOUNTING	1700
200	RESEARCH	1800
300	SALES	1900
400	OPERATIONS	1700
# 製作員工表(emp.txt)資料
vim tmpdata/emp.txt
1336	SMITH	CLERK	1869	2016-01-03	2800.0	1000.0	200
1466	ALLEN	SALESMAN	1665	2016-03-08	5600.0	1500.0	300
1488	WARD	SALESMAN	1665	2016-03-10	4375.0	2500.0	300
1533	JONES	MANAGER	1806	2016-04-18	10412.5	6000.0	200
1621	MARTIN	SALESMAN	1665	2016-10-14	4375.0	7000.0	300
1665	BLAKE	MANAGER	1806	2016-05-17	9975.0	4000.0	300
1749	CLARK	MANAGER	1806	2016-06-25	8575.0	3500.0	100
1755	SCOTT	ANALYST	1533	2022-05-05	10500.0	6800.0	200
1806	KING	PRESIDENT	NULL	2016-12-03	17500.0	20000.0	100
1811	TURNER	SALESMAN	1665	2016-09-24	5250.0	3000.0	300
1843	ADAMS	CLERK	1755	2022-06-08	3850.0	2500.0	200
1867	JAMES	CLERK	1665	2016-12-19	3325.0	2400.0	300
1869	FORD	ANALYST	1533	2016-12-19	10500.0	8000.0	200
1901	MILLER	CLERK	1749	2017-02-08	4550.0	3200.0	100
  • 載入範例資料到hive相應表中
load data local inpath '/home/commons/apache-kylin-4.0.3-bin-spark3/tmpdata/dept.txt' into table dept;
load data local inpath '/home/commons/apache-kylin-4.0.3-bin-spark3/tmpdata/emp.txt' into table emp;

建立專案

點選左上角的+來建立一個Project,輸出專案名稱和描述點選提交按鈕

選擇資料來源

  • 選擇載入資料來源方式,選擇第二個可以從hive中載入資料,第三個可以從 csv 檔案載入資料。

  • 同步要作為資料來源的表,上面點選後第一次需要載入後設資料會有點慢,載入過後續就快了

  • 載入

建立Model

在Models頁面的左邊點選New按鈕後點選New Model,填寫Model名稱及描述後Next

選擇員工作為Fact Table事實表,新增部門作為Lookup Table維度表

選擇維度資訊

選擇度量資訊

新增分割區資訊(這裡沒有做分割區表)及過濾條件這裡我們暫時不填寫保持預設,點選「Save」並確認儲存模型。

建立Cube

在Models頁面的左邊點選New按鈕後點選New Cube,選擇員工Model及填寫Cube Name,點選next

新增真正維度欄位,(將來會影響 Cuboid 的個數,並且只能從 model 維度欄位裡面選擇),點選ok並點選下一步

新增真正度量值欄位(將來預計算的欄位值,只能從 model 度量值裡面選擇),點選度量新增按鈕「+ Measure」,填寫資訊並點選ok,並選擇next

接著重新整理設定、高階設定、設定覆蓋都先保持預設的,最後檢視概覽點選save按鈕並確定儲存

Cube構建

在上面建立的cube上點選build構建action動作,並確認開始構建

檢視當前正在構建的情況

等待一會後構建完成

與Hive查詢對比

在Insight洞察頁面新查詢框中輸入sql語句

select dept.dname,sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;

第一次之後的查詢都是秒級響應

相比下面在hive中執行查詢快了非常多

可以針對查詢結果點選Grid按鈕實現圖形視覺化,選擇圖示型別、維度和度量資訊展示,還可以選擇匯出csv檔案結果

  • 本人部落格網站IT小神 www.itxiaoshen.com