Hadoop中新型大數據查詢引擎:Apache Calcite
Apache Calcite是面向Hadoop新的查詢引擎,它提供了標準的SQL語言、多種查詢優化和連接各種數據源的能力,除此之外,Calcite還提供了OLAP和流處理的查詢引擎。正是有了這些諸多特性,Calcite項目在Hadoop中越來越引入注目,并被眾多項目集成。
Calcite之前的名稱叫做optiq,optiq起初在Hive項目中,為Hive提供基于成本模型的優化,即CBO(Cost Based Optimizatio)。2014年5月optiq獨立出來,成為Apache社區的孵化項目,2014年9月正式更名為Calcite。Calcite項目的創建者是Julian Hyde, 他在數據平臺上有非常多的工作經歷,曾經是Oracle、 Broadbase公司SQL引擎的主要開發者、SQLStream公司的創始人和主架構師、Pentaho BI套件中OLAP部分的架構師和主要開發者。現在他在Hortonworks公司負責Calcite項目,其工作經歷對Calcite項目有很大的幫 助。除了Hortonworks,該項目的代碼提交者還有MapR、Salesforce等公司,并且還在不斷壯大。
Calcite的目標是“one size fits all(一種方案適應所有需求場景)”,希望能為不同計算平臺和數據源提供統一的查詢引擎,并以類似傳統數據庫的訪問方式(SQL和高級查詢優化)來訪問Hadoop上的數據。
Apache Calcite具有以下幾個技術特性:
- 支持標準SQL語言;
- 獨立于編程語言和數據源,可以支持不同的前端和后端;
- 支持關系代數、可定制的邏輯規劃規則和基于成本模型優化的查詢引擎;
- 支持物化視圖(materialized view)的管理(創建、丟棄、持久化和自動識別);
- 基于物化視圖的Lattice和Tile機制,以應用于OLAP分析;
- 支持對流數據的查詢。
下面對其中的一些特性更詳細的介紹。
基于關系代數的查詢引擎
我們知道,關系代數是關系型數據庫操作的理論基礎,關系代數支持并、差、笛卡爾積、投影和選擇等基本運算。關系代數是Calcite的核心,任何一個查詢都可以表示成由關系運算符組成的樹。 你可以將SQL轉換成關系代數,或者通過Calcite提供的API直接創建它。比如下面這段SQL查詢:
SELECT deptno, count(*) AS c, sum(sal) AS s FROM emp GROUP BY deptno HAVING count(*) > 10
可以表達成如下的關系表達式語法樹:
LogicalFilter(condition=[>($1, 10)]) LogicalAggregate(group=[{7}], C=[COUNT()], S=[SUM($5)]) LogicalTableScan(table=[[scott, EMP]])
當上層編程語言,如SQL轉換為關系表達式后,就會被送到Calcite的邏輯規劃器進行規則匹配。在這個過程中,Calcite查詢引擎會循環使 用規劃規則對關系表達式語法樹的節點和子圖進行優化。這種優化過程會以一個成本模型作為參考,每次優化都在保證語義的情況下利用規則來降低成本,成本主要 以查詢時間最快、資源消耗最少這些維度去度量。
使用邏輯規劃規則等同于數學恒等式變換,比如將一個過濾器推到內連接(inner join)輸入的內部執行,當然使用這個規則的前提是過濾器不會引用內連接輸入之外的數據列。圖1就是一個將Filter操作下推到Join下面的示例, 這樣做的好處是減少Join操作記錄的數量。
圖1:一個邏輯規劃的規則匹配(Filter操作下沉)
非常好的一點是Calcite中的查詢引擎是可以定制和擴展的,你可以自定義關系運算符、規劃規則、成本模型和相關的統計,從而應用到不同需求的場景。
動態的數據管理系統
Calcite的設計目標是成為動態的數據管理系統,所以在具有很多特性的同時,它也舍棄了一些功能,比如數據存儲、處理數據的算法和元數據倉庫。由于舍棄了這些功能,Calcite可以在應用和數據存儲、數據處理引擎之間很好地扮演中介的角色。用Calcite創建數據庫非常靈活,你只需要動態地添加數據即可。
同時,前面提到過,Calcite使用了基于關系代數的查詢引擎,聚焦在關系代數的語法分析和查詢邏輯的規劃制定上。它不受上層編程語言的 限制,前端可以使用SQL、Pig、Cascading或者Scalding,只要通過Calcite提供的API將它們轉化成關系代數的抽象語法樹即 可。
同時,Calcite也不涉及物理規劃層,它通過擴展適配器來連接多種后端的數據源和處理引擎,如Spark、Splunk、HBase、Cassandra或者MangoDB。簡單的說,這種架構就是“一種查詢引擎,連接多種前端和后端”。
物化視圖的應用
Calcite的物化視圖是從傳統的關系型數據庫系統(Oracle/DB2/Teradata/SQL server)借鑒而來,傳統概念上,一個物化視圖包含一個SQL查詢和這個查詢所生成的數據表。
下面是在Hive中創建物化視圖的一個例子,它按部門、性別統計出相應的員工數量和工資總額:
CREATE MATERIALIZED VIEW emp_summary AS SELECT deptno, gender, COUNT(*) AS c, SUM(salary) AS s FROM emp GROUP BY deptno, gender; ;
因為物化視圖本質上也是一個數據表,所以你可以直接查詢它,比如下面這個例子查詢男員工人數大于20的部門:
SELECT deptno FROM emp_summary WHERE gender = ‘M’ AND c > 20;
更重要的是,你還可以通過物化視圖的查詢取代對相關數據表的查詢,可參見圖2。由于物化視圖一般存儲在內存中,且其數據更接近于最終結果,所以查詢速度會大大加快。
圖2:查詢、物化視圖和表的關系
比如下面這個對員工表(emp)的查詢(女性的平均工資):
SELECT deptno, AVG(salary) AS average_sal FROM emp WHERE gender = 'F' GROUP BY deptno;
可以被Calcite規劃器改寫成對物化視圖(emp_summary)的查詢:
SELECT deptno, s / c AS average_sal FROM emp_summary WHERE gender = 'F' GROUP BY deptno;
我們可以看到,多數值的平均運算,即先累加再除法轉化成了單個除法。
為了讓物化視圖可以被所有編程語言訪問,需要將其轉化為與語言無關的關系代數并將其元數據保存在Hive的HCatalog中。HCatalog可以獨立于Hive,被其它查詢引擎使用,它負責Hadoop元數據和表的管理。
物化視圖可以進一步擴展為DIMMQ(Discardable, In-Memory, Materialized Query)。 簡單地說,DIMMQ就是內存中可丟棄的物化視圖,它是高級別的緩存。相對原始數據,它離查詢結果更近,所占空間更小,并可以被多個應用共享,并且應用不 必感知物化視圖存在,查詢引擎會自動匹配它。物化視圖可以和異構存儲結合起來,即它可以存儲在Disk、SSD或者內存中,并根據數據的熱度進行動態調 整。
除了上面例子中的歸納表(員工工資、員工數量),物化視圖還可以應用在其它地方,比如b-tree索引(使用基礎的排序投影運算)、分區表和遠端快照。總之,通過使用物化視圖,應用程序可以設計自己的派生數據結構,并使其被系統自動識別和使用。
在線分析處理(OLAP)
為了加速在線分析處理,除了物化視圖,Calcite還引入Lattice(格子)和Tile(瓷片)的概念。Lattice可以看做是在星模式(star schema)數 據模型下對物化視圖的推薦、創建和識別的機制。這種推薦可以根據查詢的頻次統計,也可以基于某些分析維度的重要等級。Tile則是Lattice中的一個 邏輯的物化視圖,它可以通過三種方法來實體化:1)在lattice中聲明;2)通過推薦算法實現;3)在響應查詢時創建。
下圖是Lattice和Tile的一個圖例,這個OLAP分析涉及五個維度的數據:郵政編碼、州、性別、年和月。每個橢圓代表一個Tile,黑色橢圓是實體化后物化視圖,橢圓中的數字代表該物化視圖對應的記錄數。
圖3:Lattice和Tile的示例圖
由于Calcite可以很好地支持物化視圖和星模式這些OLAP分析的關鍵特性,所以Apache基金會的Kylin項目(Hadoop上OLAP系統)在選用查詢引擎時就直接集成了Calcite。
支持流查詢
Calcite對其SQL和關系代數進行了擴展以支持流查詢。Calcite的SQL語言是標準SQL的擴展,而不是類SQL(SQL-like),這個差別非常重要,因為:
- 如果你懂標準SQL,那么流的SQL也會非常容易學;
- 因為在流和表上使用相同的機制,語義會很清楚;
- 你可以寫同時對流和表結合的查詢語句;
- 很多工具可以直接生成標準的SQL。
Calcite的流查詢除了支持排序、聚合、過濾等常用操作和子查詢外,也支持各種窗口操作,比如翻滾窗口(Tumbling window)、跳躍窗口(Hopping window)、滑動窗口(Sliding windows)、級聯窗口(Cascading window)。其中級聯窗口可以看作是滑動窗口和翻滾窗口的結合。
總結
Calcite是一種動態數據管理系統,它具有標準SQL、連接不同前端和后端、可定制的邏輯規劃器、物化視圖、多維數據分析和流查詢等諸多能力, 使其成為大數據領域中非常有吸引力的查詢引擎,目前它已經或被規劃集成到Hadoop的諸多項目中,比如Lingual (Cascading項目的SQL接口)、Apache Drill、Apache Hive、Apache Kylin、Apache Phoenix、Apache Samza和Apache Flink。
來自:http://www.infoq.com/cn/articles/new-big-data-hadoop-query-engine-apache-calcite