陳效杰++張金泉
摘要:分布全球的氣象傳感器每隔一段時(shí)間就會(huì)收集大量的氣象數(shù)據(jù),歷史氣象數(shù)據(jù)更為龐大,如何存儲(chǔ)和處理這些數(shù)據(jù)已成為一個(gè)難題。Hadoop的出現(xiàn)給人們提供了存儲(chǔ)和分析大數(shù)據(jù)的一個(gè)利器,它利用HDFS分布式文件系統(tǒng)進(jìn)行大數(shù)據(jù)存儲(chǔ),用戶通過(guò)編寫MapReduce程序完成大數(shù)據(jù)的分析處理。然而,對(duì)于很多用戶而言,熟練掌握J(rèn)ava語(yǔ)言并編寫MapReduce程序并不容易。鑒于此,利用Hive來(lái)存儲(chǔ)和處理氣象數(shù)據(jù)集。Hive是構(gòu)建在Hadoop上的數(shù)據(jù)倉(cāng)庫(kù)框架,它支持SQL接口,可以讓精通SQL技能的分析師對(duì)存放在HDFS中的大規(guī)模數(shù)據(jù)集進(jìn)行查詢分析。
關(guān)鍵詞:大數(shù)據(jù);Hadoop;HDFS;Hive
DOIDOI:10.11907/rjdk.151393
中圖分類號(hào):TP301
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2015)008001103
作者簡(jiǎn)介作者簡(jiǎn)介:陳效杰(1989-),男,山東臨沂人,山東科技大學(xué)信息科學(xué)與工程學(xué)院碩士研究生,研究方向?yàn)樵朴?jì)算、大數(shù)據(jù);張金泉(1972-),男,四川南充人,博士,山東科技大學(xué)信息科學(xué)與工程學(xué)院副教授、碩士生導(dǎo)師,研究方向?yàn)镻etri理論及應(yīng)用。
0 引言
人們生活在數(shù)據(jù)大爆炸時(shí)代,國(guó)際數(shù)據(jù)公司(IDC)曾經(jīng)發(fā)布報(bào)告稱,2006年數(shù)字世界項(xiàng)目統(tǒng)計(jì)得出全球數(shù)據(jù)總量為0.18ZB,面對(duì)數(shù)據(jù)的爆炸式增長(zhǎng),大數(shù)據(jù)的存儲(chǔ)和處理顯然也面臨著巨大挑戰(zhàn)[1]。Hadoop的出現(xiàn)為人們提供了一個(gè)可靠的共享存儲(chǔ)和處理分析系統(tǒng),使人們?cè)诖鎯?chǔ)和分析大數(shù)據(jù)時(shí)更加高效,其HDFS分布式文件系統(tǒng)可以實(shí)現(xiàn)數(shù)據(jù)的分布式存儲(chǔ)[2]。MapReduce給出一個(gè)編程模型,該模型抽象出這些硬盤的讀寫問(wèn)題并將其轉(zhuǎn)換為對(duì)一個(gè)數(shù)據(jù)集的處理計(jì)算,HDFS和MapReduce是Hadoop的兩個(gè)核心。
使用Hive對(duì)氣象數(shù)據(jù)集進(jìn)行分析主要是基于如下考慮:①分布在全球各地的氣象傳感器每隔一個(gè)小時(shí)收集氣象數(shù)據(jù)并產(chǎn)生大量的日志數(shù)據(jù),由于數(shù)據(jù)量十分巨大,用單機(jī)處理氣象數(shù)據(jù)耗時(shí)太多,因此人們考慮使用搭建Hadoop的集群來(lái)處理這些數(shù)據(jù),這些數(shù)據(jù)通常是半結(jié)構(gòu)化并且是按照記錄方式存儲(chǔ),按行并以ASCII碼格式存儲(chǔ),每一行是一條記錄,因此非常適合編寫MapReduce程序進(jìn)行分析處理[2];②對(duì)于大多數(shù)用戶而言,熟練編寫MapReduce程序不容易,所以人們將收集的氣象數(shù)據(jù)導(dǎo)入到
Hive的數(shù)據(jù)倉(cāng)庫(kù)中,利用Hive來(lái)處理這些氣象數(shù)據(jù)。Hive是Hadoop下的項(xiàng)目,它是一種分布式、按列存儲(chǔ)的
數(shù)據(jù)倉(cāng)庫(kù)[3]。Hive管理HDFS中存儲(chǔ)的數(shù)據(jù),并提供SQL的查詢語(yǔ)言(由運(yùn)行時(shí)引擎翻譯成MapReduce作業(yè))用以查詢數(shù)據(jù)。
1 相關(guān)技術(shù)
1.1 HDFS分布式文件系統(tǒng)
當(dāng)數(shù)據(jù)集的大小超出一臺(tái)獨(dú)立物理計(jì)算機(jī)的存儲(chǔ)能力時(shí),就有必要對(duì)它進(jìn)行分區(qū)并存儲(chǔ)到若干臺(tái)獨(dú)立的計(jì)算機(jī)上,管理網(wǎng)絡(luò)中跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)稱為分布式文件系統(tǒng)。HDFS即Hadoop的一個(gè)分布式文件系統(tǒng),即Hadoop Distributed FileSystem,HDFS以流式數(shù)據(jù)訪問(wèn)模式來(lái)存儲(chǔ)超大文件,運(yùn)行于商用硬件集群上。
HDFS有兩類節(jié)點(diǎn),一類是namenode(管理者),另一類是datanode(工作者),namenode管理整個(gè)文件系統(tǒng)的命名空間,維護(hù)著文件系統(tǒng)樹(shù)及樹(shù)內(nèi)的所有文件目錄,并將這些信息永久保存在本地磁盤上,namenode也同時(shí)記錄著每個(gè)塊及各個(gè)塊的數(shù)據(jù)節(jié)點(diǎn)信息。datanode負(fù)責(zé)文件系統(tǒng)中數(shù)據(jù)的實(shí)際存儲(chǔ),根據(jù)需要存儲(chǔ)和檢索數(shù)據(jù)塊,并定期向namenode發(fā)送它們所存儲(chǔ)塊的列表,從而與namenode進(jìn)行交互。HDFS用來(lái)存儲(chǔ)底層數(shù)據(jù),所有導(dǎo)入Hive中的數(shù)據(jù)最終都存儲(chǔ)在HDFS中。
1.2 Hive
Hive是一個(gè)數(shù)據(jù)倉(cāng)庫(kù)框架,它構(gòu)建于Hadoop之上,其設(shè)計(jì)初衷是讓熟悉SQL但Java編程技能相對(duì)較弱的用戶能夠?qū)Υ娣旁贖DFS中的大規(guī)模數(shù)據(jù)進(jìn)行查詢分析,它一般在工作站運(yùn)行。它的本質(zhì)是將查詢分析命令轉(zhuǎn)換為MapReduce程序?qū)崿F(xiàn)作業(yè)運(yùn)行[1]。因此,Hive的執(zhí)行效率實(shí)際上比直接執(zhí)行MapReduce程序要低。
人們一般通過(guò)Hive外殼程序與Hive進(jìn)行交互,安裝完Hive后可以通過(guò)Hive shell方式進(jìn)入外殼程序,在Hive中人們主要使用HiveQL語(yǔ)言。HiveQL是Hive的查詢語(yǔ)言,它和SQL類似,精通SQL的用戶可以很快熟悉HQL。
Hive與傳統(tǒng)數(shù)據(jù)庫(kù)相比,有很多相似之處,比如它們都支持SQL接口,但其底層依賴于HDFS和MapReduce,所以兩者之間也存在很多區(qū)別。在傳統(tǒng)數(shù)據(jù)庫(kù)中,表的模式是在加載時(shí)確定的,如果發(fā)現(xiàn)加載的數(shù)據(jù)不符合模式,就不會(huì)加載,這種模式成為寫時(shí)模式。但是Hive在數(shù)據(jù)加載過(guò)程中并不執(zhí)行驗(yàn)證,而是在查詢時(shí)進(jìn)行,如果模式有錯(cuò)誤,則返回的查詢信息有可能是空值,這種模式成為讀時(shí)模式。寫時(shí)模式有利于提升查詢性能,但是加載數(shù)據(jù)可能需要更多時(shí)間,在很多情況下加載模式尚未確定,因而查詢未確定,所以不能決定使用何種索引,這種情況正好適合Hive的讀時(shí)模式。
2 數(shù)據(jù)處理
Hive處理數(shù)據(jù)流程如圖1所示。
圖1 氣象數(shù)據(jù)處理流程
(1)數(shù)據(jù)導(dǎo)入部分。將需要進(jìn)行分析處理的氣象數(shù)據(jù)導(dǎo)入Hive表中,Hive是讀時(shí)模式加載數(shù)據(jù)非常快,并且在加載過(guò)程中并不對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,對(duì)于Hive的數(shù)據(jù)加載而言,該過(guò)程僅僅是文件的復(fù)制或移動(dòng)[4]。Hive的存儲(chǔ)格式一般分為面向行和面向列的存儲(chǔ),面向行的存儲(chǔ)意味著同一行中的字段作為順序文件的一條記錄被存儲(chǔ)在一起,面向列的存儲(chǔ)表示按列來(lái)記錄文件,這種方式可以使一個(gè)查詢跳過(guò)那些不必訪問(wèn)的列從而節(jié)省時(shí)間消耗。
(2)數(shù)據(jù)底層存儲(chǔ)部分。導(dǎo)入數(shù)據(jù)后,在形式上是將數(shù)據(jù)導(dǎo)入Hive表中,但是導(dǎo)入的數(shù)據(jù)真正的存放地是HDFS,每個(gè)表可能占用多個(gè)HDFS塊,也即表中的數(shù)據(jù)可能存放在集群中若干個(gè)節(jié)點(diǎn)之上。
(3)查詢處理部分。在Hive shell中輸入HQL語(yǔ)句,Hive shell會(huì)將該查詢語(yǔ)句轉(zhuǎn)化為一個(gè)MapReduce程序作業(yè)并為人們?cè)诩褐袌?zhí)行該作業(yè)[4]。如果待處理的源氣象數(shù)據(jù)格式不是人們期望處理的格式,則人們可以編寫UDF將源數(shù)據(jù)進(jìn)行預(yù)處理從而得到人們期望處理的數(shù)據(jù)格式(UDF(user-defined function)即用戶定義函數(shù))。Hive可以方便插入用戶寫的處理代碼并在查詢中調(diào)用它們[4]。由此可以看出,利用Hive執(zhí)行任務(wù)的效率低于直接用MapReduce程序執(zhí)行任務(wù),但是Hive給廣大用戶提供了最寶貴的SQL接口,并且避免了編寫繁瑣的MapReduce程序。
(4)結(jié)果反饋部分。經(jīng)過(guò)執(zhí)行MapReduce作業(yè),可以在控制臺(tái)觀察作業(yè)的處理過(guò)程,人們可以從控制臺(tái)輸出中得到很多信息,最后會(huì)在控制臺(tái)顯示處理結(jié)果。
在偽分布式Hadoop/Hive上對(duì)一小塊樣本數(shù)據(jù)進(jìn)行處理的過(guò)程如下:
(1)op@h1:~$ hadoop fs -put /home/op/sample.txt /input/sample.txt //將樣本數(shù)據(jù)從本地文件系統(tǒng)導(dǎo)入到HDFS分布式文件系統(tǒng)。
(2)op@h1:~$ hadoop fs -cat /input/sample.txt
1921 33 1
1922 23 2
1921 23 1
1932 12 2
1923 12 2
1932 33 2
1934 17 3
//導(dǎo)入完畢后可以在HDFS中查看到樣本數(shù)據(jù)。
(3)hive> create table records(year string,temp int,quality int)
> row format delimited
> fields terminated by 't';//創(chuàng)建hive表records
(4)load data inpath '/input/sample.txt' into table records; //將樣本數(shù)據(jù)從HDFS導(dǎo)入到records的Hive表。
(5)op@h1:~$ hadoop fs -ls /hive/warehouse/records
Found 1 items
-rw-r--r-- 1 op supergroup 50 2015-04-08 15:15 /hive/warehouse/records/sample.txt
//將hive的倉(cāng)庫(kù)目錄設(shè)置在HDFS,所以將數(shù)據(jù)導(dǎo)入到Hive表之后,表最終還是存儲(chǔ)在HDFS中。
(6)hive> select year,max(temp)
> from records
> where(quality=1 or quality=2)
> group by year;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
(7)2015-04-08 15:25:38,220 null map = 100%, reduce = 100%
Ended Job = job_local1530121749_0001
Execution completed successfully
Mapred Local Task Succeeded . Convert the Join into MapJoin
OK
1921 33
1922 23
1923 12
1932 33
//樣本數(shù)據(jù)導(dǎo)入到records表后,可以在Hive shell中查詢,查詢語(yǔ)言類似于SQL語(yǔ)言。可以看到Hive將SQL查詢語(yǔ)言轉(zhuǎn)化為一個(gè)MapReduce作業(yè)來(lái)執(zhí)行。
3 實(shí)驗(yàn)及結(jié)果分析
3.1 實(shí)驗(yàn)環(huán)境
為了進(jìn)行試驗(yàn)對(duì)比,本文將分別在兩種環(huán)境下進(jìn)行不同數(shù)據(jù)測(cè)試,一種是單機(jī)進(jìn)行數(shù)據(jù)集測(cè)試,另一種是一個(gè)4個(gè)節(jié)點(diǎn)的集群,其中一個(gè)運(yùn)行namenode進(jìn)程的master節(jié)點(diǎn)和4個(gè)運(yùn)行datanode進(jìn)程的slave節(jié)點(diǎn)。
單機(jī)配置:處理器為英特爾第三代酷睿 i5-3470 @
3.20GHz 四核,內(nèi)存為4G。集群4個(gè)節(jié)點(diǎn)的硬件配置和單機(jī)相同,集群中安裝Ubuntu14.04操作系統(tǒng),Hadoop版本為Hadoop2.2.0,并在master節(jié)點(diǎn)安裝Hive,Hive版本為Hive-0.12.0(Hadoop版本和Hive版本要匹配以避免不必要的麻煩)
3.2 實(shí)驗(yàn)結(jié)果及分析
本實(shí)驗(yàn)中人們使用8份氣象數(shù)據(jù)集,數(shù)據(jù)集大小分別為200MB、500MB、1 000MB、1 500MB、2 000MB、2 500MB、3 000MB,分別在單機(jī)和Hadoop集群中進(jìn)行試驗(yàn)。實(shí)驗(yàn)結(jié)果如圖2所示,縱軸為執(zhí)行任務(wù)所需時(shí)間,單位為秒。
從實(shí)驗(yàn)結(jié)果可以看出,起初數(shù)據(jù)集小時(shí)Hadoop/Hive集群處理數(shù)據(jù)的效率不明顯,甚至比單機(jī)處理所需時(shí)間更長(zhǎng),但是隨著數(shù)據(jù)集的增大,集群處理效果開(kāi)始顯現(xiàn),并且面對(duì)越大的數(shù)據(jù)集效率越高。
圖2 不同大小數(shù)據(jù)集在兩種環(huán)境下執(zhí)行所需時(shí)間
4 結(jié)語(yǔ)
Hadoop/Hive集群具有很多優(yōu)點(diǎn),在處理超大規(guī)模數(shù)據(jù)時(shí)效率極高,并且對(duì)于集群中的節(jié)點(diǎn)硬件配置沒(méi)有太高要求,尤其是Hive支持SQL接口,可以讓熟悉SQL語(yǔ)言的用戶更加方便地適用Hadoop。不可避免地,Hadoop/Hive集群也有一些劣勢(shì),比如處理小數(shù)據(jù)集時(shí)效果不佳、Hive不支持in的子查詢等。總體而言,利用Hadoop/Hive集群處理大數(shù)據(jù)集可以帶來(lái)無(wú)可比擬的優(yōu)勢(shì),具有極高的實(shí)用價(jià)值。
參考文獻(xiàn):
[1] 朱珠.基于Hadoop的海量數(shù)據(jù)處理模型研究和應(yīng)用[D].北京:北京郵電大學(xué), 2008.
[2] 王宏宇.Hadoop平臺(tái)在云計(jì)算中的應(yīng)用[J].軟件,2011,32(4):3638.
[3] 劉永增,張曉景,李先毅.基于hadoop/hive的web日志分析系統(tǒng)的設(shè)計(jì)[J].廣西大學(xué)學(xué)報(bào):自然科學(xué)版,2011,36(1):168173.
[4] TOM WHITE.hadoop權(quán)威指南[M].華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院,譯.北京:清華大學(xué)出版社,2015.
(責(zé)任編輯:孫 娟)