Kylin構建Cube過程詳解

来源:https://www.cnblogs.com/xiaodf/archive/2019/10/16/11685023.html
-Advertisement-
Play Games

1 前言 在使用Kylin的時候,最重要的一步就是創建cube的模型定義,即指定度量和維度以及一些附加信息,然後對cube進行build,當然我們也可以根據原始表中的某一個string欄位(這個欄位的格式必須是日期格式,表示日期的含義)設定分區欄位,這樣一個cube就可以進行多次build,每一次的 ...


1 前言

在使用Kylin的時候,最重要的一步就是創建cube的模型定義,即指定度量和維度以及一些附加信息,然後對cube進行build,當然我們也可以根據原始表中的某一個string欄位(這個欄位的格式必須是日期格式,表示日期的含義)設定分區欄位,這樣一個cube就可以進行多次build,每一次的build會生成一個segment,每一個segment對應著一個時間區間的cube,這些segment的時間區間是連續並且不重合的,對於擁有多個segment的cube可以執行merge,相當於將一個時間區間內部的segment合併成一個。下麵開始分析cube的build過程。

2 Cube示例

以手機銷售為例,表SALE記錄各手機品牌在各個國家,每年的銷售情況。表PHONE是手機品牌,表COUNTRY是國家列表,兩表通過外鍵與SALE表相關聯。這三張表就構成星型模型,其中SALE是事實表,PHONE、COUNTRY是維度表。

現在需要知道各品牌手機於2010-2012年,在中國的總銷量,那麼查詢sql為:

SELECT b.`name`, c.`NAME`, SUM(a.count)
FROM SALE AS a 
LEFT JOIN PHONE AS b ON a.`pId`=b.`id` 
LEFT JOIN COUNTRY AS c ON a.`cId`=c.`id` 
WHERE a.`time` >= 2010 AND a.`time` <= 2012 AND c.`NAME` = "中國"
GROUP BY b.`NAME`

其中時間(time), 手機品牌(b.name,後文用phone代替),國家(c.name,後文用country代替)是維度,而銷售數量(a.count)是度量。手機品牌的個數可用於表示手機品牌列的基度。各手機品牌在各年各個國家的銷量可作為一個cuboid,所有的cuboid組成一個cube,如下圖所示:

上圖展示了有3個維度的cube,每個小立方體代表一個cuboid,其中存儲的是度量列聚合後的結果,比如蘋果在中國2010年的銷量就是一個cuboid。

3 入口介紹

在kylin的web頁面上創建完成一個cube之後可以點擊action下拉框執行build或者merge操作,這兩個操作都會調用cube的rebuild介面,調用的參數包括:

  1. cube名,用於唯一標識一個cube,在當前的kylin版本中cube名是全局唯一的,而不是每一個project下唯一的;
  2. 本次構建的startTime和endTime,這兩個時間區間標識本次構建的segment的數據源只選擇這個時間範圍內的數據;對於BUILD操作而言,startTime是不需要的,因為它總是會選擇最後一個segment的結束時間作為當前segment的起始時間。
  3. buildType標識著操作的類型,可以是”BUILD”、”MERGE”和”REFRESH”。

4 構建Cube過程

Kylin中Cube的Build過程,是將所有的維度組合事先計算,存儲於HBase中,以空間換時間,HTable對應的RowKey,就是各種維度組合,指標存在Column中,這樣,將不同維度組合查詢SQL,轉換成基於RowKey的範圍掃描,然後對指標進行彙總計算,以實現快速分析查詢。整個過程如下圖所示:

主要的步驟可以按照順序分為幾個階段:

  1. 根據用戶的cube信息計算出多個cuboid文件;
  2. 根據cuboid文件生成htable;
  3. 更新cube信息;
  4. 回收臨時文件。
    每一個階段操作的輸入都需要依賴於上一步的輸出,所以這些操作全是順序執行的。下麵對這幾個階段的內容細分為11步具體講解一下:

4.1 創建Hive事實表中間表(Create Intermediate Flat Hive Table)

這一步的操作會新創建一個hive外部表,然後再根據cube中定義的星狀模型,查詢出維度和度量的值插入到新創建的表中,這個表是一個外部表,表的數據文件(存儲在HDFS)作為下一個子任務的輸入。

4.2 重新分配中間表(Redistribute Flat Hive Table)

在前面步驟,hive會在HDFS文件夾中生成數據文件,一些文件非常大,一些有些小,甚至是空的。文件分佈不平衡會導致隨後的MR作業不平衡:一些mappers作業很快執行完畢,但其它的則非常緩慢。為了平衡作業,kylin增加這一步“重新分配”數據。首先,kylin獲取到這中間表的行數,然後根據行數的數量,它會重新分配文件需要的數據量。預設情況下,kylin分配每100萬行一個文件。

4.3 提取事實表不同列值 (Extract Fact Table Distinct Columns)

在這一步是根據上一步生成的hive中間表計算出每一個出現在事實表中的維度列的distinct值,並寫入到文件中,它是啟動一個MR任務完成的,它關聯的表就是上一步創建的臨時表,如果某一個維度列的distinct值比較大,那麼可能導致MR任務執行過程中的OOM。

4.4 創建維度字典(Build Dimension Dictionary)

這一步是根據上一步生成的distinct column文件和維度表計算出所有維度的子典信息,並以字典樹的方式壓縮編碼,生成維度字典,子典是為了節約存儲而設計的。
每一個cuboid的成員是一個key-value形式存儲在hbase中,key是維度成員的組合,但是一般情況下維度是一些字元串之類的值(例如商品名),所以可以通過將每一個維度值轉換成唯一整數而減少記憶體占用,在從hbase查找出對應的key之後再根據子典獲取真正的成員值。

4.5 保存Cuboid的統計信息(Save Cuboid Statistics)

計算和統計所有的維度組合,並保存,其中,每一種維度組合,稱為一個Cuboid。理論上來說,一個N維的Cube,便有2的N次方種維度組合,參考網上的一個例子,一個Cube包含time, item, location, supplier四個維度,那麼組合(Cuboid)便有16種:

4.6 創建HTable

創建一個HTable的時候還需要考慮一下幾個事情:

  1. 列簇的設置。
  2. 每一個列簇的壓縮方式。
  3. 部署coprocessor。
  4. HTable中每一個region的大小。
    在這一步中,列簇的設置是根據用戶創建cube時候設置的,在HBase中存儲的數據key是維度成員的組合,value是對應聚合函數的結果,列簇針對的是value的,一般情況下在創建cube的時候只會設置一個列簇,該列包含所有的聚合函數的結果;
    在創建HTable時預設使用LZO壓縮,如果不支持LZO則不進行壓縮,在後面kylin的版本中支持更多的壓縮方式;
    kylin強依賴於HBase的coprocessor,所以需要在創建HTable為該表部署coprocessor,這個文件會首先上傳到HBase所在的HDFS上,然後在表的元信息中關聯,這一步很容易出現錯誤,例如coprocessor找不到了就會導致整個regionServer無法啟動,所以需要特別小心;region的劃分已經在上一步確定了,所以這裡不存在動態擴展的情況,所以kylin創建HTable使用的介面如下:
    public void createTable(final HTableDescriptor desc , byte [][] splitKeys)

4.7 用Spark引擎構建Cube(Build Cube with Spark)

在Kylin的Cube模型中,每一個cube是由多個cuboid組成的,理論上有N個普通維度的cube可以是由2的N次方個cuboid組成的,那麼我們可以計算出最底層的cuboid,也就是包含全部維度的cuboid(相當於執行一個group by全部維度列的查詢),然後在根據最底層的cuboid一層一層的向上計算,直到計算出最頂層的cuboid(相當於執行了一個不帶group by的查詢),其實這個階段kylin的執行原理就是這個樣子的,不過它需要將這些抽象成mapreduce模型,提交Spark作業執行。
使用Spark,生成每一種維度組合(Cuboid)的數據。
Build Base Cuboid Data;
Build N-Dimension Cuboid Data : 7-Dimension;
Build N-Dimension Cuboid Data : 6-Dimension;
……
Build N-Dimension Cuboid Data : 2-Dimension;
Build Cube。

4.8 將Cuboid數據轉換成HFile(Convert Cuboid Data to HFile)

創建完了HTable之後一般會通過插入介面將數據插入到表中,但是由於cuboid中的數據量巨大,頻繁的插入會對Hbase的性能有非常大的影響,所以kylin採取了首先將cuboid文件轉換成HTable格式的Hfile文件,然後在通過bulkLoad的方式將文件和HTable進行關聯,這樣可以大大降低Hbase的負載,這個過程通過一個MR任務完成。

4.9 導HFile入HBase表(Load HFile to HBase Table)

將HFile文件load到HTable中,這一步完全依賴於HBase的工具。這一步完成之後,數據已經存儲到HBase中了,key的格式由cuboid編號+每一個成員在字典樹的id組成,value可能保存在多個列組裡,包含在原始數據中按照這幾個成員進行GROUP BY計算出的度量的值。

4.10 更新Cube信息(Update Cube Info)

更新cube的狀態,其中需要更新的包括cube是否可用、以及本次構建的數據統計,包括構建完成的時間,輸入的record數目,輸入數據的大小,保存到Hbase中數據的大小等,並將這些信息持久到元資料庫中。

4.11 清理Hive中間表(Hive Cleanup)

這一步是否成功對正確性不會有任何影響,因為經過上一步之後這個segment就可以在這個cube中被查找到了,但是在整個執行過程中產生了很多的垃圾文件,其中包括:

  1. 臨時的hive表;
  2. 因為hive表是一個外部表,存儲該表的文件也需要額外刪除;
  3. fact distinct這一步將數據寫入到HDFS上為建立子典做準備,這時候也可以刪除了;
  4. rowKey統計的時候會生成一個文件,此時可以刪除;
  5. 生成HFile時文件存儲的路徑和hbase真正存儲的路徑不同,雖然load是一個remove操作,但是上層的目錄還是存在的,也需要刪除。

至此整個Build過程結束。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們使用 linux 文件系統擴展屬性,能夠對linux文件系統進行進一步保護;從而給文件 賦予一些額外的限制;在有些情況下,能夠對我們的系統提供保護; chattr命令用來改變文件屬性。這項指令可改變存放在ext2文件系統上的文件或目錄屬性,這些屬性共有以下8種模式:詳細作用,可以查看man手冊 ...
  • 導讀 第一章:初識Hadoop 第二章:更高效的WordCount 第三章:把別處的數據搞到Hadoop上 第四章:把Hadoop上的數據搞到別處去 第五章:快一點吧,我的SQL 第六章:一夫多妻制 第七章:越來越多的分析任務 第八章:我的數據要實時 第九章:我的數據要對外 第十章:牛逼高大上的機器 ...
  • 實現目標 搭建兩台MySQL伺服器(一主一從),一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。 工作流程概述 主伺服器: 開啟二進位日誌 配置唯一的server id 獲得master二進位日誌文件名及位置 創建一個用於slave和master通信的用戶賬號 從伺服器: ...
  • 什麼是索引 + 索引是對 資料庫中一列或者多列的值進行排序的一中結構 ,使用索引可以快速訪問資料庫中表的特定信息。索引的一個主要的目的就是加快檢索表中數據,亦即能協助信息搜索者儘快的找到符合限制條件的記錄的輔助數據結構。 + 簡單來說索引就是資料庫的目錄。 索引有什麼作用 索引的最大作用就是加快數據 ...
  • 1. 前言 電腦的基本工作就是處理數據,包括磁碟文件中的數據,通過網路傳輸的數據流或數據包,資料庫中的結構化數據等。隨著互聯網、物聯網等技術得到越來越廣泛的應用,數據規模不斷增加,TB、PB量級成為常態,對數據的處理已無法由單台電腦完成,而只能由多台機器共同承擔計算任務。而在分散式環境中進行大數 ...
  • Redis 是一種記憶體資料庫,將數據保存在記憶體中,讀寫效率要比傳統的將數據保存在磁碟上的資料庫要快很多。所以,監控 Redis 的記憶體消耗並瞭解 Redis 記憶體模型對高效並長期穩定使用 Redis 至關重要。 ...
  • 轉載自:https://www.cnblogs.com/vice/p/9163241.html 操作系統是Windows2008R2 ,資料庫是SQL2014 64位。 近階段伺服器出現過幾次死機,管理員反饋機器記憶體使用率100%導致機器卡死。於是做了個監測伺服器的軟體實時記錄CPU數據,幾日觀察得 ...
  • 前兩篇講了solr安裝和導入數據,這篇講如何整合到SSM中。 一、整合SSM 1.1 引入依賴 1.2 初始化solr 1.3 寫service 1.4 寫控制層 1.5 查詢 二、IK分詞器 2.1.添加jar包 下載地址:https://search.maven.org/search?q=com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...