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