关于Hadoop集群物理及虚拟内存的检测的设置说明


写在前面

  • Linux:CentOS7.5
  • Java:JDK8
  • Hadoop:Hadoop3.1.3
  • 场景:离线数仓集群搭建

正文

配置​​yarn-site.xml​​文件

不能关闭对物理内存的检测

  • ​集群规划图​

如下图:

关于Hadoop集群物理及虚拟内存的检测的设置说明_离线数仓

计算任务运行在 ​​NodeManager​​ 的 ​​Container​​ 容器中

  • ​任务运行细节说明​

在 NodeManager 中有一个​​Monitor线程​​,用于​​一直监控NodeManager的内存使用量​​,假设NodeManager 设置为3G,用于后面的资源(如 Kafka、Flume)的内存为1G;

若 NodeManager 内存使用率超过集群机器设置的内存,当 Monitor 线程发现 NodeManager 内存使用即将超过 3G 时,此时为了不让 NodeManager 内存使用量超过设置值,Monitor线程会将nodeManager​​挂掉​​。

  • ​挂掉的原因​​:

一旦 NodeManager 内存使用即将超过 3G,将会「导致后面的组件及框架​​所需要的内存被其挂掉​​,内存被 NodeManager ​​占用​​」,则Kafka、Flume 需要进行 GC(内存不够,进行FullGC,即将自己Pass掉),此时​​数据传输通道不存在​​了,Kafka、Flume这些大数据框架就停止了运转,这是我们不愿意看到的。

我们只希望是 NodeManager 运行的任务挂掉而已,之后我们重新启动这个任务即可,这样不会影响其他组件|组件|框架的使用

故,不需要关闭对物理内存的检测 ​​yarn.nodemanager.pmem-check-enabled​​设置为true(默认就是为true)

关闭对虚拟内存的检测

  • ​原因​​是:

​JDK8与CentOS7存在Bug​

  • 虚拟内存定义

虚拟内存是​​内存和磁盘交互​​的第二个媒介。虚拟内存是指把磁盘的一部分作为​​假想内存​​来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是​​磁盘​​)。

虚拟内存是计算机系统​​内存管理​​的一种技术。它使得应用程序认为它拥有​​连续可用​​的内存(一个完整的地址空间),但是实际上,它通常被分割成多个物理​​碎片​​,还有部分存储在​​外部磁盘管理器​​上,必要时进行数据交换。

​通过借助虚拟内存,在内存不足时仍然可以运行程序。​

例如,在只剩 5MB 内存空间的情况下仍然可以运行 10MB 的程序。由于 CPU 只能执行加载到内存中的程序,因此,虚拟内存的空间就需要和内存中的空间进行置换(swap),然后运行程序。

又如:有时候电脑内存占比高达99%甚至于100%,但是你的电脑仍然可以继续工作,只不过是很卡而已,原因是超出的部分工作是在磁盘上运行的

  • ​离线数仓​​之虚拟内存的应用

如果物理内存不够用,则采用虚拟内存计算一部分资源

假设一台机器内存为​​4G​​,目前4G已经​​被占满​​,此时会将资源放置到​​虚拟内存​​来计算,由于4G内存已被占据完毕,本质上是在​​磁盘​​上计算的.

CentOS7会预留出一部分内存给JDK

关于Hadoop集群物理及虚拟内存的检测的设置说明_离线数仓_02

JDK实际使用的虚拟内存占比比​​CentOS7会预留给JDK的虚拟内存​​低,可能会出现任务挂掉的情况,会有报错产生。 关闭对虚拟内存的检测,即将​​yarn.nodemanager.vmem-check-enabled​​设置为false,可以忽略过报错,依然可以继续运行

关于虚拟内存的大小,Hadoop官网说明如下:

yarn.nodemanager.pmem-check-enabled true
yarn.nodemanager.vmem-check-enabled true
yarn.nodemanager.vmem-pmem-ratio 2.1

虚拟内存和物理内存的比例关系是:​​2.1倍​

物理内存此时有4G,则对应的虚拟内存为8.2G

预留出来给JDK的虚拟内存可能高达6G,而实际使用的虚拟内存低于3G

参考

​https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-common/yarn-default.xml​

结束