HDFS檔案系統調優
1、系統角度
儲存方式,NameNode採用raid1+0,DataNode採用磁碟組JBOD方式
在順序讀檔案的情境中,比如mapreduce,可以調整檔案系統預讀緩衝的大小。
檔案掛載設定noaptime、nodiratime,提升檔案系統的效能
2、hdfs的參數最佳化
dfs.namenode.handler.count(預設是10,調大一些64)
dfs.datanode.handler.count(預設是3,調大一下,8)
dfs.datanode.max.xcievers(預設是256,設定大一些4096),datanode所允許同時執行的發送和接受任務的數量,類似於linux上的檔案控制代碼限制
dfs.replication(3)
dfs.block.size(預設是64M,設定為128M,或者更大)
dfs.name.dir(多個位置冗餘備份,一份在本地,另外一份NFS )
dfs.data.dir(多個位置分布式儲存,盡量多分布幾個分區目錄)
MapReduce調優
1、Map端的調優(map>partion sort>spill>merge)
a、對磁碟和記憶體的影響的角度:
mapred.local.dir(盡量多分布幾個分區目錄)
io.sort.mb(預設100M,設定成200M),調大,減少對磁碟的影響,不過需要考慮記憶體的大小
io.sort.factor(預設是10),增大,可以減少merge時對磁碟的訪問次數,不過需要考慮記憶體的大小
io.sort.spill.percent(預設是0.8),buffer中達到80%時,進行spill。
io.sort.record.percent(0.05),用來儲存索引數組的百分比(記憶體Buffer包括兩個數組,一個是索引數組,索引數組的每個元素大小是固定的,一個是資料Buffer,索引數組中 包含key value在資料Buffer中的位移量,便於在spill寫本地檔案時,一個一個的key value定位寫)
min.num.spill.for.combine(3),如果設定combine函數,且spill檔案最少3個時,在merge之前做combine操作,減少資料量,間接減少對磁碟的訪問
mapred.compress.map.output/ Mapred.output.compress(LZO),啟用壓縮,減少IO的影響,需要考慮CPU的影響
mapred.child.java.opts(設定成1G)
b、並發處理能力角度
mapred.job.tracker.handler.count(60),job traker用於處理RPC的線程數
tasktracker.http.threads(預設是40),tasktracker開啟的http服務,用於copy資料
mapred.tasktracker.map.tasks.maximum(預設是2,一般設為(core_per_node)/2~2*(cores_per_node),目前多為6--8core)
2、reduce端調優(copy->sort>reduce)
a、對磁碟和記憶體的影響
io.sort.factor(同map端)
mapred.job.shuffle.input.buffer.percent(0.7 of reduce heap),類似於map端的io.sort.mb,shuffle最大使用的記憶體量
mapred.job.shuffle.merge.percent(0.66 of mapred.job.shuffle.input.buffer.percent),到達這個值時,做merge操作,就flush到磁碟
mapred.job.reduce.input.buffer.percent(sort完成後reduce計算階段用來快取資料的百分比)
b、並發處理能力角度
mapred.reduce.copy.backoff(reduce下載線程的最大時間,300s)
mapred.reduce.parallel.copies(shuffle階段copy線程數,預設是5,可以設定為40),對於map數量較多的情境,可以設定大一點
mapred.tasktracker.reduce.tasks.maximum(預設是2)