您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Hadoop如何調優,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
一 HDFS相關的調優
關于HDFS的參數調優,第一個就是數據塊的大小dfs.block.size,之前默認是64m,hadoop 2.x好像已經改為128m了,如果網絡環境比較好,建議根據實際業務需求,適當的調大一些。
其他的例如設置文件的備份數目,默認是3,一般不建議更改。一份保存在datanode節點上,一份保存在同一個機架的其他節點上,另一份保存在其他的機架上,默認情況下,數據是隨機分配在各個節點上的,但是可以通過設置機架感知,使得數據在節點間的網絡傳輸減少。
配置如下:在namenode的節點配置hdfs-site.xml
<property> <name>topology.script.file.name</name> <value>/path/to/RackAware.py</value> </property
輸入某臺datanode的ip,返回該ip對應的機架。是在腳本中實現的。
#! /usr/bin/python import sys rack={"192.168.1,15":"rack1", "192.168.1.16":"rack1", "192.168.1.17":"rack2", "192.168.1.18":"rack2"} if __name__=="__main__": print "/"+rack.get(sys.argv[1],"rack0"}
設置mapred.local和dfs.data.dir,這兩個參數配置的值應當分布在各個磁盤的目錄上。
二 mapreduce的調優
首先從map階段說起,就是設置map的個數問題,默認只有一個map線程,設置map參數的個數是mapred.map.tasks reduce則是mapred.reduce.tasks。因為這兩個參數的設置是影響到整個集群的,就是說會考慮到單臺機器上的map,reduce個數。map.tasktracker.map.tasks.maxinum和map.tasktracker.reduce.tasks.maxinum這兩個參數設置了一臺機器上最多能同時運行的map和reduce數目。還有,就是map和reduce之間是怎么樣的配比比較好呢?通過觀察web界面,查看map和reduce的進度,可以發現當reduce執行到33%時候,map正好執行100%,所以我們可以在控制reduce啟動的時間,不讓reduce在等待。
當map,reduce個數確定了,根據業務需要,最好設置Combiner 。然后是設置map輸出結果到緩存的大小,因為每一個map或者reduce都是一個task,都會啟動一個jvm,,io.sort.mb就是分配map端buffer的大小,等于mb*io.sort.spill.percent。
對于map的結果,我們可以設置壓縮,減少網絡傳輸。那么建議打開mapred.compress.map.output壓縮選項,并配置 mapred.map.output.compression.codec壓縮編碼格式,一般都會使用snappy,因為這種格式對于壓縮和解壓縮都相對較快
還有如果你的集群是異構的,有的機器好,有的機器性能差,建議打開推測性執行,打開mapred.reduce.tasks.speculative.execution,有利于優化進程分配,提高集群性能。
在reduce階段,從map端拷貝數據時,可以設置最大并行拷貝線程數,這些線程會同時從不同的datanode上去map結果 設置mapred.reduce.parallel.copies
下面是一些調優的參數列表:
name | 說明 |
mapred.task.profile | 是否對任務進行profiling,調用java內置的profile功能,打出相關性能信息 |
mapred.task.profile.{maps|reduces} | 對幾個map或reduce進行profiling。非常影響速度,建議在小數據量上嘗試 |
mapred.job.reuse.jvm.num.tasks | 1表示不reuse,-1表示無限reuse,其他數值表示每個jvm reuse次數。reuse的時候,map結束時不會釋放內存! |
mapred.{map|reduce}.tasks.speculative.execution | 會對運行慢的任務起一個備份任務,看哪個先完成,kill掉后完成的備份 |
io.sort.spill.percent | 開始spill的內存比例閾值,對map和reduce都生效 |
mapred.job.shuffle.input.buffer.percent | reduce在copy時使用的堆空間的比例 |
mapred.tasktracker.{map|reduce}.tasks.maximum | 一個Tasktracker上可同時運行的最大map、reduce任務數 |
mapred.reduce.copy.backoff | reduce獲取一份map輸出數據的最大時間,單位秒。 |
io.compression.codecs | 壓縮算法 |
dfs.block.size | hdfs上的文件block大小 |
mapred.reduce.slowstart.completed.maps | 控制reduce的啟動時機。表示全部map的百分之多少完成后,才啟動reduce。如果機器內存緊張,可以適當設大改參數,等大部分map結束并釋放內存后才啟動reduce;如果希望盡快開始shuffle,則可配合大量map數,將該值設小,以盡早啟動reduce,開始copy。 |
io.sort.mb | map使用的緩存,影響spill的次數。 |
mapred.child.java.opts | 同時設置map和reduce的jvm參數 |
mapred.map.child.java.opts | 分開設置map的jvm參數,包括GC策略 |
mapred.reduce.child.java.opts | 分開設置reduce的jvm參數 |
map.sort.class | 對map的輸出key的排序方法 |
mapred.output.compression.type | 壓縮類型 |
mapred.min.split.size | 每個map的最小輸入大小,該值越大,map數越少 |
mapred.max.split.size | 每個map的最大輸入大小,該值約小,map數越多 |
mapred.reduce.parallel.copies | reduce從map結果copy數據時,每個reduce起的并行copy線程數。該值越大,io壓力越大,但可能引起網絡堵塞,copy效率反而降低。 |
io.sort.factor | merge時的并行merge數,同時影響map的spill文件merge和reduce中的merge |
mapred.compress.map.output | 指定map的輸出是否壓縮。有助于減小數據量,減小io壓力,但壓縮和解壓有cpu成本,需要慎重選擇壓縮算法。 |
mapred.map.output.compression.codec | map輸出的壓縮算法 |
mapred.output.compress | reduce輸出是否壓縮 |
mapred.output.compression.codec | 控制mapred的輸出的壓縮的方式 |
io.sort.record.percent | map中間數據的index和data在io.sort.mb中占內存的比例,默認0.05%,需要根據具體數據的特點調整:index的大小固定為16byte,需要根據data的大小調整這個比例,以使io.sort.mb的內存得到充分利用)。 |
關于“Hadoop如何調優”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。