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