1. 增加系統物理內存
Hadoop作為分布式計算框架,對內存需求極高(尤其是NameNode、DataNode、ResourceManager等核心組件)。若頻繁出現內存不足(OOM)錯誤,優先通過硬件升級增加Ubuntu服務器的物理內存(如從8GB擴容至16GB及以上),這是解決內存瓶頸的根本途徑。
2. 調整YARN容器內存配置(YARN集群)
YARN是Hadoop的資源管理系統,負責分配容器(Container)內存。需修改yarn-site.xml文件,關鍵參數如下:
yarn.nodemanager.resource.memory-mb:設置每個NodeManager節點可分配的總內存(如8GB集群可設為8192MB),需小于等于節點實際物理內存;yarn.scheduler.minimum-allocation-mb:YARN分配給單個容器的最小內存(如1024MB),避免容器申請過小內存導致碎片化;yarn.scheduler.maximum-allocation-mb:YARN分配給單個容器的最大內存(如8192MB),需與yarn.nodemanager.resource.memory-mb一致或略小。sudo systemctl restart hadoop-resourcemanager hadoop-nodemanager。3. 優化MapReduce任務內存設置
MapReduce任務的JVM堆內存不足是常見問題,需調整mapred-site.xml(Hadoop 2+版本使用mapreduce前綴):
mapreduce.map.memory.mb:設置Map任務容器的內存大?。ㄈ?code>4096MB);mapreduce.reduce.memory.mb:設置Reduce任務容器的內存大?。ㄍǔ1萂ap任務大,如8192MB);mapreduce.map.java.opts/mapreduce.reduce.java.opts:設置Map/Reduce任務的JVM最大堆內存(需小于容器內存,建議為容器內存的70%-80%,如-Xmx3072m)。4. 調整HDFS NameNode/Datanode內存
NameNode負責元數據管理,Datanode負責數據存儲,兩者的內存配置需滿足數據規模需求:
hdfs-site.xml中,設置dfs.namenode.memory.size(NameNode內存,如4096MB)和dfs.datanode.memory.size(Datanode內存,如2048MB);dfs.namenode.handler.count(NameNode處理請求的線程數)和dfs.datanode.handler.count(Datanode處理請求的線程數)可根據集群規模調整(如100),避免因線程過多導致內存溢出。5. 優化JVM垃圾回收(GC)
大型Hadoop任務易觸發頻繁Full GC,導致內存占用過高甚至進程崩潰??赏ㄟ^以下方式優化:
mapred-site.xml中,為Map/Reduce任務設置GC參數,如mapreduce.map.java.opts添加-XX:+UseG1GC(使用G1垃圾回收器,適合大內存場景)和-XX:MaxGCPauseMillis=200(設置最大GC停頓時間);6. 啟用數據壓縮
中間數據(Map輸出)和最終結果的壓縮可減少內存占用和網絡傳輸:
mapred-site.xml中,設置mapreduce.map.output.compress為true(啟用Map輸出壓縮)和mapreduce.output.fileoutputformat.compress為true(啟用最終輸出壓縮);snappy,壓縮速度快,適合Hadoop場景),通過mapreduce.map.output.compress.codec(Map輸出壓縮編解碼器)和mapreduce.output.fileoutputformat.compress.codec(最終輸出壓縮編解碼器)設置(如org.apache.hadoop.io.compress.SnappyCodec)。7. 調整HDFS塊大小
增大HDFS塊大小可減少Map任務數量(每個塊對應一個Map任務),從而降低內存開銷:
hdfs-site.xml中,修改dfs.blocksize參數(單位:字節),如設置為268435456(256MB,默認128MB)。需根據數據訪問模式調整(如大文件適合大塊,小文件適合小塊)。8. 監控與持續優化
使用監控工具(如Ganglia、Ambari、Cloudera Manager)實時跟蹤集群內存使用情況(如NodeManager內存占用、Map/Reduce任務內存消耗),識別內存瓶頸(如某個節點內存使用率長期超過80%)。根據監控數據定期調整配置(如增加內存不足節點的資源分配),確保集群穩定運行。