概述
kylin是一個多維度分析處理(MOLAP)系統(tǒng),用java語言編寫。它能提供交互式SQL秒級內(nèi)巨大的Hive表分析查詢。
簡單的來說Kylin的核心思想就是預計算,即對多維分析可能用到的度量進行預計算,將計算好的結(jié)果封裝成Cube,存于hbase中,供查詢時直接訪問。把高復雜度的聚合運算、多表連接等操作轉(zhuǎn)換成對預計算結(jié)果的查詢,這決定了Kylin能夠擁有很好的快速查詢和高并發(fā)能力。
之后Kylin就可以將標準的SQL查詢,轉(zhuǎn)換成對HBase的Scan,快速查到結(jié)果返回給請求方。
理論基礎(chǔ)是:以空間換時間,需要大量的存儲空間(原數(shù)據(jù)量的10+倍),因此壓縮在Kylin的使用過程中尤為重要。(測試snappy)
例如:
select sum(dim1), count(dim2) from table where dim1 = 'd1' and dim2 = 'd2';
在這個SQL在hive中會走入MapReduce,而在Kylin中,Kylin會通過預計算把where 條件下sum(dim1)和count(dim2)的結(jié)果緩存在cube中,所當在kylin中執(zhí)行這個SQL的時候,直接查詢緩存,所以會在秒級以內(nèi)的到結(jié)果。
依賴
在默認配置下,Kylin依賴于Hadoop,Hive,Hbase。?
它的預計算過程也就是cube的構(gòu)建過程,在默認情況下,bulid cube是對hive表里面的數(shù)
據(jù)根據(jù)不同的緯度組合聚合度量構(gòu)建cube,計算好的cube以 K? V 的形式保存在Hbase中。
Cube的計算過程默認使用MapReduce計算。? ?
Kylin的元數(shù)據(jù)默認保存在Hbase中。
提供一個web的操作界面,用戶可以在web上進行cube的構(gòu)建和SQL查詢。
核心概念
表(Table ):表定義在hive中,是數(shù)據(jù)立方體(Data cube)的數(shù)據(jù)源,在build cube 之前,必須同步在kylin中。
模型(model):模型描述了一個星型模式的數(shù)據(jù)結(jié)構(gòu),它定義了一個事實表(Fact Table)和多個查找表(Lookup Table)的連接和過濾關(guān)系。
立方體(Cube):
? ? 是一個抽象概念,cube是所有的dimensions組合。它定義了使用的模型、模型中的表的維度(dimension)、度量(measure ,一般指聚合函數(shù),如:sum、count等)、如何對段分區(qū)( segments partition)、合并段(segments auto-merge)等的規(guī)則。
立方體段(Cube Segment):
? ? ? 它是立方體構(gòu)建(build)后的數(shù)據(jù)載體,一個cube中可以包含多個segment,每一個segment對應著一個物理cuboid,Cuboid上的數(shù)據(jù)是原始數(shù)據(jù)聚合的數(shù)據(jù),一個 segment 映射hbase中的一張表。
作業(yè)(Job):對立方體實例發(fā)出構(gòu)建(build)請求后,會產(chǎn)生一個作業(yè)。該作業(yè)記錄了立方體實例build時的每一步任務信息。作業(yè)的狀態(tài)信息反映構(gòu)建立方體實例的結(jié)果信息。如作業(yè)執(zhí)行的狀態(tài)信息為RUNNING 時,表明立方體實例正在被構(gòu)建;若作業(yè)狀態(tài)信息為FINISHED ,表明立方體實例構(gòu)建成功;若作業(yè)狀態(tài)信息為ERROR ,表明立方體實例構(gòu)建失敗!

cuboid 其以鍵-值對的形式進行保存可以理解成select measure1, measure2 from table where dim1 = 'd1' and dim2 = 'd2'; key是d1和d2編碼之后的組合,value就是measure1和measure2。
特別的:kylin提供了增量cube的接口,用戶定義根據(jù)某一個字段進行增量(目前僅支持時間,并且這個字段必須是hive的一個分區(qū)字段),在使用的時候首先需要定義好cube的定義,可以指定一個時間的partition字段作為增量cube的依賴字段,其實這個選擇是作為原始數(shù)據(jù)選擇的條件,例如選擇起始時間A到B的數(shù)據(jù)那么創(chuàng)建的cube則會只包含這個時間段的數(shù)據(jù)聚合值,創(chuàng)建完一個cube之后可以再次基于以前的cube進行build,每次build會生成一個新的segment,kylin的實現(xiàn)是一個cube(這里是指邏輯上的cube)中可以包含多個segment,每一個segment對應著一個物理cuboid,在實際存儲上對應著一個hbase的一個表。
當segment存在過多的時候查詢效率就會下降,因此需要在存在多個segment的時候?qū)⑺鼈冞M行合并,合并的時候其實是指定了一個時間區(qū)間,內(nèi)部會選擇這個時間區(qū)間內(nèi)的所有segment進行合并,合并完成之后使用新的segment替換被合并的多個segment,合并的執(zhí)行時非常迅速的,數(shù)據(jù)不需要再從HDFS中獲取,直接將兩個hbase表中相同key的數(shù)據(jù)進行聚合就可以了。但是有一點需要注意的是當合并完成之后,被合并的幾個segment所對應的hbase表并沒有被刪除。實際的使用過程中對于增量的cube可以寫個定時任務每天凌晨進行build,當達到一個數(shù)目之后進行merge(其實每次build完成之后都進行merge也應該是可以的)。
關(guān)鍵流程
Bulid Cube
cube的構(gòu)造首先需要創(chuàng)建一個cube的定義,包括設(shè)置cube名、cube的星狀模型結(jié)構(gòu),dimension信息、measure信息、設(shè)置過濾條件(用于對表中的數(shù)據(jù)進行過濾)、根據(jù)hive中事實表定義的partition設(shè)置增量cube,設(shè)置rowkey等信息,一個cube包含一些dimension和measure,主要的步驟可以按照順序分為5個階段:
1、根據(jù)Cube定義的事實表以及維度表,利用Hive創(chuàng)建一張寬表;
2、抽取事實表上的維度的distinct值,將事實表上的維度以字典樹方式壓縮編碼成目錄,將維度表以字典樹的方式編碼;
3、利用MapReduce從第一步得到的寬表文件作為輸入,創(chuàng)建 N-Dimension cuboid,然后每次根據(jù)前一步的結(jié)果串行生成 N-1 cuboid, N-2 cuboid … 0-Cuboid;
4、根據(jù)cuboid文件生成htable;
5、更新cube信息,回收臨時文件。
SQL分析查詢
kylin會把原來對hive表的查詢分析轉(zhuǎn)化為對cube? key-value的查詢分析,查詢的時候從存儲在Hbase的segment表(每一個segment對應著一個htable)獲取數(shù)據(jù),其實理論上就相當SQL解析完成后,從Hbase中讀取數(shù)據(jù),中間Kylin主要完成如何確定從Hbase中的哪些表讀數(shù)據(jù),如何讀取數(shù)據(jù),以及解析數(shù)據(jù)的格式。
對于select measure1, measure2 from table where dim1 = 'd1' and dim2 = 'd2'; key是d1和d2編碼之后的組合,value就是measure1和measure2.轉(zhuǎn)化成key-value的查詢,可以理解成查詢緯度 d1 和 d2 的 measure2 和 measure1的值,
RestServer把接受來自第三方的SQL請求,然后SQL會被傳遞到底層負責解析SQL,把SQL轉(zhuǎn)化成cube的key-value的查詢,如果是預計算好的則在秒級以內(nèi)就會有結(jié)果。如果是未計算好的則會走Hive查詢,和原生Hive job沒啥區(qū)別。延遲較大。
架構(gòu)


REST Server:?
REST Server是一套面向應用程序開發(fā)的入口點,旨在實現(xiàn)針對Kylin平臺的應用開發(fā)工作。 此類應用程序可以提供查詢、獲取結(jié)果、觸發(fā)cube構(gòu)建任務、獲取元數(shù)據(jù)以及獲取用戶權(quán)限等等。
ODBC驅(qū)動程序:
為了支持第三方工具與應用程序——例如Tableau——我們構(gòu)建起了一套ODBC驅(qū)動程序并對其進行了開源。我們的目標是讓用戶能夠更為順暢地采用這套Kylin平臺
jdbc驅(qū)動程序:
kylin提供了jdbc的驅(qū)動,驅(qū)動的classname為org.apache.kylin.jdbc.Driver,使用 的url的前綴jdbc:kylin:,使用jdbc接口的查詢走的流程和使用RESTFul接口查詢走的內(nèi)部流程是相同的。
任務引擎(Job Engine):
這套引擎的設(shè)計目的在于處理所有離線任務,其中包括shell腳本、Java API以及Map Reduce任務等等。任務引擎對Kylin當中的全部任務加以管理與協(xié)調(diào),從而確保每一項任務都能得到切實執(zhí)行并解決其間出現(xiàn)的故障
元數(shù)據(jù)管理工具(Metadata Manager):
Kylin是一款元數(shù)據(jù)驅(qū)動型應用程序。元數(shù)據(jù)管理工具是一大關(guān)鍵性組件,用于對保存在Kylin當中的所有元數(shù)據(jù)進行管理,其中包括最為重要的cube元數(shù)據(jù)。其它全部組件的正常運作都需以元數(shù)據(jù)管理工具為基礎(chǔ),包括cube的定義,星狀模型的定義、job的信息、job的輸出信息、維度的directory信 息等等,元數(shù)據(jù)和cube都存儲在hbase中,存儲的格式是json字符串。
查詢引擎(Query Engine):
當cube準備就緒后,查詢引擎就能夠獲取并解析用戶查詢。它隨后會與系統(tǒng)中的其它組件進行交互,從而向用戶返回對應的結(jié)果,kylin使用一個開源的Calcite框架實現(xiàn)SQL的解析,相當于SQL引擎層。
Routing:
該模塊負責將解析SQL生成的執(zhí)行計劃轉(zhuǎn)換成cube緩存的查詢,cube是通過預計算緩存在hbase中,這部分查詢是可以再秒級甚至 毫秒級完成,而還有一些操作使用過查詢原始數(shù)據(jù)(存儲在hadoop上通過hive上查詢),這部分查詢的延遲比較高。
Cube構(gòu)建引擎:
這個模塊是所有模塊的基礎(chǔ),它負責預計算創(chuàng)建cube,創(chuàng)建的過程是通過
hive讀取原始數(shù)據(jù)然后通過一些mapreduce計算生成Htable然后load到hbase中
存儲引擎(Storage Engine):
這套引擎負責管理底層存儲——特別是cuboid,其以鍵-值對的形式進行保存。存儲引擎使用的是HBase——這是目前Hadoop生態(tài)系統(tǒng)當中最理想的鍵-值系統(tǒng)使用方案。Kylin還能夠通過擴展實現(xiàn)對其它鍵-值系統(tǒng)的支持,例如Redis。key是每一個維度值(經(jīng)過編碼之后的)組合成的一個二進制串,value是按照這幾個維度值聚合之后的多個值??梢岳斫獬蓅elect measure1, measure2 from table where dim1 = 'd1' and? ? ? dim2 = 'd2'; key是d1和d2編碼之后的組合,value就是measure1和measure2.