楊寧 黃婷婷
摘 要: 隨著數(shù)據(jù)規(guī)模的不斷增大,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫方法已經(jīng)無法滿足大數(shù)據(jù)量的數(shù)據(jù)查詢需求,而基于Hadoop 平臺的 Hive 數(shù)據(jù)倉庫為海量數(shù)據(jù)分析提供了方便的操作。隨著實時查詢需求的增加,基于Spark的Hive操作得到了很好的應(yīng)用。文章主要介紹了Hive on Spark的整合步驟以及與Hadoop運行模式的比較。對 MovieLens 數(shù)據(jù)集的實驗測試顯示,新模式的執(zhí)行速度提高了17.42-46.35倍,這對進一步了解Hive的運行機制及海量數(shù)據(jù)的實時分析具有重要的意義。
關(guān)鍵詞: Hadoop; Hive; Spark; 海量數(shù)據(jù); 實時分析
中圖分類號:TP399 文獻標志碼:A 文章編號:1006-8228(2018)11-31-05
Abstract: With the increasing size of the acquired data, the traditional relational database method can no longer meet the data query requirements of such large data volume, but the Hive data warehouse based on Hadoop platform provides convenient operation for massive data analysis. And with the increase in real-time query requirements, Spark-based Hive operations have been well applied. In this paper, Hive and Spark are integrated, and the integration steps of Hive on Spark and the comparison with the traditional running structure are introduced. The experimental test on MovieLens dataset shows that the execution speed of the new mode has increased by 17.42-46.35 times. This is of great significance for further understanding of Hive's operating mechanism and real-time analysis of massive data.
Key words: Hadoop; Hive; Spark; massive data; real-time analysis
0 引言
隨著數(shù)據(jù)分析需求的不斷增加,實時性查詢越來越重要,但是基于Hadoop的Hive查詢,耗時過長,這在實時性要求比較嚴格的業(yè)務(wù)中是無法使用的。Spark的使用,給Hive的實時查詢提供了可能,如何更好的將Spark與Hive進行整合,從而得到更高的查詢速度,是以后需要進一步研究的方向。
1 Hive
1.1 Hive的背景
Hive起源于Facebook。原因是Facebook有著大量的用戶數(shù)據(jù)[1]需要進行處理。而Hadoop[2]是一個由MapReduce[3]模塊實現(xiàn)的大數(shù)據(jù)處理工具,主要的應(yīng)用場景是在構(gòu)建數(shù)據(jù)倉庫時,對數(shù)據(jù)執(zhí)行抽取、轉(zhuǎn)換和裝載操作[4]。但是,由于MapReduce程序?qū)τ谄渌Z言開發(fā)者來說相對麻煩。所以,F(xiàn)acebook研發(fā)了Hive,這將sql語句在Hadoop上執(zhí)行成為了可能,達到了提高查詢效率的目的。
1.2 Hive的模型
Hive運行時,將SQL語句進行解釋、編譯、優(yōu)化并生成執(zhí)行任務(wù),默認情況下會將查詢語句轉(zhuǎn)化為MapReduce任務(wù)進而執(zhí)行。在基于Spark的架構(gòu)中,將轉(zhuǎn)化為抽象的RDD,然后對相應(yīng)的RDD再進行相關(guān)的處理。Hive 中的主要數(shù)據(jù)模型如下:表(Table)、外部表(External Table)、分區(qū)(Partition)、桶(Bucket)[5]。Hive中包含的主要組件如下:
Driver組件:主要有Compiler、Optimizer、Executor,可以將Hive語句進行編譯、解析、優(yōu)化,進而轉(zhuǎn)化為相應(yīng)的任務(wù)并提交給計算引擎進行處理。
MetaStore組件:存儲著Hive的元數(shù)據(jù)信息,主要為關(guān)系型數(shù)據(jù)庫。
用戶接口:用于訪問Hive。
2 Hive on Hadoop
2.1 Hadoop的背景
Google在2004年提出了最原始的分布式計算架構(gòu)模型[6]:MapReduce,該模型主要用于大規(guī)模數(shù)據(jù)的并行處理。MapReduce模型主要分為Map和Reduce過程,主要的原理是將大規(guī)模數(shù)據(jù)處理作業(yè)拆分成多個可獨立運行的Map任務(wù),然后傳輸?shù)蕉鄠€處理機上進行分布處理,最后通過Reduce任務(wù)混洗合并,從而產(chǎn)生最終的輸出文件。盡管MapReduce模型比較好的考慮了數(shù)據(jù)存儲、調(diào)度、容錯管理、負載均衡[7]等問題。但是它也存在不足,如占用過多的網(wǎng)絡(luò)資源、磁盤讀寫耗費時間、異步性差等問題。
2.2 Hadoop的四大組件
Hadoop為可靠、可擴展的分布式開源軟件。
Hadoop的四個組件如下:
Hadoop Common:支持其他Hadoop模塊的程序。
HDFS:分布式文件系統(tǒng),提供訪問應(yīng)用程序的數(shù)據(jù)。
Hadoop YARN:作業(yè)調(diào)度和集群資源管理的框架[8]。
Hadoop MapReduce:基于YARN的大型數(shù)據(jù)集并行處理系統(tǒng)。
2.3 Hive on Hadoop運行機制
Hive的客戶端書寫hql語句發(fā)起任務(wù)請求,然后將hql語句轉(zhuǎn)化為mapreduce任務(wù),通過資源管理器yarn,分發(fā)到各個節(jié)點上進行數(shù)據(jù)處理。這種運行模式的目的是使客戶端主要集中進行查詢語句的書寫,而不用過多的關(guān)注底層的開發(fā)。具體執(zhí)行流程如圖1所示。
2.4 Hive on Hadoop的應(yīng)用
由于Hadoop具有較高的延遲,而且在作業(yè)提交和調(diào)度的時候,需要大量的額外開銷。所以,這種模式無法滿足大數(shù)據(jù)集的低延遲查詢。因此,該模式最佳使用場合是大數(shù)據(jù)集的離線批處理作業(yè),例如,網(wǎng)絡(luò)日志的離線分析。
3 Hive on Spark
3.1 Spark的背景介紹
Apache Spark[9]是基于內(nèi)存計算的用于大規(guī)模數(shù)據(jù)處理的分析引擎。Spark中的核心抽象概念就是彈性分布式數(shù)據(jù)集RDD(resilient distributed datasets)[10],該數(shù)據(jù)集為只讀型可恢復數(shù)據(jù)集。用戶可以利用 Spark中的轉(zhuǎn)換(transformation)和動作(action)操作對其進行處理,這其中也包括RDD的持久化操作,我們可以利用緩存的方式將其保存在內(nèi)存[11]中不被回收。
RDD通過血統(tǒng)(lineage)關(guān)系來完成容錯:主要的原理是丟失的RDD有足夠的信息知道自己的父RDD,從而可以通過再次計算的方式從父RDD得到丟失的RDD。
3.2 Spark的四大特性
Spark具有四大特性如下:
快速性:相比較于Hadoop,官網(wǎng)給出的運行速度是提高了100倍。因為Spark使用DAG[12]調(diào)度程序、查詢優(yōu)化程序和物理執(zhí)行引擎,所以實現(xiàn)批量數(shù)據(jù)和流式數(shù)據(jù)處理的高性能。
易用性:支持使用Java,Scala,Python,R和SQL等語言進行快速編寫應(yīng)用程序。
高可用性:Spark提供了很多庫,包括SQL、DataFrame、MLlib[13]、GraphX[14]和Spark Streaming[15]。我們可以在同一個應(yīng)用程序中組合使用這些庫。
跨平臺性:Spark可以運行在Hadoop、Mesos、或者Kubernetes中;可以從HDFS、HBase、Hive和其他數(shù)百個數(shù)據(jù)源中訪問數(shù)據(jù)。
3.3 Hive on Spark的運行機制
我們在Spark平臺運行Hive時,有遠程和本地兩種方式。Hive on Spark主要的設(shè)計思路是,盡可能重用Hive邏輯計算層面的功能。在運行生成物理計劃開始時,就提供一整套針對Spark的實現(xiàn),目的是使Hive的查詢可以作為Spark任務(wù)來執(zhí)行。
設(shè)計原則如下:
⑴ 盡量保持Hive源碼的完整性:主要為了不影響Hive目前對MapReduce和Tez的支持;
⑵ 利用Hive語句:主要指使用Hive的執(zhí)行語句對數(shù)據(jù)進行操作,使主要的計算邏輯仍由Hive提供;
⑶ 對Spark具有良好的松耦合性:使用中可以直接利用命令進行計算引擎的切換。
圖2是一個關(guān)于兩表join的hive操作執(zhí)行過程,具體的處理過程如下:
這個join查詢在進行邏輯計劃過程中生成了兩個MapWork和一個ReduceWork。TS讀取表記錄,F(xiàn)IL進行過濾;RS對數(shù)據(jù)進行分發(fā)和排序,JOIN算子對RS分組排序后的數(shù)據(jù)進行join運算,最后通過FS算子輸出結(jié)果。
在執(zhí)行SparkTask時,將各個MapWork和ReduceWork包裝成函數(shù)應(yīng)用到RDD上,RDD主要由Hive表生成。對于存在依賴關(guān)系的Work之間,需要調(diào)用Shuffle操作并進行stage的相應(yīng)劃分。圖2右為RDD的具體執(zhí)行過程,首先通過Union操作,然后執(zhí)行Shuffle操作,最后得到相應(yīng)的RDD,foreachAsync的作用是將任務(wù)提交到Spark引擎上進行處理。
3.4 hive on spark的應(yīng)用
如今,數(shù)據(jù)的來源和特性不斷改變,傳統(tǒng)的處理方式已不再適用,并且當使用過程中碰到迭代操作時,基于MapReduce的Hive查詢根本無法滿足快速處理的要求。但是,對于實時查詢業(yè)務(wù),基于Spark的大數(shù)據(jù)分析工具Hive有著突出的表現(xiàn),特別是對于一些復雜的操作,如迭代操作。
4 相關(guān)工作
4.1 Hive on Spark的集群搭建準備
Spark的編譯。要使用Hive on Spark,所用的Spark版本必須不包含Hive的相關(guān)jar包。需要下載Spark源碼進行重新編譯。
我們這里用的Spark源碼是從官網(wǎng)下載的spark-1.6.2的源碼包。編譯前請確保已經(jīng)安裝JDK、Maven和Scala,Maven為3.3.3及以上版本,并配置環(huán)境變量。進入到源碼根目錄下,利用make-distribution.sh命令進行編譯,注意Hive和Spark的版本號要匹配。
4.2 Hive on Spark的搭建
本次實驗中,主要搭建了三臺虛擬機,其中Hive只需安裝在其中一臺機上,啟動Hive時,注意將MySQL驅(qū)動包上傳到Hive的lib目錄下;然后,在Hive的機器上,將Spark的lib目錄下的assembly包拷貝到Hive的lib目錄下,目的是執(zhí)行Hive操作就不需要再手動啟動Spark。初始化數(shù)據(jù)庫,啟動Hive。至此,安裝結(jié)束,進行實驗測試。
5 兩種模式在具體查詢分析中的比較
5.1 影評案例的測試
主要使用了三張表movies.dat,ratings.dat,users.dat,我們主要對兩張表以及三張表的join操作進行了測試,具體操作如表1,表2所示。
5.2 實驗環(huán)境
實驗采用在虛擬機建立3臺機器測試,配置如下,電腦硬件:(英特爾)Intel(R) Core(TM) i5-3210M CPU@2.50GHz(2500 Mh),內(nèi)存8.0GB,操作系統(tǒng)是 Microsoft Windows 7旗艦版(64位/Service Pack 1)。
三臺虛擬機的信息具體如表3。
三張表movies.dat,ratings.dat,users.dat的數(shù)據(jù)量分別為3883行數(shù)據(jù),1000209行數(shù)據(jù),6040行數(shù)據(jù)。測試結(jié)果如表4,表5所示。對于hadoop的具體執(zhí)行過程如表6所示。
5.3 性能比較與總結(jié)
我們通過具體的案例分析,將結(jié)果用圖表進行顯示,每次運行的時間單位為秒,具體如圖3、圖4所示。
6 實驗總結(jié)和期望
實驗中,我們看到利用Spark作為計算引擎比MapReduce的執(zhí)行速度快了17.421-46.347倍。基于Hadoop的執(zhí)行過程具體如表6所示,總體運行時間都比較長。但是當基于Spark引擎運行時,每條語句的執(zhí)行時間都明顯降低了,特別是執(zhí)行sql6語句的時候,時間減少的更加明顯。
通過實驗,基于Spark的Hive語句執(zhí)行的效果明顯好于Hadoop,特別是對于復雜的查詢語句,如產(chǎn)生多個map和reduce過程的語句,Spark的表現(xiàn)更加突出。Spark的應(yīng)用使Hive的實時查詢成為了可能。這也對海量數(shù)據(jù)的實時分析具有重要的意義。
參考文獻(References):
[1] 李學龍,龔海剛.大數(shù)據(jù)系統(tǒng)綜述[J].中國科學:信息科學,2015.45(1):1-44
[2] 陸嘉恒.Hadoop實戰(zhàn)[M].機械工業(yè)出版社,2011.
[3] 宋杰.MapReduce大數(shù)據(jù)處理平臺與算法研究進展[J].軟件學報,2017.28(3).
[4] El-Sappagh S H A, Hendawi A M A, Bastawissy A H E. A proposed modelfor data warehouse ETL processes[J]. Journal of King Saud University Computer & Information Sciences,2011.23(2):91-104
[5] Dean J,Ghemawat S. MapReduce:simplified data process-ing on largeclusters[J].Communications of the ACM,2008.51(1):107-113
[6] 董西成.Hadoop技術(shù)內(nèi)幕深入解析MapReduce架構(gòu)設(shè)計與實現(xiàn)原理[M].機械工業(yè)出版,2013.
[7] 陳林,Hadoop異構(gòu)集群下的負載均衡算法研究[J].現(xiàn)代計算機,2018.5:60-62
[8] 方宸.基于YARN網(wǎng)絡(luò)數(shù)據(jù)分析系統(tǒng)實現(xiàn)與應(yīng)用研究[D].華中科技大學,2014.
[9] 高彥杰.Spark大數(shù)據(jù)處理[M].機械工業(yè)出版社,2014.
[10] Zaharia M, Chowdhury M, Das T, et al. Resilient distributed datasets: a faulttolerant abstraction for in-memory cluster computing [C]// Proc of Conference on Networked Systems Design and Implementation.[S. l. ]:USENIX Association, 2012:2
[11] Han Z, Zhang Y. Spark: A Big Data Processing Platform Based on MemoryComputing [C]// Proc of International Symposium on Parallel Architectures.[S. l.]:IEEE Press,2015:172-176
[12] 袁景凌,熊盛武,饒文碧.Spark案例與實驗教程[M].武漢大學出版社,2017.
[13] B Yavuz, B Yavuz, B Yavuz, E Sparks, D Liu.MLlib: machine learning in apache spark[J]. Journal of Machine Learning Research,2016.17(1):1235-1241
[14] 孫海.Spark的圖計算框架:GraphX[J],現(xiàn)代計算機(專業(yè)版),2017.9:120-122,127
[15] 陸世鵬,基于Spark Streaming的海量日志實時處理系統(tǒng)的設(shè)計[J].電子產(chǎn)品可靠性與環(huán)境試驗,2017.35(5).