一、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