摘 要:大數據環(huán)境下數據庫所存儲的數據量呈爆炸式增長,如何保持高吞吐率并讓客戶得到滿意的數據查詢和處理結果,已經成為一個急需解決的問題。金融、電信以及互聯網等行業(yè)要求企業(yè)的統(tǒng)計分析平臺能支持分布式、高可用性和可擴展性的分布式查詢環(huán)境,以便能及時高效的完成查詢分析任務,做出更合理的業(yè)務決策。目前已經有很多公司在一定范圍內將應用從關系數據庫向Hbase進行遷移,但是大多數都是和Hadoop MapReduce或Hive結合使用,導致數據量增加后的分布式查詢耗時過長,性能也隨之下降。此外Hbase也有其自身的局限性,不能兼容傳統(tǒng)數據庫上的SQL應用。本文在分析了現有分布式數據庫系統(tǒng)平臺并深入研究Hbase的實現原理及高級特性的基礎上,提出了基于Hbase的可擴展性查詢優(yōu)化方案(Hbase DSPE),即把Hbase的優(yōu)點和SQL的易用性結合。這樣做有助于對復雜SQL查詢的優(yōu)化,可以充分利用Hbase的諸多高級特性進行查詢性能調優(yōu),對企業(yè)在大數據環(huán)境下從傳統(tǒng)關系數據庫向大數據平臺的遷移具有現實的指導意義。
關鍵詞:大數據;分布式查詢;Hbase;SQL解析引擎;查詢優(yōu)化
中圖分類號:TP311.13
大數據(Big Data)是近年來科學研究和商業(yè)領域的新的發(fā)展方向,運用于大數據的系統(tǒng)可統(tǒng)一管理地理上分布的異構計算或存儲數據,組成功能類似于大型數據庫服務器但相對松散耦合的資源群體,用來解決海量數據的分布式存儲和查詢問題。大數據環(huán)境下分布式數據處理目前已得到廣泛應用,很多世界500強軟件公司或科研機構都在從事相關方面的研究與應用。
1 大數據環(huán)境下的分布式查詢
大數據時代的分布式查詢已經隨處可見,金融、電信及互聯網行業(yè)對大數據環(huán)境下數據庫集群的響應速度、可擴展性和查詢的整體性能都提出了更高的要求。由于大數據業(yè)務的多樣化發(fā)展,有越來越多的業(yè)務系統(tǒng)的需求開始發(fā)生了變化,所以如何提高大數據環(huán)境下的數據處理及查詢的效率,是目前新的研究方向。
1.1 研究現狀。海量數據的分布式查詢技術目前已得到廣泛應用,目前主流實現有如下三種方式:(1)傳統(tǒng)關系型數據庫分布式查詢。傳統(tǒng)關系型數據庫的分布式查詢主要存在于網絡環(huán)境中,由于數據的分布性,關系數據庫一次查詢所操縱的對象可能分布于不同的網絡節(jié)點中,由此帶來的開銷和執(zhí)行速度就會與Hbase(基于列存儲)不一樣,并且查詢優(yōu)化的所考慮的因素很復雜,節(jié)點間的通信代價和分布式處理成為不可回避的問題[1]。此外,傳統(tǒng)關系數據庫在分布式查詢時做了太多的事情,比如事務,B+索引等,導致關系數據庫本身代碼很復雜,同時對于海量數據的查詢比較慢[2]。而對于很多業(yè)務場景來說,查詢可能只用到數據庫的部分功能,卻要初始化復雜操作所要用到的代碼。所以,傳統(tǒng)關系數據庫并不適用于大數據環(huán)境下的分布式查詢。(2)Apache Hadoop Hive分布式查詢。Hadoop Hive是一種數據分析框架,可以支持通過類似SQL語句的語法來操作Hbase中的數據。大多數企業(yè)都有對結構化查詢語言(SQL)有豐富經驗的員工,Hive允許這些數據庫開發(fā)人員或者數據分析人員在無需了解Java編程語言或者Hbase API的情況下使用Hbase數據庫。但是Hive不能完全兼容現有的關系型數據庫,所以執(zhí)行SQL的速度比較慢,從而導致查詢效率不高。尤其是對于那些實時、簡單的查詢,使用Hive可能會帶來很多額外的開銷,如:查詢的初始化、變量的轉換以及其他冗余且耗時的操作。雖然目前已經有一些公司采用Hadoop Hive+Hbase對海量數據進行處理,但是實驗證明對于一些簡單的查詢Hive在沒有執(zhí)行任何實質性的查詢任務前已經有超過10秒的開銷,包括初始化,SQL解析等[2]。(3)“NoSQL”數據庫分布式查詢。“Nosql”數據庫的典型代表是Hadoop Hbase。Hbase已廣泛應用于金融及互聯網領域,支持眾多業(yè)務應用程序和金融風險管理應用程序。Hbase的數據由HDFS天然的做了數據冗余,數據的可靠高己經證明了HDFS集群的安全性,以及服務于大數據的能力。而且Hbase本身的數據讀寫服務沒有單點的限制,服務能力可以隨服務器的增長而線性增長,達到幾十上百臺的規(guī)模[3]。但是,如果用戶想遷移傳統(tǒng)數據庫到Hbase上,就必須遵循Hbase API的編碼規(guī)范。這使得程序開發(fā)人員要用Hbase來提高分布式查詢能力,必須針對Hbase開發(fā)相應的接口,從而增加了很多開發(fā)和維護的工作量。而且對于大多數從事分布式大數據處理的數據庫管理人員(DBA)來講,使用SQL這樣易于理解的語言可以使人們能夠更加輕松地使用HBase。相對于學習另一套Hbase私有API,開發(fā)人員可以使用熟悉的語言來讀寫數據[4]。
1.2 Hbase分布式數據庫框架。Hbase是一個稀疏的、分布的、持續(xù)多維度的排序映射數組,它模仿并提供了基于Google文件系統(tǒng)的Big Table數據庫的所有功能[5]。Hbase的目標是處理非常龐大的表,可以用普通的計算機處理超過10億行數據,并且有數百萬列元素組成的數據表。為了提高數據可靠性和系統(tǒng)的健壯性,Hbase使用HDFS分布式文件系統(tǒng)或者Hadoop作為其存儲基礎,其服務器體系結構遵循簡單的主從服務器架構。Hbase由一個HMaster主服務器協(xié)調一個或多個Hregion服務器組成的集群,同時也依賴于Zookeeper。在針對Hbase的應用中,涉及到角色依次為:Client,Zookeeper,HMaster,HRegionServer。他們在Hbase體系結構中各司其職并且共同提供了Hbase分布式存儲及查詢服務[6]。
1.3 基于Hbase的分布式查詢應用存在的問題。Hbase分布式數據庫數據存儲具有一定的哈希性質,非常適合處理Key/Value類型的數據以及結構稀疏的大規(guī)模數據。一次寫入多次讀取是Hbase數據庫最大的特色,而這種特色正好滿足分析系統(tǒng)的要求[7]。通過對Hbase分布式數據庫進行的性能測試和分析,我們了解到Hbase在執(zhí)行大數據量的查詢任務時提交Scan的操作耗時較長,影響到了系統(tǒng)的處理并行任務的響應時間。不管是在客戶端還是在服務器端,查詢任務初始化的時間過長導致整個實時查詢操作的響應時間增加,影響了Hbase數據庫并行處理查詢任務的能力。此外,大多數企業(yè)針對大數據應用的程序和處理邏輯都是基于傳統(tǒng)的關系數據庫上的SQL語句,所以使傳統(tǒng)數據庫在不改變其應用程序和處理邏輯的情況下遷移到大數據Hbase平臺,將是未來大數據平臺研究的一個全新的發(fā)展方向。
2 基于Hbase的大數據查詢優(yōu)化研究
Hbase本身提供的API中,只有Scan是用來查詢數據的,這使得程序開發(fā)人員要用Hbase來提高分布式查詢能力,必須針對Hbase開發(fā)相應的接口,從而增加了很多開發(fā)和維護的工作量。現有的基于Hbase的SQL解決方案(如Hive等)有很多局限性,并且當數據量變大時會遇到阻礙,查詢效率也隨之降低[8]。所以本文的研究目標就是為了兼容以前從關系型數據庫中查詢數據的接口,讓Hbase可以通過標準SQL語句來查詢Hbase表中的數據。因此,我們需要將SQL語句轉成Hbase的Scan。本文研究計劃基于Hbase重新設計并實現SQL解析引擎,即在HBase上提供SQL API接口。Hbase中有一個類似MapReduce的高級分析組件名為協(xié)處理器(Coprocessor)[9]。Hbase協(xié)處理器是一套通信框架,能夠在客戶端向RegionServer注入代碼并執(zhí)行獲取結果。本文的前期研究通過對Hbase協(xié)處理器的測試以及簡單實驗,證明這種設計方案是可以實現的。
2.1 分布式SQL解析引擎。本文對Hbase的查詢優(yōu)化研究運用SQL解析引擎技術,使目前主流的分布式數據庫Hbase支持企業(yè)現有的復雜數據庫查詢應用?;贖base的SQL解析引擎能夠為Hbase提供企業(yè)級的分布式處理能力,可以將SQL查詢任務的工作負載分配給多個分布式處理單元。同時可以將企業(yè)級分布式數據查詢引入到業(yè)務分析應用中,使得用戶可以基于Hbase分布式數據庫集群并采用SQL編程模型來處理海量數據。
Hbase數據庫對SQL解析引擎的支持主要解決部署在現有大數據平臺上的Hbase查詢應用面臨的性能瓶頸,以及傳統(tǒng)關系數據庫查詢向大數據分布式查詢平臺的遷移。主要實現步驟及功能包括:(1)基于Hbase API,研究并設計符合SQL規(guī)范的SQL解析引擎,使得應用程序開發(fā)者可以應用基于Hbase SQL解析引擎的分布式查詢達到與傳統(tǒng)關系型數據庫SQL相同的效果。(2)擴展Hbase協(xié)處理器API,使SQL解析引擎可以與Hbase實現無縫集成,以滿足變化的的查詢負載管理的要求。(3)對應用程序編程接口(API)的支持:Apache Hadoop的子項目包括Hadoop MapReduce API,Hive和Spark;利用Apache Hadoop數據訪問框架來連接分布式文件系統(tǒng)和數據庫架構,從而避免了現有數據的遷移,主要研究對HDFS,GPFS的支持。
最后,我們還將對大數據環(huán)境下基于Hbase的分布式SQL解析引擎進行性能測試及調優(yōu)。
2.2 系統(tǒng)架構設計。本文的設計將基于Hbase分布式數據庫,設計并實現SQL解析引擎,然后通過Hbase協(xié)處理器框架提供的API注入到Hbase服務器并且部署到HRegionServer上,作為Hbase數據查詢的分布式SQL解析引擎,即:Hbase Distributed SQL Parse Engine,簡稱Hbase DSPE。Hbase DSPE中包含四大核心模塊:(1)DSPE Client(客戶端):提供基于JDBC的SQL客戶端。DSPE Client部署在Hbase客戶端,其封裝了對JDBC的實現,同時將用戶的SQL進行必要的檢查,并且轉換成對Hbase友好的SQL,如包含Row Key條件的Select查詢語句。(2)DSPE Master(主服務器):提供分布式SQL解析引擎。DSPE Master部署在Hbase的HRegionServer上,可以將DSPE客戶端提交過來的SQL查詢請求進行解析,轉換為一個或多個HBase能夠識別的Scan或者Put操作(Schema轉換,SQL schema轉換為底層Hbase中數據表的Schema,通過解析SQL語句的方式實現查詢或者操作Hbase的數據)。如果是查詢請求,就利用Scan編排執(zhí)行并獲取數據,然后將獲取回來的數據再根據SQL進行過濾和計算,以生成標準的JDBC結果集,返回給客戶端。如果是其他請求,那么就將Hbase的操作結果返回給客戶端。整個SQL語句解析與執(zhí)行完成后的組裝通過Hbase協(xié)處理器實現。(3)DSPE Coprocessor(協(xié)處理器):提供DSPE和Hbase集成的API,通過Hbase協(xié)處理器實現。(4)DSPE Common Interface(通用接口):提供公共基礎類庫以及SQL節(jié)點的Java對象。DSPE Common Interface模塊也包含一些公共的基礎Bean,比如用來表征一行記錄的類(Record Class),DSPE Client和DSPE Master都會依賴其提供的類庫以及API。
圖1是HbaseDSPE中四個主要模塊的組織架構圖:
圖1 DSPE中四個模塊的組織架構圖
2.3 各模塊詳細設計:(1)DSPE客戶端。DSPE Client提供了一個客戶端可嵌入的JDBC驅動。因為實現了SQL語言查詢,客戶端可以不再使用HBase自帶的Client API,而是使用DSPE Client,從而使客戶端所需編寫的代碼量大幅度降低,同時也使Hbase API的易用性、可擴展性大大提高。DSPE Client客戶端的設計主要包含以下幾個部分:JDBC連接以及驅動開發(fā),SQL提交工具,輸入輸出的壓縮與加密,與ZooKeeper的接口等。此外,DSPE Client也會維護一些Cache來加快對Hbase的訪問(使用Hbase的HMemstore),比如HRegion的位置信息。(2)DSPE主服務器。DSPE Master(主服務器)是本設計方案的核心,其中包括DSPE的核心組件SQL解析引擎。DSPE Master的設計基于Hbase API,將DSPE Client提交過來的SQL查詢請求進行解析,轉換為一個或多個HBase能夠識別的Scan(Schema轉換,SQL Schema轉換為底層Hbase中數據表的Schema,通過解析SQL語句的方式實現Scan Hbase的數據),利用Scan編排執(zhí)行并獲取數據,然后將獲取回來的數據再根據SQL進行過濾和計算,以生成標準的JDBC結果集,返回給客戶端。整個SQL語句解析與執(zhí)行完成后的組裝通過Hbase協(xié)處理器實現。從而達到直接使用HBase API、Coprocessor協(xié)處理器與自定義過濾器以提高查詢效率。DSPE Master實現的主要功能模塊有:SQL解析引擎、SQL語法節(jié)點(對象)、多線程分布式查詢、查詢結果緩存以及對事務(Transaction)的有限支持。(3)DSPE協(xié)處理器。DSPE協(xié)處理器的實現基于Hbase 協(xié)處理器API,將DSPE Master封裝成為一個Coprocessor Observer。同時,利用Coprocessor EndPoint實現元數據(Metadata)的處理(類似于Hive中對元數據的處理,主要用來做性能調優(yōu)),并部署在Hbase的HRegionServer上來實現接收DSPE客戶端的請求。(4)DSPE通用接口。DSPE通用接口的實現主要基于Hbase公共基礎類庫API,提供DSPE需要的公共基礎類庫以及SQL節(jié)點的Java對象。DSPE Common Interface模塊也包含一些公共的基礎Bean,比如用來表征一行記錄的類(Record Class),DSPE Client和DSPE Master都會依賴其提供的類庫以及API。此外,還采用開放式架構以支持Hadoop Hbase以外的其他規(guī)范,如Hadoop分布式文件系統(tǒng)(HDFS)異構開發(fā)環(huán)境以及編程模型如Spark。(5)DSPE的查詢處理流程及性能測試。DSPE可以通過標注SQL語句來查詢Hbase中的表數據,并且支持
為了驗證Hbase DSPE在大數據環(huán)境下的查詢性能,我們使用大規(guī)模的數據對Hbase DSPE進行性能測試(1000萬條記錄行數),并且針對Hive以及Hbase本身進行了基準比較測試。測試環(huán)境由6臺機器組成Hbase集群,并且部署Hbase DSPE,同時在Hbase集群上安裝Hive,使Hbase集群其同時兼做Hive集群。我們可以從表1中看出Hbase DSPE的查詢性能要勝過Hive近2.5倍。
3 結束語
本文設計的基于Hbase的SQL解析引擎將提供與傳統(tǒng)SQL編程模型完全兼容的分布式查詢平臺,并且直接使用HBase API和協(xié)處理器(Coprocessor),從而實現向外擴展的大數據分布式處理機制。通過性能測試我們可以看Hbase DSPE相對于Hive在查詢性能上的優(yōu)越性,并且對于同樣使用了HBase API、協(xié)同處理器及自定義過濾器的Impala與OpenTSDB來說,Hbase DSPE進行相似查詢的速度預期也會更快。由于使用分布式批處理查詢,Hbase DSPE可支持超過1000個并發(fā)的查詢任務,將大幅度提高服務器的利用率。此外,Hbase DSPE還可以應用Hbase分布式數據庫的諸多高級特性,使用戶對SQL查詢的優(yōu)化可以通過配置Hbase的各種參數來實現,而不需要進行復雜的SQL查詢語句的優(yōu)化。因此,基于Hbase的SQL解析引擎DSPE是值得進一步深入研究的。
Hbase DSPE未來還計劃支持如Cloudera,Spark等分布式數據庫以及大數據編程模型,并且逐步在大數據領域的分布式查詢應用中進行推廣、應用,形成開放的DSPE API接口,努力成為公共的大數據分布式查詢解決方案。
參考文獻:
[1]張旭中.分布式數據庫查詢優(yōu)化技術[D].電子科技大學,2003.
[2]Jeffrey Dean,Sanjay Ghemawat.MapReduce:Simplified Data Processing on Large Clusters.Google,Inc,2004.
[3]Lars George.“Hbase:The Definitive Guide”.1st edition,O'Reilly Media,2008.
[4]http://hbase.apache.org/book/book.html.Apache Hbase Ref Guide.Hbase Website,2012.
[5]李崇欣.分布式數據庫HBase快照的設計與實現[D].浙江大學,2011.
[6]Mehul Nalin Vora.Hadoop-HBase for Large-Scale Data.Innovation Labs,PERC Tata Consultancy Services(TCS)Ltd.Mumbai,India,2011.
[7]Chongxin Li.Transforming Relational Database into HBase:A Case Study.Zhejiang University,Hangzhou,China,2011.
[8]Hive.http://hive.apache.org.
[9]Lars George.“Hbase:The Definitive Guide”.1st edition,O'Reilly Media,2008.
作者簡介:杜曉東(1983.09-),男,內蒙古呼和浩特人,現就職于IBM系統(tǒng)與科技開發(fā)中心,研發(fā)工程師,軟件工程碩士學位,研究方向:云計算、大數據環(huán)境下的高性能網格計算。
作者單位:上海大學 計算機工程與科學學院,上海 200122