本篇文章為大家展示了hadoop性能調(diào)優(yōu)的重要參數(shù)設(shè)置技巧是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
十載的雙臺(tái)子網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整雙臺(tái)子建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“雙臺(tái)子網(wǎng)站設(shè)計(jì)”,“雙臺(tái)子網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
分類: hadoop2012-12-16
19:53 43人閱讀 評(píng)論(0) 收藏 舉報(bào)
這里主要針對(duì)Mapreduce的性能調(diào)優(yōu)。
這一兩個(gè)月在做mapreduce的性能調(diào)優(yōu),有些心得,還是要記下來(lái)的,以郷后人~
這里主要涉及的參數(shù)包括:
HDFS:
dfs.block.size
Mapredure:
io.sort.mb
io.sort.spill.percent
mapred.local.dir
mapred.map.tasks & mapred.tasktracker.map.tasks.maximum
mapred.reduce.tasks & mapred.tasktracker.reduce.tasks.maximum
mapred.reduce.max.attempts
mapred.reduce.parallel.copies
mapreduce.reduce.shuffle.maxfetchfailures
mapred.child.java.opts
mapred.reduce.tasks.speculative.execution
mapred.compress.map.output & mapred.map.output.compression.codec
mapred.reduce.slowstart.completed.maps
這里一共列出了十六個(gè)參數(shù),這十六個(gè)參數(shù)基本上能滿足一般情況下,不針對(duì)特定場(chǎng)景應(yīng)用的性能調(diào)優(yōu)了,下面我將以Terasort為例,詳述這些參數(shù)的作用已經(jīng)如何配比調(diào)優(yōu)。
hadoop的HDFS作為mapreduce的基礎(chǔ)分布式文件系統(tǒng),對(duì)mapred的運(yùn)行效果也有直接的影響。首先影響到我們的性能的參數(shù)就是block.size,在網(wǎng)絡(luò)環(huán)境很好的集群中,建議將這個(gè)參數(shù)提升,大小可以到128或256或更大(默認(rèn)64M)。
但是HDFS的影響也僅限于此,而且其配置項(xiàng)多數(shù)都是目錄配置以及容錯(cuò),還有備份數(shù)等等,這些對(duì)于我們性能調(diào)優(yōu)意義不大??梢耘e一個(gè)例子,那就是備份數(shù)。這個(gè)參數(shù)主要是用于設(shè)置block在集群中的備份數(shù),這些備份將按照某種規(guī)則分配在集群的各個(gè)機(jī)器上,默認(rèn)是3備份。但是由于mapred的map需要輸入數(shù)據(jù),一般默認(rèn)情況是一個(gè)map一個(gè)block,那么當(dāng)你在集群起job,一個(gè)job拉起來(lái)N多的map在一個(gè)機(jī)器執(zhí)行時(shí),如果這個(gè)map的輸入數(shù)據(jù)是本地的,那么顯然map的執(zhí)行將會(huì)更快,因?yàn)椴恍枰却W(wǎng)絡(luò)傳輸。拿四個(gè)節(jié)點(diǎn)為例,如果你設(shè)置三備份,那么你不管存什么數(shù)據(jù),任何一臺(tái)機(jī)器上可以存數(shù)的你的數(shù)據(jù)的量都是3/4,。但是如果你設(shè)置為四備份,那么任意一個(gè)節(jié)點(diǎn)上都能完整的找到你的數(shù)據(jù),那么不管你怎么起job,你的map都將是本地化的。但是帶來(lái)的壞處就是磁盤(pán)開(kāi)銷過(guò)大,一般大型的集群也承受不了5備份以上的數(shù)據(jù)量,所以,基本無(wú)意義。
下面來(lái)談?wù)勚仡^戲,那就是mapred中的這些NB的參數(shù)。前置知識(shí)我相信大家都已經(jīng)了解了(如果你還不了解mapred的運(yùn)行機(jī)制,看這個(gè)也無(wú)意義...),首先數(shù)據(jù)要進(jìn)行map,然后merge,然后reduce進(jìn)程進(jìn)行copy,最后進(jìn)行reduce,其中的merge和copy總稱可以為shuffle。在你起一個(gè)job前,hadoop需要知道你要啟動(dòng)多少個(gè)map,多少個(gè)renduce進(jìn)程,如果你進(jìn)行默認(rèn)參數(shù)啟動(dòng),那么默認(rèn)只有一個(gè)map線程。(reduce也許也是一個(gè)..)這個(gè)速度是很慢的。設(shè)置map啟動(dòng)個(gè)數(shù)的參數(shù)是mapred.map.tasks,reduce則是mapred.reduce.tasks。這兩個(gè)參數(shù)可以說(shuō)是對(duì)整個(gè)集群的性能起主導(dǎo)型作用的參數(shù),調(diào)試也基本上圍繞這兩個(gè)參數(shù)。那大家要問(wèn)就兩個(gè)參數(shù)有什么好來(lái)回修改的呢?其實(shí),這兩個(gè)參數(shù)的設(shè)置配比也直接影響到其他的參數(shù)的設(shè)置。首當(dāng)其沖的就是mapred.tasktracker.map.tasks.maximum
以及 mapred.tasktracker.reduce.tasks.maximum。因?yàn)檫@兩個(gè)參數(shù)設(shè)置了一臺(tái)服務(wù)器上最多能同時(shí)運(yùn)行的map和reduce數(shù)。現(xiàn)在我們來(lái)假設(shè)一個(gè)集群有一個(gè)namenode以及8個(gè)datanode,這是一個(gè)很客觀的集群。我們假設(shè)上面的數(shù)據(jù)都是三備份,那么本地?cái)?shù)據(jù)率為3/8。假設(shè)你設(shè)置的map.tasks=128,reuce.tasks=64,那么你的對(duì)應(yīng)的兩個(gè)maximum就應(yīng)該分別為16以及8或是更高。因?yàn)檫@樣才能保證你的所有map和reduce的任務(wù)都是分別同時(shí)啟動(dòng)的,如果你的設(shè)置reduce的maximum為7,那么你將得到非常糟糕的結(jié)果,因?yàn)檫@樣8臺(tái)機(jī)器同時(shí)可以運(yùn)行的reduce數(shù)量為56了,比你設(shè)置的64差8個(gè)進(jìn)程,這八個(gè)進(jìn)程將會(huì)處于pending狀態(tài),直到某些正在運(yùn)行的reduce完成它才能補(bǔ)上運(yùn)行,勢(shì)必大幅度的增加了運(yùn)行時(shí)間。當(dāng)然,這也不是越大越好,因?yàn)閙ap有很長(zhǎng)的一段時(shí)間是和reduce進(jìn)程共存的,共存的時(shí)間取決于你設(shè)置的mapred.reduce.slowstart.completed.maps,如果你設(shè)置為0.6.那么reduce將在map完成60%后進(jìn)入運(yùn)行態(tài)。所以說(shuō),如果你設(shè)置的map和reduce參數(shù)都很大,勢(shì)必造成map和reduce爭(zhēng)搶資源,造成有些進(jìn)程饑餓,超時(shí)出錯(cuò),最大的可能就是socket.timeout的出錯(cuò),網(wǎng)絡(luò)過(guò)于繁忙。所以說(shuō),這些需要根據(jù)集群的性能,適當(dāng)調(diào)試添加和減少,以達(dá)到最好的效果。那么,map和reduce之間是怎樣的配比比較好呢?apache官網(wǎng)給了我們一些建議,比如設(shè)置reduce與map,他們之間有一個(gè)具體的公式。但是實(shí)際情況總是不能用公式來(lái)套用的(否則就不需要系統(tǒng)工程師了...)。一般情況下,當(dāng)你設(shè)置好map和reduce進(jìn)程數(shù)后,你可以通過(guò)hadoop的mapred的頁(yè)面入口(http://namenode:50030/jobdetai.jps)查看map和reduce進(jìn)度,如果你發(fā)現(xiàn)reduce在33%時(shí),map正好提早一點(diǎn)點(diǎn)到100%,那么這將是最佳的配比,因?yàn)閞educe是在33%的時(shí)候完成了copy階段,也就是說(shuō),map需要再reduce到達(dá)33%之前完成所有的map任務(wù),準(zhǔn)備好數(shù)據(jù)。千萬(wàn)不能讓reduce在等待,但是可以讓map先完成。
OK!這個(gè)重點(diǎn)的搞完之后我們?cè)诳纯磧蓚€(gè)息息相關(guān)的參數(shù),io.sort.mb和mapred.child.java.opts。因?yàn)槊恳粋€(gè)map或是reduce進(jìn)程都是一個(gè)task,都會(huì)對(duì)應(yīng)啟動(dòng)一個(gè)JVM,所以其實(shí)java.opts也與你啟動(dòng)的map和reduce數(shù)以及別的一些jvm敏感的參數(shù)有關(guān)。既然task運(yùn)行在JVM里面,那么,我這里所要提到的sort.mb 也是分配在JVM中的,這個(gè)值是用來(lái)設(shè)置到底我一個(gè)map sort的可用buffer大小是多少,如果map在內(nèi)存中sort的結(jié)果達(dá)到一個(gè)特定的值,就會(huì)被spill進(jìn)入硬盤(pán)。具體這個(gè)值是等于mb*io.sort.spill.percent.。按照通常的設(shè)置方式,為了讓jvm發(fā)揮最佳性能,一般設(shè)置JVM的最大可用內(nèi)存量為mb設(shè)置的內(nèi)存量的兩倍。那么mb的內(nèi)存量又根據(jù)什么設(shè)置呢?它主要是與你的一個(gè)map的結(jié)果數(shù)據(jù)量有關(guān)。如果一個(gè)map的結(jié)果數(shù)據(jù)量為600M,那么如果你設(shè)置的mb*io.sort.spill.percent.=200M,那么將進(jìn)行3次spill進(jìn)入硬盤(pán),然后map完成后再將數(shù)據(jù)從硬盤(pán)上取出進(jìn)行copy。所以,這個(gè)mb設(shè)置如果是600M的話,那么就不需要進(jìn)行這次硬盤(pán)訪問(wèn)了,節(jié)省了很多時(shí)間。但是最大的問(wèn)題是內(nèi)存耗費(fèi)很大。如果mb是600M,那么jvm.opts將需要設(shè)置為1G以上,那么,按照上例,你同時(shí)啟動(dòng)16個(gè)map和8個(gè)reduce
的話,那么你的內(nèi)存至少應(yīng)該有24G。所以,這里的設(shè)置也要慎重,因?yàn)楫吘鼓愕姆?wù)器還要跑很多其他的服務(wù)。
下面就講一下別的一些有影響的參數(shù),按照一般的設(shè)置方法就可以。首先是針對(duì)磁盤(pán)和磁盤(pán)IO的,mapred.local.dir,這個(gè)參數(shù)最好設(shè)置的跟你的磁盤(pán)數(shù)相同,你的磁盤(pán)應(yīng)該每一個(gè)磁盤(pán)都單獨(dú)設(shè)置為RAID0,然后將所有磁盤(pán)配置成多路徑在這個(gè)配置項(xiàng)下,那么HDFS在決定數(shù)據(jù)存儲(chǔ)時(shí)會(huì)順序循環(huán)存儲(chǔ),保證所有磁盤(pán)數(shù)據(jù)量的一致性,也提升了整體磁盤(pán)的IO速度。那么針對(duì)于網(wǎng)絡(luò),主要是有reduce和map同時(shí)運(yùn)行時(shí)需要慎重考慮。mapred.reduce.parallel.copies與mapreduce.reduce.shuffle.maxfetchfailures這些參數(shù)都是對(duì)網(wǎng)絡(luò)有一些影響的。第一個(gè)是reduce可以進(jìn)行的最大并行拷貝線程數(shù),這些線程會(huì)同時(shí)從不同的datanode上取map結(jié)果,而第二個(gè)出錯(cuò)重試次數(shù)過(guò)多對(duì)于很多我們的應(yīng)用都是降低性能的一個(gè)問(wèn)題。因?yàn)橐话阋粋€(gè)job重試了1次沒(méi)有成功那基本以后無(wú)論怎么重試都是不會(huì)成功的,重試了不成功不要緊,關(guān)鍵是這個(gè)重試還大量的消耗系統(tǒng)的資源,讓其他的線程可能也因?yàn)閟tarvation
而進(jìn)入重試狀態(tài),惡性循環(huán)了。如果說(shuō)你的網(wǎng)絡(luò)確實(shí)很成瓶頸,千兆網(wǎng)都達(dá)不到,那么建議打開(kāi)mapred.compress.map.output壓縮選項(xiàng),并配置 mapred.map.output.compression.codec壓縮編碼格式,一般都會(huì)使用snappy,因?yàn)檫@種格式對(duì)于壓縮和解壓縮都相對(duì)較快。還有就是如果你的集群是異構(gòu)的,有些機(jī)器性能好,有些差,那么建議打開(kāi)mapred.reduce.tasks.speculative.execution推測(cè)性執(zhí)行,有利于優(yōu)化進(jìn)程分配,提升集群性能。
上述內(nèi)容就是hadoop性能調(diào)優(yōu)的重要參數(shù)設(shè)置技巧是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:hadoop性能調(diào)優(yōu)的重要參數(shù)設(shè)置技巧是怎樣的
文章源于:http://m.rwnh.cn/article36/iggisg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作、微信小程序、云服務(wù)器、響應(yīng)式網(wǎng)站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)