內存調優
Hadoop處理數據時,出現內存溢出的處理方法?(內存調優)
1、Mapper/Reducer階段JVM內存溢出(一般都是堆)
1)JVM堆(Heap)內存溢出:堆內存不足時,一般會拋出如下異常:
第一種:“java.lang.OutOfMemoryError:” GC overhead limit exceeded;
第二種:“Error: Java heapspace”異常信息;
第三種:“running beyondphysical memory limits.Current usage: 4.3 GB of 4.3 GBphysical memoryused; 7.4 GB of 13.2 GB virtual memory used. Killing container”。
2) 棧內存溢出:拋出異常為:java.lang.StackOverflflowError
常會出現在SQL中(SQL語句中條件組合太多,被解析成為不斷的遞歸調用),或MR代碼中有遞歸調用。這種深度的遞歸調用在棧中方法調用鏈條太長導致的。出現這種錯誤一般說明程序寫的有問題。
2、MRAppMaster內存不足
如果作業的輸入的數據很大,導致產生了大量的Mapper和Reducer數量,致使MRAppMaster(當前作業的管理者)的壓力很大,最終導致MRAppMaster內存不足,作業跑了一般出現了OOM信息
異常信息為:
Exception: java.lang.OutOfMemoryError thrown from theUncaughtExceptionHandler in thread
"Socket Reader #1 for port 30703
Halting due to Out Of Memory Error...
Halting due to Out Of Memory Error...
Halting due to Out Of Memory Error...
3、非JVM內存溢出
異常信息一般為:java.lang.OutOfMemoryError:Direct buffffer memory
自己申請使用操作系統的內存,沒有控制好,出現了內存泄露,導致的內存溢出。錯誤解決參數調優
1、Mapper/Reducer階段JVM堆內存溢出參數調優
目前MapReduce主要通過兩個組參數去控制內存:(將如下參數調大)
Maper:
mapreduce.map.java.opts=-Xmx2048m(默認參數,表示jvm堆內存,注意是mapreduce不是mapred)
mapreduce.map.memory.mb=2304(container的內存)
Reducer:
mapreduce.reduce.java.opts=-=-Xmx2048m(默認參數,表示jvm堆內存)
mapreduce.reduce.memory.mb=2304(container的內存)
注意:因為在yarn container這種模式下,map/reduce task是運行在Container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大於mapreduce.map(reduce).java.opts值的大小。mapreduce.{map|reduce}.java.opts能夠通過Xmx設置JVM最大的heap的使用,一般設置為0.75倍的memory.mb,因為需要為java code等預留些空間
2、MRAppMaster:
yarn.app.mapreduce.am.command-opts=-Xmx1024m(默認參數,表示jvm堆內存)yarn.app.mapreduce.am.resource.mb=1536(container的內存)注意在Hive ETL里面,按照如下方式設置:set mapreduce.map.child.java.opts="-Xmx3072m"(注:-Xmx設置時一定要用引號,不加引號各種錯誤)set mapreduce.map.memory.mb=3288
或
set mapreduce.reduce.child.java.opts="xxx"
set mapreduce.reduce.memory.mb=xxx
涉及YARN參數:
•yarn.scheduler.minimum-allocation-mb (最小分配單位1024M)
•yarn.scheduler.maximum-allocation-mb (8192M)
•yarn.nodemanager.vmem-pmem-ratio (虛擬內存和物理內存之間的比率默認 2.1)
•yarn.nodemanager.resource.memory.mb
Yarn的ResourceManger(簡稱RM)通過邏輯上的隊列分配內存,CPU等資源給application,默認情況下RM允許最大AM申請Container資源為8192MB(“yarn.scheduler.maximum-allocation-mb“),默認情況下的最小分配資源為1024M(“yarn.scheduler.minimum-allocation-mb“),AM只能以增量(”yarn.scheduler.minimum-allocation-mb“)和不會超過(“yarn.scheduler.maximum-allocationmb“)的值去向RM申請資源,AM負責將(“mapreduce.map.memory.mb“)和
(“mapreduce.reduce.memory.mb“)的值規整到能被(“yarn.scheduler.minimum-allocation-mb“)整除,RM會拒絕申請內存超過8192MB和不能被1024MB整除的資源請求。(不同配置會有不同)