劉毅
摘 要:隨著Hadoop平臺(tái)的日益完善,其應(yīng)用范圍越來越普及,但仍然存在諸多影響性能的問題,比如調(diào)度算法中Hadoop配置對(duì)象開銷大、MapReduce階段中排序?qū)ο蟮男蛄谢胺葱蛄械母唛_銷問題。本文針對(duì)以上問題,提出解決方案。
關(guān)鍵詞:Hadoop云平臺(tái);優(yōu)化策略
1 研究背景
由于具備低成本和前所未有的高擴(kuò)展性,Hadoop已被公認(rèn)為是新一代的大數(shù)據(jù)處理平臺(tái)。Hadoop正帶來了新一輪的數(shù)據(jù)革命。雖然hadoop的應(yīng)用價(jià)值已得到廣泛認(rèn)可,但其有諸多問題依然制約著hadoop的發(fā)展,優(yōu)化hadoop性能主要可以從以下方面著手:
1.1 應(yīng)用程序優(yōu)化
考Hadoop云平臺(tái)優(yōu)化策略研究高效率的應(yīng)用程序。
1.2 Hadoop參數(shù)優(yōu)化
這種優(yōu)化方法要結(jié)合操作協(xié)同層面的調(diào)優(yōu),對(duì)hadoop系統(tǒng)的諸多配置參數(shù)進(jìn)行優(yōu)化調(diào)整,使hadoop作業(yè)運(yùn)行速度更快。
1.3 系統(tǒng)實(shí)現(xiàn)優(yōu)化
這是源碼級(jí)的優(yōu)化,針對(duì)hadoop框架及實(shí)現(xiàn)機(jī)制中不合理的地方進(jìn)行優(yōu)化,優(yōu)化難度大,效果也比較明顯。
本文主要針對(duì)hadoop存儲(chǔ)及系統(tǒng)實(shí)現(xiàn)中的幾種高開銷問題進(jìn)行了研究并提出了改進(jìn)措施。
2 存在的問題
2.1 Hadoop的Configuration開銷大
Hadoop的Configuration的配置需要花費(fèi)大量的時(shí)間,hadoop把對(duì)象的信息按照hashmap的方式存在于一個(gè)xml的配置文件中,讀取、解壓、分析均來自這一個(gè)磁盤的xml文件,這嚴(yán)重影響了IO性能,另外當(dāng)取對(duì)象時(shí)需要去調(diào)用get()方法,而get()方法的參數(shù)會(huì)也會(huì)引起正則表達(dá)式計(jì)算和變量替換,這也需要耗費(fèi)資源。如果對(duì)多個(gè)對(duì)象讀取,上面的步驟通過循環(huán)語(yǔ)句去實(shí)現(xiàn)的話,性能更是將大打折扣。當(dāng)對(duì)象很多的情況下hadoop花費(fèi)30%用來配置對(duì)象。
2.2 中間壓縮結(jié)果包含很多無用數(shù)據(jù)
spill線程中的壓縮和解壓縮操作會(huì)消耗消耗了大量時(shí)間,并且中間結(jié)果是臨時(shí)的。如果使用lz4方法取代lzo level 3,可以減少了30%多的中間數(shù)據(jù),并使其能被更快地讀取。
2.3 hadoop中對(duì)對(duì)象序列化和反序列化消耗太高
對(duì)對(duì)象的序列化和反序列化是Hadoop Job中開銷最高的操作,特別是對(duì)于那些進(jìn)場(chǎng)使用并且復(fù)雜、非主鍵的key。在hadoop中需要將兩個(gè)對(duì)象進(jìn)行比較,通常的做法是對(duì)這些對(duì)象反序列化后再進(jìn)行比較,但是反序列化是一個(gè)耗時(shí)的工程。下圖1是極端情況下通過java-xprof工具檢測(cè)得到的結(jié)果。
3 解決方法
傳統(tǒng)的數(shù)據(jù)讀寫是按照row-oriented方式讀寫,也就是順序讀取存儲(chǔ),這樣的方式優(yōu)點(diǎn)是讀寫相對(duì)容易速度也相對(duì)較快,但缺點(diǎn)也是相當(dāng)明顯的就是每次讀取都讀寫了一些無用的數(shù)據(jù),并且文件的存儲(chǔ)量也相對(duì)教大。傳統(tǒng)存儲(chǔ)的抽象圖如圖2和圖3所示。
解決方法是將record順序存儲(chǔ)的方式改為面向列的數(shù)據(jù)格式。它遵循“先按列劃分,再垂直劃分”的設(shè)計(jì)理念。當(dāng)查詢過程中,針對(duì)它并不關(guān)心的列時(shí),它會(huì)在IO上跳過這些列。也就是按需在磁盤上存取,這種面向列的數(shù)據(jù)讀取方式被稱為Parquet,下圖4和圖5說明了這種存取方式。
對(duì)比圖2和圖3由可以看出Parquet是面向列的存儲(chǔ),它使得同類型的字段被順序排在一起。那么這種存儲(chǔ)有什么好處呢,好處就是按列存儲(chǔ),可以有效地進(jìn)行列投影,并且在進(jìn)行反序列化的時(shí)候可以只反序列化需要的列。這樣就大大縮減了因?yàn)榉葱蛄谢牡臅r(shí)間,除此之外,存儲(chǔ)的文件也會(huì)相應(yīng)的減小很多,可以達(dá)到原來文件的一半。圖6是了采用面向列存儲(chǔ)后對(duì)某一列投影的示例圖。
下圖7是采用Parquet技術(shù)后,對(duì)比傳統(tǒng)存儲(chǔ)方式,使用java-xprof技術(shù)對(duì)hadoop運(yùn)行效率做了一個(gè)跟蹤對(duì)比,從圖中可以看出當(dāng)只有1字段時(shí),Parquet存儲(chǔ)方式是傳統(tǒng)基礎(chǔ)速度的3倍,當(dāng)有10字段的時(shí)候是傳統(tǒng)技術(shù)的1.5倍,速度提高明顯。
4 總結(jié)
本文針對(duì)hadoop性能調(diào)優(yōu)三種方法中的存儲(chǔ)及系統(tǒng)實(shí)現(xiàn)進(jìn)行了研究分析,提出了將row-oriented存儲(chǔ)改進(jìn)為Parquet存儲(chǔ),實(shí)驗(yàn)證明改為面向列的存儲(chǔ)對(duì)系統(tǒng)性能的提高是有效的,但是從圖7中可以看出隨著列的增加,這種性能優(yōu)勢(shì)在降低,后續(xù)將針對(duì)這一情況進(jìn)行深入的研究,完善這種技術(shù)。
參考文獻(xiàn)
[1]劉鵬.云計(jì)算(第二版)[M].北京:電子工業(yè)出版社,2011.
[2]淺析Hadoop文件格式.[EB/OL].http://www.infoq.com/cn/articles/hadoop-file-format,2012-5-28.
[3]探究提高Hadoop穩(wěn)定性與性能的方法 [EB/OL].http://dongxicheng.org/mapreduce/how-to-improve-hadoop-stablility-and-performance/,2013-12-29.
[4]王宏宇.hadoop平臺(tái)在云計(jì)算中的應(yīng)用[J].軟件,2011,(4):36-39.
[5]黃曉云.基于HDFS的云存儲(chǔ)服務(wù)系統(tǒng)研究[D].大連海事大學(xué),2010.
[6]王永洲.基于HDFS的存儲(chǔ)技術(shù)的研究[D].南京郵電大學(xué),2013.
[7]高薊超.Hadoop平臺(tái)存儲(chǔ)策略的研究與優(yōu)化[D].北京交通大學(xué),2012.