MR框架的其他組件可用內(nèi)存也是可配置的。map和reduce任務(wù)的性能可以通過從影響操作并發(fā)和數(shù)據(jù)磁盤IO次數(shù)的角度來調(diào)試。監(jiān)控針對單個任務(wù)而設(shè)置的文件系統(tǒng)計數(shù)器,尤其是具體到map輸出到reduce的數(shù)據(jù)字節(jié)量,對調(diào)試影響任務(wù)運行性能都是非常有用的。
如果內(nèi)存管理特性啟用的話,用戶可以選擇性的覆蓋一些默認(rèn)配置,比如虛擬內(nèi)存,RAM。下面是一些對任務(wù)有效的參數(shù):
名稱 | 類型 | 特點 |
mapred.task.maxvmem | int | 以字節(jié)為單位指定單個map或reduce任務(wù)的最大虛擬內(nèi)存。如果任務(wù)超過該值就被kill |
mapred.task.maxpmem | int | 以字節(jié)為單位指定單個map或reduce任務(wù)的最大RAM。這個值被調(diào)度器(Jobtracer)參考作為分配map\reduce任務(wù)的依據(jù),避免讓一個節(jié)點超RAM負(fù)載使用。 |
map讀出的一條記錄將被序列化到一個buffer,元數(shù)據(jù)存儲在元數(shù)據(jù)buffer中。如上面所說,當(dāng)序列化buffer或者元數(shù)據(jù)buffer超出了設(shè)置的闕值,buffer中內(nèi)容將被排序并在后臺寫入到磁盤,這個過程同時map持續(xù)輸出記錄行。如果buffer被寫滿就會發(fā)生一個spill過程,spill中map線程被阻塞。當(dāng)map完成后,buffer中剩余記錄寫入磁盤并和在磁盤的按段存儲的記錄合并到一個文件中。減少spill次數(shù)可以縮短map時間,但是較大的buffer也會降低可用內(nèi)存。
名稱 | 類型 | 特點 |
io.sort.mb | int | 默認(rèn)100。以MB為單位設(shè)置序列化和元數(shù)據(jù)buffer的大小。 |
io.sort.record.percent | float | 默認(rèn)0.05。map記錄序列化后數(shù)據(jù)元數(shù)據(jù)buffer所占總buffer百分比值。為了加速排序,除了序列化后本身尺寸外每條序列化后的記錄需要16字節(jié)的元數(shù)據(jù)。io.sort.mb值被占用的百分比值超過設(shè)定值機會發(fā)生spill。對輸出記錄較少的map,值越高越可降低spill發(fā)生的次數(shù)。 |
io.sort.spill.percent | float | 默認(rèn)0.80。元數(shù)據(jù)和序列化數(shù)據(jù)buffer空間閥值。當(dāng)兩者任何一個buffer空間達(dá)到該閥值,數(shù)據(jù)將被spill到磁盤。假設(shè)io.sort.record.percent=r, io.sort.mb=x,io.sort.spill.percent=q,那么在map線程spill之前最大處理的記錄量為r*x*q*2^16。注意:較大的值可能降低spill的次數(shù)甚至避免合并,但是也會增加map被阻塞的幾率。通過精確估計map的輸出尺寸和減少spill次數(shù)可有效縮短map處理時間。 |
其他注意事項:
如前面所說,每個reduce通過HTTP獲取map輸出后讀入內(nèi)存,并周期性合并這些輸出到磁盤。如果map輸出壓縮打開的話,每個輸出將會解壓后讀入內(nèi)存。下面的配置參數(shù)影響reduce處理中的合并和內(nèi)存分配過程。
名稱 | 類型 | 特點 |
io.sort.factor | int | 默認(rèn)值10。指定同時可合并的文件片段數(shù)目。參數(shù)限制了打開文件的數(shù)目,壓縮解碼器。如果文件數(shù)超過了該值,合并將分成多次。這個參數(shù)一般適用于map任務(wù),大多數(shù)作業(yè)應(yīng)該配置該項。 |
mapred.inmem.merge.threshold | int | 在內(nèi)存中合并到磁盤前讀取已排序map輸出文件的數(shù)目。類似前面說的spill闕值,該值不是一個用來分區(qū)的單元而是一個觸發(fā)器。通常該值較高(1000),或者不啟用(0),畢竟內(nèi)存內(nèi)合并比磁盤上合并成本更低。這個闕值只影響shuffle過程的內(nèi)存合并。 |
mapred.job.shuffle.merge.percent | float | 0.66。內(nèi)存合并前供map輸出享有的內(nèi)存百分比值,超過該值就會合并數(shù)據(jù)到磁盤。過大的值會降低獲取和合并的并行效率。相反如果輸入恰好整個放到內(nèi)存,則可以設(shè)置為1.0。該參數(shù)只影響shuffle過程的內(nèi)存合并頻率。 |
mapred.job.shuffle.input.buffer.percent | float | 默認(rèn)值0.7。shuffle過程中緩存map輸出數(shù)據(jù)的內(nèi)存占整個子jvm進(jìn)程堆最大尺寸(通過mapred.child.java.opts設(shè)置)的百分比。該值可以視情況設(shè)置較高的值來存儲大的較多的map輸出。 |
mapred.job.reduce.input.buffer.percent | float | 0.0 內(nèi)存合并中從內(nèi)存刷到磁盤,直到剩余的map輸出占用的內(nèi)存少于jvm最大堆的該百分比值。默認(rèn)情況下,在reduce開始之前需要保證最大的內(nèi)存可用,所有的內(nèi)存中map輸出都會被合并到磁盤。對內(nèi)存不敏感的reduce任務(wù),該值可以適當(dāng)提高,來避免磁盤IO(一般不會有)。 |
其他注意事項:
可以通過指定mapred.job.reuse.jvm.num.tasks作業(yè)配置參數(shù)來啟用jvm重用。默認(rèn)是1,jvm不會被重用(每個jvm只處理1個任務(wù))。如果設(shè)置為-1,那么一個jvm可以運行同一個作業(yè)的任意任務(wù)數(shù)目。用戶可以通過JobConf.setNumTasksToExecutePerJvm(int)指定一個大于1的值。
下面是作業(yè)執(zhí)行時的配置參數(shù):
名稱 | 類型 | 描述 |
mapred.job.id | string | 表示jobid |
mapred.jar | string | job.jar在job路徑下的位置 |
job.local.dir | string | 作業(yè)共享路徑 |
mapred.tip.id | string | taskid |
mapred.task.id | string | task嘗試任務(wù)id |
mapred.task.is.map | boolean | 是否是map任務(wù) |
mapred.task.partition | int | task在job中的id |
map.input.file | string | map輸入文件路徑 |
map.input.start | long | map輸入split開始偏移量 |
map.input.length | long | map輸入分片的字節(jié)數(shù) |
mapred.work.output.dir | string | 任務(wù)臨時輸出路徑 |
任務(wù)的標(biāo)準(zhǔn)輸出和錯誤流日志由TaskTracker讀入并寫入${HADOOP LOGDIR}/userlogs路徑。
DistributedCache可以被用來發(fā)布map或者reduce用到的jar包、本地共享庫。子JVM進(jìn)程通常可使用java.library.path和LD LIBRARYPATH指定其自身的工作路徑。緩存庫可以通過 System.loadLibrary或者 System.load加載。關(guān)于使用distributed cache 加載共享庫詳細(xì)信息可以查看 Loading native libraries through DistributedCache。
?
原文地址:Hadoop教程(三): MR重要運行參數(shù), 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com