您好,登錄后才能下訂單哦!
事件描述:
datanode內存被占用過大,負載過高,查看 hdfs dfsadmin -report 發現狀態為 Dead ,查看datanode日志文件hadoop-sphuser-datanode-XXX.log ,發現下面的錯誤。
2019-05-11 16:20:26,551 ERROR org.apache.hadoop.hdfs.server.datanode.DirectoryScanner: Error compiling report
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
? ? ? ? at java.util.concurrent.FutureTask.report(FutureTask.java:122)
? ? ? ? at java.util.concurrent.FutureTask.get(FutureTask.java:192)
? ? ? ? at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.getDiskReport(DirectoryScanner.java:566)
? ? ? ? at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.scan(DirectoryScanner.java:425)
? ? ? ? at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.reconcile(DirectoryScanner.java:406)
? ? ? ? at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.run(DirectoryScanner.java:362)
? ? ? ? at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
? ? ? ? at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
分析:
GC占用大量時間但釋放很小空間,超出了GC開銷限制。
Sun 官方對此的定義:超過98%的時間用來做GC并且回收了不到2%的堆內存時會拋出 java.lang.OutOfMemoryError 異常。
解決辦法:
加大堆內存
優化GC
1)、編輯 namenode master節點的配置文件 etc/hadoop/hadoop-env.sh ,修改 HADOOP_DATANODE_OPTS 參數為下所示:
export HADOOP_LOG_DIR=/data/hadoop-2.7.3/logs
export HADOOP_DATANODE_OPTS="-Xmx16G -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution"
?
-Xmx 配置為總內存的一半
參數說明:
JVM分別對新生代和舊生代采用不同的垃圾回收機制
并發收集器CMS具有響應時間優先的特點,所以是低延遲、低停頓的,CMS是老年代收集器。
-Xmx16G 堆內存設置為16G
-XX:+UseParNewGC 設置新生代內存收集為并行收集
-XX:+UseConcMarkSweepGC 使用CMS垃圾收集器,來為老年代內存并行收集
-XX:CMSInitiatingOccupancyFraction=80 設置Old區當對象存滿80%的時候觸發Full GC
-XX:+CMSParallelRemarkEnabled 并行運行最終標記階段,加快最終標記的速度,降低標記停頓
-XX:+PrintTenuringDistribution 顯示每次Minor GC時Survivor區中各個年齡段的對象的大小
2)、拷貝配置文件到集群的其他節點,然后重啟服務
參考:
https://www.cnblogs.com/hit-zb/p/8651369.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。