在這篇文章中,我們將會分享一些對Hadoop進行性能調(diào)優(yōu)的方法,技巧。
這篇文章由我在閱讀《Optimizing Hadoop for MapReduce》時,做的筆記,整理而成。
強烈建議讀者去讀一下上面重點標(biāo)注的那本書。這本書,對如何對Hadoop進行性能調(diào)優(yōu),做了非常詳細(xì)的介紹。
進行性能調(diào)優(yōu)的方式
我們可以從下面的幾個方面來對Hadoop進行優(yōu)化:
- 優(yōu)化HDFS
- 調(diào)整參數(shù)使CPU利用地更加充分
- 調(diào)整參數(shù)使內(nèi)存利用地更加充分
- 調(diào)整參數(shù)使磁盤利用地更加充分
- 調(diào)整參數(shù)使網(wǎng)絡(luò)利用地更加充分
- 對JVM進行調(diào)優(yōu)
- 對操作系統(tǒng)進行調(diào)優(yōu)
各個方面的具體參數(shù)
和CPU相關(guān)的參數(shù)
- mapred.tasktracker.map.tasks.maximum: TaskTracker上面,能夠同時運行的map tasks的數(shù)量
- mapred.tasktracker.reduce.tasks.maximum: TaskTracker上面,能夠同時運行的reduce tasks的數(shù)量
和磁盤相關(guān)的參數(shù)
- mapred.compress.map.output: 是否對mapper的輸出進行壓縮
- mapred.output.compress: 是否對job的輸出進行壓縮
- mapred.map.output.compression.codec: 啟用哪個compression codec來對map的輸出進行壓縮
- mapred.local.dir: 存儲mapper的中間結(jié)果的目錄。如果指定了多個目錄,那么就會均勻放置在不同的目錄中。
- dfs.data.dir: DataNode用于存儲數(shù)據(jù)的目錄
和內(nèi)存相關(guān)的參數(shù)
- mapred.child.java.opts: 為每個JVM task分配多大的內(nèi)存
- mapred.child.ulimit: 指定為每個MapReduce job分配的最大虛擬內(nèi)存
- io.sort.mb: 指定mapper的輸出可以占用的內(nèi)存
- io.sort.factor: 指定能夠同時進行排序的文件的個數(shù)
- mapred.job.reduce.input.buffer.percent: Reducer端,用于保存mapper的輸出結(jié)果的內(nèi)存的大小
和網(wǎng)絡(luò)相關(guān)的參數(shù)
- mapred.reduce.parallel.copies: 在Shuffle階段,并行從mapper讀取數(shù)據(jù)的線程的數(shù)量
- topology.script.file.name: 指定用于將DNS解析成主機的腳本的名稱
hdfs-site.xml中和性能調(diào)優(yōu)有關(guān)的參數(shù)
- dfs.access.time.precision: 文件訪問時間戳的精確度。如果設(shè)置成0,則表示不啟用文件訪問時間戳。在負(fù)載很大的時候,能夠提高性能。
- dfs.balance.bandwidthPerSec: 每個DataNode在rebalance block時,能夠使用的最大帶寬
- dfs.block.size: DataNode上block的大小
- dfs.data.dir: DataNode上用于存儲數(shù)據(jù)的目錄
- dfs.datanode.du.reserved: DataNode上保留的空間的大小
- dfs.datanode.handler.count: DataNode上處理block requests的handler的數(shù)量
- dfs.max.objects: 最多能夠存儲的object(包括文件,目錄和block)的數(shù)量
- dfs.name.dir: NameNode上用于存儲數(shù)據(jù)元數(shù)據(jù)的目錄
- dfs.namenode.handler.count: NameNode上用于處理數(shù)據(jù)元數(shù)據(jù)的線程的數(shù)量
- dfs.name.edits.dir: NameNode上存儲edit file的目錄
- dfs.replication: 集群中,每個block的副本的數(shù)量
- dfs.replication.considerLoad: 當(dāng)block在放置的時候,是否考慮data node的負(fù)載
core-site.xml中和性能調(diào)優(yōu)有關(guān)的參數(shù)
- fs.default.name: 默認(rèn)的文件系統(tǒng)
- hadoop.tmp.dir: 用于存儲臨時文件的目錄
- fs.checkpoint.dir: Secondary NameNode用于存儲checkpoints的目錄
- io.file.buffer.size: 當(dāng)讀取或者寫入文件時,可用的緩沖區(qū)的大小
和壓縮相關(guān)的參數(shù)
- io.compression.codec: Hadoop用于確定是否支持特定compression codec
- mapreduce.map.output.compression: 是否對mapper的輸出進行壓縮
- mapreduce.map.output.compress.codec: 對mapper的輸出進行壓縮時,采用哪個compression codec
- mapreduce.output.fileoutputformat.compress: 是否對job的輸出進行壓縮
- mapreduce.output.fileoutputformat.compress.codec: 采用哪個compression codec對job的輸出進行壓縮
- mapreduce.output.fileoutputformat.compress.type: 對于SequenceFile,采用哪種壓縮方式,可選值為NONE或者BLOCK
'
啟用JVM重用
- mapred.job.reuse.jvm.num.tasks: 一個JVM能夠運行的Task的最大值。設(shè)置成-1的話,則這個JVM可以運行無限個Tasks.
其他
這本書中,還詳細(xì)介紹了如何確定Mapper或者Reducer的數(shù)量,如何確定一個HDFS集群中,需要多少個節(jié)點。
關(guān)于這部分內(nèi)容,請自行查看這本書。