Apache Kylin 簡介
1. 簡介
Apache Kylin 是一個開源 OLAP 引擎,旨在為海量資料集帶來亞秒級查詢效能。 Kylin 最初由 eBay 開發,後來捐贈給 Apache 軟體基金會,現已發展成為一種廣泛採用的大數據分析工具,特別是在處理跨複雜管道的數萬億條記錄的環境中。
該平台以將 OLAP 效能與分散式系統的規模相結合而聞名。它彌合了複雜、大規模資料儲存與現代商業智慧工具的速度要求之間的差距,從而能夠根據更新的資料做出更快的決策。
在本教程中,我們將探索 Kylin 脫穎而出的核心功能,介紹其架構,並了解它如何改變大數據分析領域的遊戲規則。讓我們開始吧!
2. 理解 Apache Kylin 的核心能力
讓我們先看看 Apache Kylin 的優點。
Apache Kylin即使在操作跨越數萬億行的資料集時也能提供亞秒延遲。這是因為它大量使用預先計算的資料模型和最佳化索引。當性能和速度至關重要時,Kylin 就會脫穎而出。
同樣,Kylin 也能輕鬆處理高併發。無論系統是同時處理數百個查詢還是執行大量聚合,底層架構都是可擴展的,不會成為瓶頸。
Kylin 的另一個優點是其統一的大資料倉儲架構。它與 Hadoop 生態系統和資料湖平台原生集成,非常適合已經投資分散式儲存的組織。對於視覺化和業務報告,Kylin 與 Tableau、Superset 和 Power BI 等工具無縫整合。它公開了查詢接口,使我們無需了解底層的複雜性即可探索資料。
此外,如果我們正在尋找可用於生產的功能,Kylin 提供了強大的安全性、元資料管理和多租戶功能,使其適合大規模企業使用。麒麟的表現並非只是運氣;它的組件都是使用多維建模、智慧索引和高效的資料載入管道從頭開始設計的。
讓我們仔細看看這些元素如何為其功能做出貢獻。
2.1.多維建模與模型的作用
Kylin 的核心是其資料模型,該模型使用星型或雪花型模式構建,以定義底層資料表之間的關係。在這個結構中,我們定義維度,也就是我們想要分析的觀點或類別(如區域、產品或時間)。與之一起的是衡量指標和總數值,例如總銷售額或平均價格。
類似地, Kylin 還支援計算列,這使得我們使用表達式或轉換來定義新字段,這對於標準化日期格式或建立派生屬性很有用。它在模型定義階段處理連接,使 Kylin 能夠理解關係並相應地優化模型。
模型一旦建立,就成為索引建立和資料載入的基礎。
2.2.索引設計與預計算(CUBE)
為了實現其速度,Kylin 嚴重依賴預計算。它根據模型維度和度量提前建立聚合資料的索引(也稱為 CUBE)。 Kylin 中主要有兩種類型的索引:
透過預先計算可能的組合併有效地儲存它們,Kylin 避免了在查詢時掃描原始資料的需要。即使對於複雜的分析查詢,這也大大減少了延遲。
值得注意的是,索引設計至關重要。索引越有針對性、越高效,查詢時消耗的儲存和處理能力就越少。
2.3.資料載入過程
一旦模型和索引到位,我們就需要載入資料。 Kylin 中的資料載入涉及建立 CUBE 並使用預先計算的結果填充它們。
傳統上,這是使用離線資料以批次模式完成的。 Kylin 從來源表(通常是 HDFS 中的 Hive 或 Parquet 檔案)讀取數據,並將資料處理到其索引結構中。
此外,也支援 Apache Kafka 等串流媒體來源,實現近乎即時的提取和分析。這使得在混合批流場景中使用 Kylin 成為可能,而無需改變分析層。
重要的是,一旦我們加載數據,查詢就會針對預先建立的索引而不是原始數據集運行,無論底層容量如何,都能提供一致且可預測的效能。
3. 如何在 Docker 中執行 Apache Kylin
探索 Apache Kylin 的最快方法是將其放入 Docker 容器中。如果我們想在本地測試新功能或評估最新版本,這是完美的選擇。
讓我們來看一個docker run
指令來開始使用 Apache Kylin:
$ docker run -d \
--name Kylin5-Machine \
--hostname localhost \
-e TZ=UTC \
-m 10G \
-p 7070:7070 \
-p 8088:8088 \
-p 9870:9870 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
apachekylin/apache-kylin-standalone:5.0.0-GA
在這裡,我們拉取 5.0 版本的獨立鏡像並啟動它。我們將 Apache Kylin 5.0 作為獨立容器推出,並公開一些常用連接埠以便於存取:
-
–name
:為容器指派名稱 -
–hostname
:設定容器的主機名稱(有助於內部引用) -
-e TZ=UTC
:將時區設定為 UTC -
-m 10G
:將容器的記憶體使用量限制為 10 GB(建議為容器分配至少 10 GB 記憶體以獲得更流暢的體驗) -
-p
選項:將容器中必要的 Kylin 和 Hadoop 相關服務連接埠對應到主機 -
apachekylin/apache-kylin-standalone:5.0.0-GA
:鏡像,包含捆綁在一起的所有必要服務
雖然docker run
命令本身不會產生容器 ID 以外的輸出,但我們可以使用docker ps
驗證它是否正在運行:
$ docker ps --filter name=Kylin5-Machine
CONTAINER ID IMAGE STATUS PORTS NAMES
abc123456789 apachekylin/apache-kylin-standalone:5.0.0-GA Up 10 seconds 0.0.0.0:7070->7070/tcp, ... Kylin5-Machine
一旦我們確定容器已啟動,我們就可以透過http://localhost:7070
存取 Kylin Web UI 並開始探索。此設定為我們提供了在獨立環境中建立模型和探索資料集所需的一切。
3.1.驗證 Kylin 實例
一旦容器運行,我們可以透過curl
使用簡單的健康檢查來驗證實例:
$ curl http://localhost:7070/kylin/api/system/health
如果一切正常,我們應該會看到指示伺服器狀態為UP
回應:
{
"status": "UP",
"storage": {
"status": "UP"
},
"metadata": {
"status": "UP"
},
"query": {
"status": "UP"
}
}
這確認 Kylin 的內部服務、元資料、查詢引擎和儲存正在運行並準備好接受操作。
3.2.存取 Kylin Web 介面
Kylin UI 將在http://localhost:7070
上提供。我們可以使用預設憑證登入:
Username: ADMIN
Password: KYLIN
一旦啟動,Kylin 的 Web 介面還可以透過其他連接埠存取 Spark 和 Hadoop UI 元件。
從這裡,我們可以建立一個項目,上傳一個資料模型,並開始建立 CUBE。該介面還包括管理元資料、監控建置作業和互動測試 SQL 查詢的部分。
4. 如何使用 SQL 在 Apache Kylin 中定義模型並建立 CUBE
使用 Kylin,我們還可以使用純 SQL 和 REST API 定義模型並啟動 CUBE 建置。這使得流程更清潔、更自動化,並且非常適合開發密集環境。讓我們來看一下。
4.1.將表格載入到 Kylin
假設來源表sales_data
存在於 Hive 或類似目錄中,我們先告知 Kylin。
為此,我們可以透過curl
向/tables
API 發出 POST 請求:
$ curl -X POST http://localhost:7070/kylin/api/tables/default.sales_data \
-H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
-d '{"project":"sales_analytics"}'
在這裡,我們將來源表sales_data
註冊到 sales_analytics 專案中。這告訴 Kylin 從配置的目錄(如 Hive 或 JDBC)中提取sales_data
表的元資料。讓我們來看一個範例輸出:
{
"uuid": "fcbe5a9a-xxxx-xxxx-xxxx-87d8c1e6b2c5",
"database": "default",
"name": "sales_data",
"project": "sales_analytics"
}
我們可以看到,一旦註冊,就可以用於模型創建。
4.2.從 SQL 建立模型
事情從這裡開始變得有趣。我們現在可以使用 SQL 語句定義模型,Kylin 會自動推斷維度、測量和連結。
讓我們來看一個範例 SQL:
SELECT
order_id,
product_id,
region,
order_date,
SUM(order_amount) AS total_sales
FROM sales_data
GROUP BY order_id, product_id, region, order_date
這告訴 Kylin 尺寸和尺寸是多少。
現在,讓我們透過 API 將此 SQL 傳送給 Kylin 的建模引擎:
$ curl -X POST http://localhost:7070/kylin/api/models/sql \
-H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
-H "Content-Type: application/json" \
-d '{
"project": "sales_analytics",
"modelName": "sales_cube_model",
"sql": "SELECT order_id, product_id, region, order_date, SUM(order_amount) AS total_sales FROM sales_data GROUP BY order_id, product_id, region, order_date"
}'
如果請求成功,Kylin 會建立一個包含所有提到的欄位的新模型,以及對order_amount
的基本聚合:
{
"model_id": "sales_cube_model",
"status": "ONLINE",
"fact_table": "sales_data",
"dimensions": ["order_id", "product_id", "region", "order_date"],
"measures": ["SUM(order_amount)"]
}
在這裡,透過直接從 SQL 推斷元數據,創建了一個新模型sales_cube_model,
。它會自動將分組欄位標記為維度,並將聚合應用為度量。
4.3.觸發 CUBE 建置作業
一旦模型建立完成,我們就可以觸發建置作業來實現索引。
首先,我們取得模型的 ID(或名稱),然後發送建置請求:
$ curl -X PUT http://localhost:7070/kylin/api/jobs \
-H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
-H "Content-Type: application/json" \
-d '{
"model_name": "sales_cube_model",
"project": "sales_analytics",
"build_type": "BUILD",
"start_time": 0,
"end_time": 2000000000000
}'
執行此命令後,Kylin 開始使用預設聚合組建立 CUBE,並輸出狀態:
{
"uuid": "job_3f23c498-xxxx-xxxx-xxxx-9eab1a66f79c",
"status": "PENDING",
"exec_start_time": 1711700000000,
"model_name": "sales_cube_model"
}
這將為模型安排完整的 CUBE 建置(涵蓋所有時間範圍)。 Kylin 預先計算模型中定義的聚合。這裡的時間戳範圍很廣,非常適合完整建造。
4.4.監控建置狀態
為了監控建置狀態,我們可以隨時使用作業 API 檢查建置作業的狀態:
$ curl -X GET "http://localhost:7070/kylin/api/jobs?projectName=sales_analytics" \
-H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)"
[
{
"job_status": "FINISHED",
"model_name": "sales_cube_model",
"duration": 52300,
"last_modified": 1711700150000
}
]
回應顯示作業階段、狀態、持續時間以及建置是否成功。一旦達到“ job_status”: “FINISHED
”,我們就可以進行查詢了。
值得注意的是,Kylin 支援基於查詢模式的索引修剪。經過幾次查詢後,我們可以在 API 中檢查索引使用情況統計資料。我們可能會發現某些維度很少一起使用,並且從索引定義中修剪這些組合可以改善構建時間並減少存儲,而不會影響查詢覆蓋率。
簡而言之,我們已經完全建模了資料集,定義了聚合,並具體化了 CUBE 。我們現在可以查詢下一步,甚至可以將此流程作為 CI/CD 分析管道的一部分自動化。對於重複的資料加載,我們可以使用 cron 作業或 CI 管道自動化 CUBE 建置流程。 Kylin 的 REST API 是腳本友好的,因此很容易在午夜、每小時或新資料進入來源系統時觸發建置。
5. 結論
在本文中,我們探索了 Apache Kylin,這是一個專為大數據分析中的極端規模和效能而建構的工具。它將 OLAP 建模的強大功能與分散式運算相結合,可在海量資料集上提供快速、可靠的洞察。
該平台具有重要的元件和功能,引入了串流支援、原生運算引擎、自動建模和更智慧的元資料處理。這些變化使其更易於接受、效能更高、更符合現代資料架構。
無論我們是在建立儀表板、支援即時指標還是實現資料存取民主化,Kylin 都能提供工具來大規模、快速地完成這些工作。