李雅楠 龐 慧,2,*
(1.河北建筑工程學(xué)院,河北 張家口 075300;2.張家口市大數(shù)據(jù)技術(shù)創(chuàng)新中心,河北 張家口 075000)
HBase是面向列的非關(guān)系型數(shù)據(jù)庫,外加其具有高可靠、高性能、高可用以及可伸縮的特點(diǎn),被廣泛應(yīng)用.HBase的文件存儲系統(tǒng)是HDFS,利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù)[1].HBase面向列的特點(diǎn)也使其具有先天的劣勢.HBase在查詢的時(shí)候只能夠以rowkey為主鍵來進(jìn)行,每次查詢都需要掃描全表,這樣的方式浪費(fèi)資源且查詢效率比較低.
Hive是比較典型的數(shù)據(jù)倉庫工具,可以被用來進(jìn)行ETL,其進(jìn)行查詢時(shí)也需要借助Hadoop MapReduce.現(xiàn)將HBase與Hive進(jìn)行整合,實(shí)現(xiàn)“HBase存儲+Hive查詢”的整合方案.HiveQL語句與最基礎(chǔ)的sql語句十分相似,且Hive Shell的操作相較于HBase Shell簡單易上手.因此,該整合方案也可以省略操作上的繁瑣步驟.
HBase的表數(shù)據(jù)存放在Region中.每個(gè)表一開始只有一個(gè)Region,隨著數(shù)據(jù)量不斷增加,Region增大,當(dāng)達(dá)到一個(gè)閾值時(shí),Region就會被RegionServer水平切分成兩個(gè)新的Region[2].以此類推,隨著數(shù)據(jù)越來越多,對應(yīng)的Region也越來越多.Region由RegionServer進(jìn)行管理,通常情況下,一個(gè)RegionServer可以管理多個(gè)Region.
HBase的功能組件包含以下三個(gè):(1)可以鏈接到每個(gè)客戶端的庫函數(shù);(2)Region:HBase中包含多個(gè)Region服務(wù)器;(3)Master主服務(wù)器,僅有一個(gè).若客戶端發(fā)送請求,由Region服務(wù)器來處理.除此之外,Region服務(wù)器被用來維護(hù)并存儲系統(tǒng)分配的Region.HBase中表的分區(qū)信息,由Master來負(fù)責(zé),主要擔(dān)任管理和維護(hù)的工作.
HBase保存Region位置信息的方式和B+樹的三層結(jié)構(gòu)十分類似.第一層是Zookeeper文件,它主要是用來記錄-ROOT-表的位置信息;-ROOT-表就是第二層,這層也叫根數(shù)據(jù)表,-ROOT-表中記錄的是.META.表的Region的位置信息[3].另外,根數(shù)據(jù)表只有一個(gè)Region,并且通過它就可以訪問元數(shù)據(jù)表中的數(shù)據(jù);第三層是.META.表,即元數(shù)據(jù)表,用來記錄數(shù)據(jù)表的Region位置信息,且可以包含多個(gè)Region.
傳統(tǒng)數(shù)據(jù)倉庫大都是基于Oracle、MySQL這樣的關(guān)系型數(shù)據(jù)庫,擴(kuò)展成本高,面對PB級別的數(shù)據(jù)量以及各種關(guān)系數(shù)據(jù)庫、NoSQL數(shù)據(jù)庫、XML文件等數(shù)據(jù)源,其處理速度和處理效率不能夠滿足數(shù)據(jù)存儲、查詢以及融合多維度數(shù)據(jù)進(jìn)行分析的需要[4].
Hive相當(dāng)于作業(yè)提交層,將HiveQL語句發(fā)送給中間層MapReduce來進(jìn)行計(jì)算,使用HDFS進(jìn)行存儲.Hive查詢過程中,可以通過設(shè)置合理的MapReduce的task數(shù)、小文件合并等方式來提高查詢效率[5].
Hive的工作流程,與大眾所熟悉的關(guān)系數(shù)據(jù)庫非常相似.區(qū)別就是Hive使用的是分布式計(jì)算框架.Hive元數(shù)據(jù)存儲是需要通過Thrift來提供的.簡單的講,就是用戶要是想要修改元數(shù)據(jù),要是直接調(diào)用元數(shù)據(jù)存儲方法是行不通的,只能夠通過HiveQL來執(zhí)行,HiveQL語句和大眾熟悉的sql語句十分相似,操作比較簡單.此外,如果用戶要獲取元數(shù)據(jù),只能夠通過只讀的方式來進(jìn)行,不能夠修改.
HBase與Hive都有其對外的API接口,兩者可以通過API進(jìn)行整合.Hive可以通過HBaseStorageHandler來訪問HBase中的表數(shù)據(jù),并且可以進(jìn)行創(chuàng)建、查詢等操作.
Hive訪問HBase中表數(shù)據(jù),實(shí)質(zhì)上是通過MapReduce讀取HBase表數(shù)據(jù)[6].實(shí)現(xiàn)的第一步就是Hive通過HiveHBaseTableInputFormat在MapReduce中對HBase的數(shù)據(jù)表進(jìn)行切分,一個(gè)Region對應(yīng)一個(gè)Split,即MapReduce的Map的數(shù)量與表中Regions的數(shù)量相同.之后利用RecordReader對數(shù)據(jù)進(jìn)行讀取.Sca-nner可以被用來對全表進(jìn)行掃描,從而讀取HBase中表數(shù)據(jù),其可以調(diào)用Region-Server的next()函數(shù)來獲取表數(shù)據(jù).Filter可以實(shí)現(xiàn)過濾條件的轉(zhuǎn)化.
以上操作全部完成之后,如果HBase和Hive中的表數(shù)據(jù)一致,且在HBase或者Hive任意平臺進(jìn)行增刪改查等操作,另一平臺的數(shù)據(jù)都可以同步,說明HBase存儲+Hive查詢框架已經(jīng)整合成功.比如:首先在Hive中查詢前十行表數(shù)據(jù),之后在HBase中查詢,所得出的結(jié)果是否一致,若結(jié)果一致,則證明HBase與Hive整合成功.
實(shí)驗(yàn)的的硬件采用的是Lenovo ThinkPad L440.
軟件采用的是:CentOS 6.4,Hadoop 2.7.1,HBase 1.1.2,Hive 1.2.0.
實(shí)驗(yàn)使用的數(shù)據(jù)集為美國新冠肺炎按州縣進(jìn)行統(tǒng)計(jì)的數(shù)據(jù),時(shí)間為2020.1.21-2020.5.19.其中date表示日期,county表示縣,state表示州,cases表示截止到該日期為止該縣的的累計(jì)確診病例,deaths表示截止到該日期為止該縣的死亡人數(shù).該文件為csv文件,大約共15萬行數(shù)據(jù).
2.2.1 配置環(huán)境
(1)拷貝lib下的jar文件:將HBase中的jar文件全部copy到Hive中.(2)拷貝HBase與Hive的通信包:Hive中包含通信包hive-hbase-handler-1.2.0.jar,將其復(fù)制到HBase目錄的lib下;(3)修改Hive的配置文件:修改conf目錄下的hive-site.xml配置文件,需要把下面的配置語句加入到該配置文件中,其中*.*.*.*是本機(jī)ip.
2.2.2 上傳csv文件
首先要將該csv文件上傳至HBase,具體步驟為:(1)在HBase中創(chuàng)建新表;(2)將csv文件上傳至HDFS;(3)將HDFS中的csv文件導(dǎo)入到HBase的表中,命令為:hbase org.apache.hadoop.hbase.mapreduce.ImportTsv-Dimporttsv.separator=","-Dimporttsv.columns=HBASE_ROW_KEY,info:date,info:county,info:state,info:cases,info:deaths hbase_to_hive_us1/user/us.csv.
2.2.3 在Hive中創(chuàng)建關(guān)聯(lián)HBase的外部表
在Hive Shell中執(zhí)行:CREATE EXTERNAL TABLE hive_to_hbase_us1(key string,date string,county string,state string,cases int,deaths int)STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES("hbase.columns.mapping"=":key,info:date,info:county,info:state,info:cases,info:deaths")TBLPROPERTIES("hbase.table.name"="hbase_to_hive_us1").執(zhí)行成功即外部表創(chuàng)建成功.
2.2.4 在Hive中查詢數(shù)據(jù)
在Hive Shell中執(zhí)行:select * from hive_to_hbase_us1 limit 10;如圖1所示,查詢結(jié)果與存儲在HBase中的前十行數(shù)據(jù)吻合,說明已經(jīng)整合成功.
圖1 hbase整合hive成功圖
根據(jù)該數(shù)據(jù)集的特點(diǎn),本文設(shè)計(jì)如下查詢方式來驗(yàn)證查詢速率:由于新冠肺炎的確診人數(shù)是逐步增多的,時(shí)間越靠后,確診或者死亡涉及到的縣也越來越多,所以時(shí)間越靠后所涉及到的數(shù)據(jù)量是越來越大的.而對于疫情嚴(yán)重的州,累計(jì)確診病例必然也是越來越大.在這里隨機(jī)取三個(gè)州來進(jìn)行驗(yàn)證:New York,Calif-ornia,F(xiàn)lorida,這里分別使用HBase和HBase整合Hive兩種方式來統(tǒng)計(jì)以上三個(gè)州截止5月19日的總確診量.經(jīng)過查詢統(tǒng)計(jì),以上三個(gè)州截止5月19日的確診量如表1所示.
表1 美國三個(gè)州截止5.19的累計(jì)確診人數(shù)
查詢New York,California,F(xiàn)lorida三個(gè)州所用的時(shí)間如圖2所示.
圖2 查詢效率對比圖
通過對查詢Florida,California,New York三個(gè)州截止5月19日的確診量所用的時(shí)間進(jìn)行記錄,可看出使用HBase存儲+Hive查詢的整合框架的查詢性能優(yōu)于使用HBase原生訪問.并且隨著數(shù)據(jù)量的增大,兩種方案查詢性能的差距越來越明顯,用戶體驗(yàn)感也更好.不過由于硬件條件有限,所選取的數(shù)據(jù)量僅能顯示出實(shí)驗(yàn)效果,并不能看到極大的差距,還有待提高.
本文設(shè)計(jì)了HBase整合Hive的框架,并且結(jié)合美國新冠肺炎的部分?jǐn)?shù)據(jù),對該數(shù)據(jù)分別使用HBase原生訪問以及HBase存儲+Hive查詢兩種方案進(jìn)行數(shù)據(jù)分析.實(shí)驗(yàn)證明,HBase整合Hive可以在提高HBase的查詢性能.因Hive對事務(wù)弱支持,且事務(wù)執(zhí)行速度很慢,存在諸多限制和不便,不適合高并發(fā)的場景[7].本文的整合方案也可以使得Hive適用于更多應(yīng)用場景.但是由于硬件條件有限,只分析了該離線數(shù)據(jù),并且實(shí)驗(yàn)數(shù)據(jù)量也不是很大,在大量的實(shí)時(shí)數(shù)據(jù)分析中,是否可以得出同樣的結(jié)論,或者說該整合方案是否穩(wěn)定,是否需要進(jìn)一步的查詢性能的優(yōu)化,依舊值得做更深層次的研究.