楊寧 黃婷婷
摘 要: 隨著數據規模的不斷增大,傳統的關系型數據庫方法已經無法滿足大數據量的數據查詢需求,而基于Hadoop 平臺的 Hive 數據倉庫為海量數據分析提供了方便的操作。隨著實時查詢需求的增加,基于Spark的Hive操作得到了很好的應用。文章主要介紹了Hive on Spark的整合步驟以及與Hadoop運行模式的比較。對 MovieLens 數據集的實驗測試顯示,新模式的執行速度提高了17.42-46.35倍,這對進一步了解Hive的運行機制及海量數據的實時分析具有重要的意義。
關鍵詞: Hadoop; Hive; Spark; 海量數據; 實時分析
中圖分類號: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 引言
隨著數據分析需求的不斷增加,實時性查詢越來越重要,但是基于Hadoop的Hive查詢,耗時過長,這在實時性要求比較嚴格的業務中是無法使用的。Spark的使用,給Hive的實時查詢提供了可能,如何更好的將Spark與Hive進行整合,從而得到更高的查詢速度,是以后需要進一步研究的方向。
1 Hive
1.1 Hive的背景
Hive起源于Facebook。原因是Facebook有著大量的用戶數據[1]需要進行處理。而Hadoop[2]是一個由MapReduce[3]模塊實現的大數據處理工具,主要的應用場景是在構建數據倉庫時,對數據執行抽取、轉換和裝載操作[4]。但是,由于MapReduce程序對于其他語言開發者來說相對麻煩。所以,Facebook研發了Hive,這將sql語句在Hadoop上執行成為了可能,達到了提高查詢效率的目的。
1.2 Hive的模型
Hive運行時,將SQL語句進行解釋、編譯、優化并生成執行任務,默認情況下會將查詢語句轉化為MapReduce任務進而執行。在基于Spark的架構中,將轉化為抽象的RDD,然后對相應的RDD再進行相關的處理。Hive 中的主要數據模型如下:表(Table)、外部表(External Table)、分區(Partition)、桶(Bucket)[5]。Hive中包含的主要組件如下:
Driver組件:主要有Compiler、Optimizer、Executor,可以將Hive語句進行編譯、解析、優化,進而轉化為相應的任務并提交給計算引擎進行處理。
MetaStore組件:存儲著Hive的元數據信息,主要為關系型數據庫。
用戶接口:用于訪問Hive。
2 Hive on Hadoop
2.1 Hadoop的背景
Google在2004年提出了最原始的分布式計算架構模型[6]:MapReduce,該模型主要用于大規模數據的并行處理。MapReduce模型主要分為Map和Reduce過程,主要的原理是將大規模數據處理作業拆分成多個可獨立運行的Map任務,然后傳輸到多個處理機上進行分布處理,最后通過Reduce任務混洗合并,從而產生最終的輸出文件。盡管MapReduce模型比較好的考慮了數據存儲、調度、容錯管理、負載均衡[7]等問題。但是它也存在不足,如占用過多的網絡資源、磁盤讀寫耗費時間、異步性差等問題。
2.2 Hadoop的四大組件
Hadoop為可靠、可擴展的分布式開源軟件。
Hadoop的四個組件如下:
Hadoop Common:支持其他Hadoop模塊的程序。
HDFS:分布式文件系統,提供訪問應用程序的數據。
Hadoop YARN:作業調度和集群資源管理的框架[8]。
Hadoop MapReduce:基于YARN的大型數據集并行處理系統。
2.3 Hive on Hadoop運行機制
Hive的客戶端書寫hql語句發起任務請求,然后將hql語句轉化為mapreduce任務,通過資源管理器yarn,分發到各個節點上進行數據處理。這種運行模式的目的是使客戶端主要集中進行查詢語句的書寫,而不用過多的關注底層的開發。具體執行流程如圖1所示。
2.4 Hive on Hadoop的應用
由于Hadoop具有較高的延遲,而且在作業提交和調度的時候,需要大量的額外開銷。所以,這種模式無法滿足大數據集的低延遲查詢。因此,該模式最佳使用場合是大數據集的離線批處理作業,例如,網絡日志的離線分析。
3 Hive on Spark
3.1 Spark的背景介紹
Apache Spark[9]是基于內存計算的用于大規模數據處理的分析引擎。Spark中的核心抽象概念就是彈性分布式數據集RDD(resilient distributed datasets)[10],該數據集為只讀型可恢復數據集。用戶可以利用 Spark中的轉換(transformation)和動作(action)操作對其進行處理,這其中也包括RDD的持久化操作,我們可以利用緩存的方式將其保存在內存[11]中不被回收。
RDD通過血統(lineage)關系來完成容錯:主要的原理是丟失的RDD有足夠的信息知道自己的父RDD,從而可以通過再次計算的方式從父RDD得到丟失的RDD。
3.2 Spark的四大特性
Spark具有四大特性如下:
快速性:相比較于Hadoop,官網給出的運行速度是提高了100倍。因為Spark使用DAG[12]調度程序、查詢優化程序和物理執行引擎,所以實現批量數據和流式數據處理的高性能。
易用性:支持使用Java,Scala,Python,R和SQL等語言進行快速編寫應用程序。
高可用性:Spark提供了很多庫,包括SQL、DataFrame、MLlib[13]、GraphX[14]和Spark Streaming[15]。我們可以在同一個應用程序中組合使用這些庫。
跨平臺性:Spark可以運行在Hadoop、Mesos、或者Kubernetes中;可以從HDFS、HBase、Hive和其他數百個數據源中訪問數據。
3.3 Hive on Spark的運行機制
我們在Spark平臺運行Hive時,有遠程和本地兩種方式。Hive on Spark主要的設計思路是,盡可能重用Hive邏輯計算層面的功能。在運行生成物理計劃開始時,就提供一整套針對Spark的實現,目的是使Hive的查詢可以作為Spark任務來執行。
設計原則如下:
⑴ 盡量保持Hive源碼的完整性:主要為了不影響Hive目前對MapReduce和Tez的支持;
⑵ 利用Hive語句:主要指使用Hive的執行語句對數據進行操作,使主要的計算邏輯仍由Hive提供;
⑶ 對Spark具有良好的松耦合性:使用中可以直接利用命令進行計算引擎的切換。
圖2是一個關于兩表join的hive操作執行過程,具體的處理過程如下:
這個join查詢在進行邏輯計劃過程中生成了兩個MapWork和一個ReduceWork。TS讀取表記錄,FIL進行過濾;RS對數據進行分發和排序,JOIN算子對RS分組排序后的數據進行join運算,最后通過FS算子輸出結果。
在執行SparkTask時,將各個MapWork和ReduceWork包裝成函數應用到RDD上,RDD主要由Hive表生成。對于存在依賴關系的Work之間,需要調用Shuffle操作并進行stage的相應劃分。圖2右為RDD的具體執行過程,首先通過Union操作,然后執行Shuffle操作,最后得到相應的RDD,foreachAsync的作用是將任務提交到Spark引擎上進行處理。
3.4 hive on spark的應用
如今,數據的來源和特性不斷改變,傳統的處理方式已不再適用,并且當使用過程中碰到迭代操作時,基于MapReduce的Hive查詢根本無法滿足快速處理的要求。但是,對于實時查詢業務,基于Spark的大數據分析工具Hive有著突出的表現,特別是對于一些復雜的操作,如迭代操作。
4 相關工作
4.1 Hive on Spark的集群搭建準備
Spark的編譯。要使用Hive on Spark,所用的Spark版本必須不包含Hive的相關jar包。需要下載Spark源碼進行重新編譯。
我們這里用的Spark源碼是從官網下載的spark-1.6.2的源碼包。編譯前請確保已經安裝JDK、Maven和Scala,Maven為3.3.3及以上版本,并配置環境變量。進入到源碼根目錄下,利用make-distribution.sh命令進行編譯,注意Hive和Spark的版本號要匹配。
4.2 Hive on Spark的搭建
本次實驗中,主要搭建了三臺虛擬機,其中Hive只需安裝在其中一臺機上,啟動Hive時,注意將MySQL驅動包上傳到Hive的lib目錄下;然后,在Hive的機器上,將Spark的lib目錄下的assembly包拷貝到Hive的lib目錄下,目的是執行Hive操作就不需要再手動啟動Spark。初始化數據庫,啟動Hive。至此,安裝結束,進行實驗測試。
5 兩種模式在具體查詢分析中的比較
5.1 影評案例的測試
主要使用了三張表movies.dat,ratings.dat,users.dat,我們主要對兩張表以及三張表的join操作進行了測試,具體操作如表1,表2所示。
5.2 實驗環境
實驗采用在虛擬機建立3臺機器測試,配置如下,電腦硬件:(英特爾)Intel(R) Core(TM) i5-3210M CPU@2.50GHz(2500 Mh),內存8.0GB,操作系統是 Microsoft Windows 7旗艦版(64位/Service Pack 1)。
三臺虛擬機的信息具體如表3。
三張表movies.dat,ratings.dat,users.dat的數據量分別為3883行數據,1000209行數據,6040行數據。測試結果如表4,表5所示。對于hadoop的具體執行過程如表6所示。
5.3 性能比較與總結
我們通過具體的案例分析,將結果用圖表進行顯示,每次運行的時間單位為秒,具體如圖3、圖4所示。
6 實驗總結和期望
實驗中,我們看到利用Spark作為計算引擎比MapReduce的執行速度快了17.421-46.347倍。基于Hadoop的執行過程具體如表6所示,總體運行時間都比較長。但是當基于Spark引擎運行時,每條語句的執行時間都明顯降低了,特別是執行sql6語句的時候,時間減少的更加明顯。
通過實驗,基于Spark的Hive語句執行的效果明顯好于Hadoop,特別是對于復雜的查詢語句,如產生多個map和reduce過程的語句,Spark的表現更加突出。Spark的應用使Hive的實時查詢成為了可能。這也對海量數據的實時分析具有重要的意義。
參考文獻(References):
[1] 李學龍,龔海剛.大數據系統綜述[J].中國科學:信息科學,2015.45(1):1-44
[2] 陸嘉恒.Hadoop實戰[M].機械工業出版社,2011.
[3] 宋杰.MapReduce大數據處理平臺與算法研究進展[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技術內幕深入解析MapReduce架構設計與實現原理[M].機械工業出版,2013.
[7] 陳林,Hadoop異構集群下的負載均衡算法研究[J].現代計算機,2018.5:60-62
[8] 方宸.基于YARN網絡數據分析系統實現與應用研究[D].華中科技大學,2014.
[9] 高彥杰.Spark大數據處理[M].機械工業出版社,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],現代計算機(專業版),2017.9:120-122,127
[15] 陸世鵬,基于Spark Streaming的海量日志實時處理系統的設計[J].電子產品可靠性與環境試驗,2017.35(5).