一、resourcemanager,nodemanager,namenode,datanode

1、内存

(1)java默认

1)最大内存没有配置的话根据java默认最大内存

1.java最大内存-Xmx 的默认值为你当前机器最大内存的 1/4

2.java最小内存-Xms 的默认值为你当前机器最大内存的 1/64)

(2)hadoop_env 文件

配置namenode和datanode(注意在namenode和datanode所在节点的配置文件)

方式一:

export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"

export HDFS_DATENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"

方式二:

export HADOOP_HEAPSIZE_MAX=1024M   export HADOOP_HEAPSIZE_MIN=512M

此配置会同时配置namenode和datanode的最大内存

(3)yarn_env文件

配置resourcemanager内存

export YARN_RESOURCEMANAGER_HEAPSIZE=1024M

配置nodemanager内存

export YARN_NODEMANAGER_HEAPSIZE=1024M

注意:此值的读取顺序为java默认值->HADOOP_HEAPSIZE_MAX->YARN_RESOURCEMANAGER_HEAPSIZE,YARN_NODEMANAGER_HEAPSIZE)

2、CPU

(1)yarn.resourcemanager.scheduler.class  调度器配置,apache默认是容量,CDH默认是公平

(2)yarn.resourcemanager.scheduler.client.thread-count 处理调度器请求的线程数量 默认50 实际设置需要考虑主机线程数

(3)dfs.namenode.handler.count namenode的并发线程数,一般设置为20 × loge(集群数量)

 

二、nodemanager.resource  nodemanager管理的资源 注意和本身JVM进程区分开

1、自动资源检测

yarn.nodemanager.resource.detect-hardware-capabilities  默认是false

如果开启,yarn会自动检测服务器内存和cpu设置nodemanager.resource资源

2、内存

(1)yarn.nodemanager.resource.memory-mb 默认值为-1

如果开启自动检测,按照自动检测的内存大小设置,没有开启默认为8G,设置值时128G内存,配置为100G内存左右

(2)yarn.nodemanager.resource.system-reserved-memory-mb默认值为-1

1)预留给非yarn进程的物理内存数量,以MB为单位, 此配置仅在yarn.nodemanager.resource.detect-hardware-capabilities设置为true和yarn.nodemanager.resource.memory-mb是-1时使用

2)如果设置为-1,这个量计算为(系统内存- 2*HADOOP_HEAPSIZE)的20%  (HADOOP_HEAPSIZE如果设置了 HADOOP_HEAPSIZE_MAX就为此值,没有设置为java最大内存)

(3)yarn.minicluster.yarn.nodemanager.resource.memory-mb默认4G

 nodemanager资源最小值为4G

(4)yarn.nodemanager.pmem-check-enabled  默认true        

 是否开启物理内存检查限制container

(5)yarn.nodemanager.vmem-check-enabled  默认true        

是否开启虚拟内存检查限制container

(6)yarn.nodemanager.vmem-pmem-ratio       默认2.1         

 虚拟内存物理内存比例

个人理解:hadoop一般设置container为1G,但是虚拟内存与堆内存比例为2.1,就是除了堆内存外包含内核内存1.1g

3、CPU

(1)yarn.nodemanager.resource.cpu-vcores         可以分配给容器的vcore数,RM调度程序在为容器分配资源时使用它。

 这不是用来限制YARN容器使用的cpu数量的, 如果它被设置为-1并且yarn.nodemanager.resource.detect-hardware-capabilities为true,将自动从硬件中确定,其他情况下,默认vcores数为8。

(2)yarn.nodemanager.resource.count-logical-processors-as-cores        默认false是否将虚拟核数当作CPU核数

(3)yarn.nodemanager.resource.pcores-vcores-multiplier        默认1,虚拟核数和物理核数乘数,例如:4核8线程,该参数就应设为2

三、Contioner

1、内存

yarn.scheduler.minimum-allocation-mb          默认1G   容器最小内存

yarn.scheduler.maximum-allocation-mb          默认8G  容器最大内存

2、CPU

yarn.scheduler.minimum-allocation-vcores    默认1         容器最小核数

yarn.scheduler.maximum-allocation-vcores    默认4         容器最大核数

实际生产容器最大内存一般设置较大,实际根据MR和spark,flink申请的内存进行动态调整

四、MR

1、内存

(1)Appmaster

1)yarn.app.mapreduce.am.resource.mb   默认1536M 

2)yarn.app.mapreduce.am.resource.cpu-vcores  默认核数为1

(2)map和reduce

1)mapreduce.map.memory.mb :默认-1

为每个map任务从调度程序请求的内存量。如果未指定或为非正数,则从 mapreduce.map.java.opts 和 mapreduce.job.heap.memory-mb.ratio 推断。

如果也未指定 java-opts,默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加MapTask内存,最大可以增加到4-5g。

2)mapreduce.reduce.memory.mb:默认-1

为每个map任务从调度程序请求的内存量。如果未指定或为非正数,则从 mapreduce.reduce.java.opts 和 mapreduce.job.heap.memory-mb.ratio 推断。

如果也未指定 java-opts,默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加ReduceTask内存大小为4-5g。

3)mapreduce.map.java.opts:控制MapTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

4)mapreduce.reduce.java.opts:控制ReduceTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

5)mapreduce.job.heap.memory-mb.ratio 默认0.8,

堆内存大小与容器大小的比例,如果没有指定堆内存大小,那么堆内存大小为容器大小乘以0.8,

如果指定了堆内存大小,没有指定容器大小,那么容器大小为堆内存大小/0.8

 

 

2、CPU

(1)mapreduce.map.cpu.vcores 默认1,可以增加MapTask的CPU核数

(2)mapreduce.reduce.cpu.vcores 默认1,增加ReduceTask的CPU核数

四、Spark

1、内存

(1) driver

1)spark.driver.memory  drive堆内内存  默认1G   --driver-memory命令行

2)spark.driver.memoryOverhead driver堆外内存  默认driverMemory * 0.10,最小为 384M(2.3.0版本新增堆外内存)

3)这两个内存参数相加的总量也不能超过单个Container最多能申请到的内存量

 

 

(2)executor

1)spark.executor.memory  堆内内存  默认1G   --executor-memory命令行 

堆内内存越大,Executor就能缓存更多的数据

2)spark.executor.memoryOverhead  driver堆外内存  默认driverMemory * 0.10,最小为 384M(2.3.0版本新增堆外内存)

用于考虑 VM 开销、内部字符串、其他本机开销等的内存,个人理解:主要用来jvm执行开销和元空间

3)Hive官方提供了一个计算Executor总内存量的经验公式

yarn.nodemanager.resource.memory-mb*(spark.executor.cores/ yarn.nodemanager.resource.cpu-vcores)

(3)内存管理

1)spark.memory.fraction 默认0.6

用于执行和存储的(堆空间 - 300MB)的一部分。该值越低,溢出和缓存数据驱逐发生的频率就越高

此配置的目的是为内部元数据、用户数据结构和稀疏、异常大记录的不精确大小估计留出内存

2)spark.memory.storageFraction 默认0.5 

免于逐出的存储内存量,表示为由spark.memory.fraction. 该值越高,可用于执行的工作内存就越少,任务可能会更频繁地溢出到磁盘

3)spark.memory.offHeap.enabled  默认false 

如果为 true,Spark 将尝试使用堆外内存进行某些操作。如果启用了堆外内存使用,则spark.memory.offHeap.size必须为正。

4)spark.memory.offHeap.size  默认0 可用于堆外分配的绝对内存量(以字节为单位)。

这个设置对堆内存使用没有影响,所以如果你的执行程序的总内存消耗必须符合某个硬限制,那么一定要相应地缩小你的 JVM 堆大小

(4)内存模型

       1)1.6版本新增统一内存管理机制,优化点

1.双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间;(存储空间不足是指不足以放下一个完整的 Block)

2.Execution执行内存的空间被对方占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间

3.存储内存的空间被Execution执行内存占用后,无法让对方"归还",因为需要考虑 Shuffle 过程中的很多因素,实现起来较为复杂

2)模块作用

1.Storage:缓存 RDD 数据和广播变量数据

2.Execution:执行Shuffle时占用的内存

3.RDD的缓存和持久化persist由Spark的Storage模块负责,实现了RDD与物理存储的解耦合

2、Cpu

(1)spark.driver.cores  默认1  绝大多数情况下设为1都够用

(2)spark.executor.cores  默认1

值不能大于单个Container能申请到的最大核心数,即yarn.scheduler.maximum-allocation-vcores的值

通过--num-executors命令指定executors数量,上面所说的固定分配Executor数量的方式可能不太灵活,尤其是在Hive集群面向很多用户提供分析服务的情况下,所以更推荐将spark.dynamicAllocation.enabled参数设为true,以启用Executor动态分配。

五、Flink

1、JobManager 内存分配

(1)方式一:配置jobmanager.memory.process.size

1)jobmanager.memory.process.size: 进程内存无默认值,配置为1600MB

2)jobmanager.memory.jvm-metaspace.size 元空间默认256MB

3)执行开销

jobmanager.memory.jvm-overhead.min=192mb

jobmanager.memory.jvm-overhead.max=1gb

jobmanager.memory.jvm-overhead.fraction=0.1

如果进程内存*浮动系数>max执行开销,执行开销内存为max执行开销

如果进程内存*浮动系数<min执行开销,执行开销内存为min执行开销

否则为进程内存*浮动系数

1600 * 0.1 = 160 < 192,故值为192

4)获取JM的Flink使用内存:进程内存-JVM元空间-执行开销 1600 - 256 -192 = 1146MB

5)获取JM的堆外内存 jobmanager.memory.off-heap.size=128MB,默认 128MB

6)获取JM的堆内内存:使用内存 - 堆外内存 1146 - 128 = 1018MB

(2)方式二:配置jobmanager.memory.heap.size

其余值不变,直接获取堆内内存

2、TaskManager 内存分配

(1)配置jobmanager.memory.process.size

1)taskmanager.memory.process.size:进程内存无默认值,配置为1600MB

2)taskmanager.memory.jvm-metaspace.size元空间默认256MB

3)执行开销

taskmanager.memory.jvm-overhead.min=192mb

taskmanager.memory.jvm-overhead.max=1gb

taskmanager.memory.jvm-overhead.fraction=0.1

如果进程内存*浮动系数>max执行开销,执行开销内存为max执行开销

如果进程内存*浮动系数<min执行开销,执行开销内存为min执行开销

否则为进程内存*浮动系数

1600 * 0.1 = 160 < 192,故值为192

4)获取TM的Flink使用内存:进程内存-JVM元空间-执行开销1600 - 256 -192 = 1146MB

5)获取框架堆内内存taskmanager.memory.framework.heap.size=128MB,默认 128MB

6)获取框架堆外内存taskmanager.memory.framework.off-heap.size=128MB,默认 128MB

7)获取Task堆外内存配置参数:taskmanager.memory.task.off-heap.size=0,默认 0

8)获取管理内存

taskmanager.memory.managed.fraction=0.4

taskmanager.memory.managed.size值为flink内存*浮动系数1146 * 0.4 = 458.4 则管理内存为458.4MB

1.情况一:如果Task堆内内存已配置

a)配置参数:taskmanager.memory.task.heap.size直接设置为384MB

b)如果这时候内存大于Flink使用内存则报错128 + 128 + 0 + 384 + 458.4 = 1098.4 < 1146

c)获取network缓冲flink内存减去其余内存1146 - 1098.4 = 47.6MB

2.情况二:没有设置

a)获取network缓冲

taskmanager.memory.network.fraction: 0.1

taskmanager.memory.network.min: 64mb

taskmanager.memory.network.max: 1gb

如果flink内存*浮动系数>max网络缓冲,执行开销内存为max网络缓冲

如果flink内存*浮动系数<min网络缓冲,执行开销内存为min网络缓冲

否则为进程内存*浮动系数

1146 * 0.1 = 114.6 则网络缓冲为114.6MB

b)如果这时候内存大于Flink使用内存则报错 128 + 128 + 0 + 458.4 + 114.6 = 829 < 1146

c)获取堆内内存:flink内存减去其余内存1146 - 829 = 317MB