Apache kylin 入門學習 (1)kylin簡單認識

一kylin框架

Apache Kylin™是一個開源的分佈式分析引擎,提供Hadoop/Spark之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據,最初由eBay Inc. 開發並貢獻至開源社區。它能在亞秒內查詢巨大的Hive表。
在這裏插入圖片描述
以Hive或者Kafka作爲數據源,裏面保存着真實表,而Kylin做的就是將數據進行抽象,通過引擎實現Cube的構建。
將Hbase作爲數據的倉庫,存放Cube。因爲Hbase的直接讀取比較複雜,所以Kylin提供了近似SQL和HQL的形式,滿足了數據讀取的基本需求。對外提供了RestApi和JDBC/ODBC方便操作。

在這裏插入圖片描述

kylin解決什麼問題

Kylin的使命是超高速的大數據OLAP(Online Analytical Processing)也就是要讓大數據分析像使用數據庫一樣簡單迅速,用戶的查詢請求可以在秒內返回,交互式數據分析將以前所未有的速度釋放大數據裏潛藏的知識和信息,讓我們在面對未來的挑戰時佔得先機。

kylin如何解決

簡單來說,Kylin的核心思想是預計算,即對多維分析可能用到的度量進行預計算,將計算好的結果保存成Cube,供查詢時直接訪問。把高複雜度的聚合運算、多表連接等操作轉換成對預計算結果的查詢,這決定了Kylin能夠擁有很好的快速查詢和高併發能力。
預加載:
應儘量多地預先計算聚合結果,在查詢時刻應儘量使用預算的結果得出查詢結
果,從而避免直接掃描可能無限增長的原始記錄。

cube:

在這裏插入圖片描述

這張圖是Cube的一種便於觀察的展現方式.
三個維度,依次是時間、產品、地點。維度線上面,就是維度值。度量是上面的小塊塊。

可以清楚的看到,圖形內確定了三個維度,一定可以獲取到一個小方塊。這個小方塊就是最後我們想要的值。這就是Cube的核心。

根據公開數據顯示,Kylin的查詢性能不只是針對個別SQL,而是對上萬種SQL 的平均表現,生產環境下90%ile查詢能夠在在3s內返回。在上個月舉辦的Apache Kylin Meetup中,來自美團、京東、百度等互聯網公司分享了他們的使用情況。例如,在京東雲海的案例中,單個Cube最大有8個維度,最大數據條數4億,最大存儲空間800G,30個Cube共佔存儲空間4T左右。查詢性能上,當QPS在50左右,所有查詢平均在200ms以內,當QPS在200左右,平均響應時間在1s以內。

維度與度量

維度和度量是數據分析中的兩個基本概念。

維度代表着我們審視數據的角度
通常是數據記錄的一個屬性,時間是一種維度,地點是一種維度,狀態是一種維度。
維度就是觀察數據的角度。比如電商的銷售數據,可以從
時間的維度來觀察(如圖1-2的左側所示),也可以進一步細化,從時間和
地區的維度來觀察(如圖1-2的右側所示)。維度一般是一組離散的值,比
如時間維度上的每一個獨立的日期,或者商品維度上的每一件獨立的商
品。因此統計時可以把維度值相同的記錄聚合在一起,然後應用聚合函
數做累加、平均、去重複計數等聚合計算。

在這裏插入圖片描述
度量代表着基於數據所計算出來的考量值
通常是一個數值,比如這個月份的銷售額,購買某產品的客戶量。
所謂的數據分析,就是要結合若干維度去審查度量值,找到其中變化的規律。
度量就是被聚合的統計值,也是聚合運算的結果,它一般是連續的
值,如圖1-2中的銷售額,抑或是銷售商品的總件數。通過比較和測算度
量,分析師可以對數據進行評估,比如今年的銷售額相比去年有多大的
增長,增長的速度是否達到預期,不同商品類別的增長比例是否合理等。

事實表與維度表

事實表是儲存有事實記錄的表,例如日誌就是一種事實表,它一般在不斷的動態增長,所以它的體積通常很大。
維度表是對應事實表的一種體現,保存了維度值,可以關聯上事實表,相當於把事實表精細處理,然後生成的一張表。
如果事實表過於龐大笨重,可以考慮使用維度表。
舉例:我可以把一張事實表,拆開,生成兩種表,一張日期表,日期表裏面存儲着日期對應的周、月、季度、年等時間屬性。一張地點表,地點表裏包含着國家、省、城市等屬性。優點就是將事實表進行瘦身,便於維度的管理和維護,不至於破壞事實表。減少了工作量,大多數是重複的查詢工作。

Cube和Cuboid

有了維度和度量,一個數據表或數據模型上的所有字段就可以分類
了,它們要麼是維度,要麼是度量(可以被聚合)。於是就有了根據維度和
度量做預計算的Cube理論。
給定一個數據模型,我們可以對其上的所有維度進行組合。對於N個
維度來說,組合的所有可能性共有2N 種。對於每一種維度的組合,將度
量做聚合運算,然後將運算的結果保存爲一個物化視圖,稱爲Cuboid。所
有維度組合的Cuboid作爲一個整體,被稱爲Cube。所以簡單來說,一個
Cube就是許多按維度聚合的物化視圖的集合。
一個cube就是一個Hive表的數據按照指定維度與指標計算出的所有組合結果。

其中每一種維度組合稱爲cuboid,一個cuboid包含一種具體維度組合下所有指標的值。

如下圖,整個立方體稱爲1個cube,立方體中每個網格點稱爲1個cuboid,圖中(A,B,C,D)和(A,D)都是cuboid,特別的,(A,B,C,D)稱爲Base cuboid。cube的計算過程是逐層計算的,首先計算Base cuboid,然後計算維度數依次減少,逐層向下計算每層的cuboid。
在這裏插入圖片描述

簡單的說Cuboid的維度會映射爲HBase的Rowkey,Cuboid的指標會映射爲HBase的Value。如下圖所示:
在這裏插入圖片描述
如上圖原始表所示:Hive表有兩個維度列year和city,有一個指標列price。

如上圖預聚合表所示:我們具體要計算的是year和city這兩個維度所有維度組合(即4個cuboid)下的sum(priece)指標,這個指標的具體計算過程就是由MapReduce完成的。

如上圖字典編碼所示:爲了節省存儲資源,Kylin對維度值進行了字典編碼。圖中將beijing和shanghai依次編碼爲0和1。

如上圖HBase KV存儲所示:在計算cuboid過程中,會將Hive表的數據轉化爲HBase的KV形式。Rowkey的具體格式是cuboid id + 具體的維度值(最新的Rowkey中爲了併發查詢還加入了ShardKey),以預聚合表內容的第2行爲例,其維度組合是(year,city),所以cuboid id就是00000011,cuboid是8位,具體維度值是1994和shanghai,所以編碼後的維度值對應上圖的字典編碼也是11,所以HBase的Rowkey就是0000001111,對應的HBase Value就是sum(priece)的具體值。

所有的cuboid計算完成後,會將cuboid轉化爲HBase的KeyValue格式生成HBase的HFile,最後將HFile load進cube對應的HBase表中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章