CDH内存调拨过度警告分析
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢
1.问题描述
Hadoop应用程序或者Yarn的作业随机的出现OutOfMemory(OOM),在Cloudera Manager界面显示如下警告:
ip-172-31-24-169.ap-southeast-1.compute.internal: Memory Overcommit Validation Threshold Suppress...
Memory on host ip-172-31-24-169.ap-southeast-1.compute.internal is overcommitted. The total memory allocation is 16.5 GiB bytes but there are only 15.3 GiB bytes of RAM (3.1 GiB bytes of which are reserved for the system). Visit the Resources tab on the Host page for allocation details. Reconfigure the roles on the host to lower the overall memory allocation. Note: Java maximum heap sizes are multiplied by 1.3 to approximate JVM overhead.
(可左右滑动)
2.问题分析
Cloudera Manager5会针对每台主机计算CDH和Cloudera Management Services使用的内存总量的最大内存提交量。如果它计算的内存过度提交,则会显示该告警。
- 该计算方式是对可以使用的最大内存量的估算,并作为指导,以避免内存过度分配,并主动防御系统主机OutOfMemory。
- 对于运行Cloudera Manager4或未运行Cloudera Manager的群集需要手动完成。
3.问题解决
检查每个主机内存过度提交的计算方式如下:
commit = available_memory_for_hadoop - total_hadoop_java_heap - impala_memory
if (total_system_memory * 0.8) < ( sum(java_heap_of_processes) * 1.3 + impala_memory) then flag over-committed
(可左右滑动)
这里我们使用集群的一个节点(ip-172-31-24-169.ap-southeast-1.compute.internal)来做说明,讲解内存调拨过度的计算方式,该节点的总内存约为:15.3GB
1.available_memory_for_hadoop内存计算方式,需要为操作系统和非Hadoop进程预留一定比例的系统内存
available_memory_for_hadoop = (total_system_memory * 0.8)
(可左右滑动)
“0.8”值是Cloudera Manager中的默认值,需要根据具体主机的环境进行调整。
对于具有16G内存的主机,预留20%的操作系统内存(3.2G)可能还不够。
对于具有256G内存的主机,预留20%的操作系统内存(51.2G)可能太多了。
进入主机列表界面
点击“配置”,搜索“Memory Overcommit Validation Threshold”或“内存调拨过度验证阈值”
修改相应数据,保存配置,无需要重启。
该节点默认配置的可以内存阈值为0.8,所以该节点需要预留3.1GB的内存给操作系统:
available_memory_for_os = (15.3GB * (1-0.8)) 约为3.1GB
(可左右滑动)
2.计算主机上所有Java Heap并乘以1.3来作为JRE内存开销
total_hadoop_java_heap = sum ( hadoop_java_heaps ) * 1.3
(可左右滑动)
确定主机上运行的角色
在Cloudera Manager中查找每个角色的Java Heap大小,例操作如下:
- 这里以HBase为,进入HBase服务页面点击“配置”,搜索“Java 堆栈大小(字节)”或者“Java Heap Size of HBase * in Bytes”
当前这个节点的Java角色只有“Master”和“RegionServer”,所以该节点的HBase占用内存为(1GB + 1GB) * 1.3
- DataNode角色的Java Heap大小为
- NodeManager角色的Java Heap大小为
- Zookeeper角色的Java Heap大小为
进入Zookeeper服务,点击“配置”搜“Java Heap Size of in Bytes”
- 该节点上有DataNode角色,需要进行如下内存计算
进入HDFS服务页面,点击“配置”搜“dfs.datanode.max.locked.memory”
- 该节点有NodeManager角色,需要进行如下内存计算
进入YARN服务页面,点击“配置”搜“yarn.nodemanager.resource.memory-mb”
- 该节点有Impala Daemon角色,角色使用内存为
进入Impala服务,点击“配置”或“Configuration”,搜索“mem_limit”
- 该节点有Kudu Tablet Server角色,角色使用内存为
进入Kudu服务,点击“配置”或“Configuration”搜索“memory_limit”
3.通过第2步找到该节点上所有角色内存配置如下
接下来我们来计算该节点Hadoop服务可用内存大小
total_hadoop_java_heap= (1GB + 1GB + 1GB + 1GB +1GB) * 1.3
所以这里计算出来总共使用的total_Hadoop_java_heap大小为6.5GB
该节点上所有角色使用的内存总和为:16.5GB
total_memory_use= total_hadoop_java_heap + 3GB + 3GB + 3GB + 1GB
通过以上的计算方式得出,该节点所有角色使用的总内存为16.5GB,但操作系统总内存为15.3GB(其中有3.1GB留给操作系统),该计算结果与Cloudera Manager界面警告一致。
4.总结
- 如果节点的内存调拨过度,可能会导致Hadoop应用和Yarn的作业随机出现OutOfMemory异常,需要根据集群节点角色的内存分配情况进行调整
- 在设置“Memory Overcommit Validation Threshold”该参数时需要根据主机节点内存的真实情况进行合理设置,否则会造成内存浪费或系统内存不足。
- 在计算节点内存使用情况时,只有Java Heap的内存需要乘以1.3,其它内存则根据实际配置计算即可,这里的1.3是对Hadoop的累积经验,是一种“经验法则”。
提示:代码块部分可以左右滑动查看噢 为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
- 美团再出幺蛾子,启动美团打车项目,滴滴感到威胁了吗?
- 深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
- 深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
- 域名quco.com近10万元被交易
- Silverlight本地化
- Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs
- Silverlight本地化
- Silverlight 3 创建一个简单的Behavior
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
- Silverlight 3.0 中的 Local Connection
- 学习Spark——那些让你精疲力尽的坑
- 学习Spark——那些让你精疲力尽的坑
- Silverlight 3.0 中的 WriteableBitmap
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Jenkins CLI 命令行 v0.0.30
- 2020新鲜出炉的“面筋”,够刁钻
- Spring注解配置应该怎么玩
- 算法篇:链表之倒数第k个节点
- 彻底搞懂 Java 线程池,干啥都不再发憷
- Android Camera1中的对焦与测光
- 使用R语言获得16S物种丰度
- 二叉树的基础---四种遍历方式的 Java 实现
- MySQL 架构与历史
- 通过案例学Python之assert
- Spring Boot入门系列(十六)整合pagehelper,一秒实现分页功能!
- Python文件的读写
- Python正则表达式(下)
- spring boot 如何统一处理 Filter、Servlet 中的异常信息
- 10分钟理解Focal loss数学原理与Pytorch代码(翻译)