0


【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理》系列(已完结),共包含以下 4 篇文章:

  • Flink 内存管理(一):设置 Flink 进程内存
  • Flink 内存管理(二):JobManager 内存分配(含实际计算案例)
  • Flink 内存管理(三):TaskManager 内存分配(理论篇)
  • Flink 内存管理(四):TaskManager 内存分配(实战篇)

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 内存管理(一):设置 Flink 进程内存 

Apache Flink 通过严格控制各种组件的内存使用,在 JVM 上提供高效的工作负载。虽然社区努力为所有配置提供合理的默认值,但用户在 Flink 上部署的应用程序种类繁多,这意味着这并非总是可行。为了向用户提供最大的生产价值,Flink 允许对集群内的内存分配进行高级和精细调整。

1.配置 Total Memory

Flink JVM 进程的总内存Flink 应用程序消耗的内存

Total Flink Memory

)和 JVM 进程消耗的内存 组成。

在这里插入图片描述
在 Flink 中设置内存的最简单方法是配置以下两个选项之一:
组件Option for TaskManagerOption for JobManagerTotal Flink memory

taskmanager.memory.flink.size
jobmanager.memory.flink.size

Total process memory

taskmanager.memory.process.size
jobmanager.memory.process.size
  • 其余内存组件将根据默认值或附加配置选项自动调整。
  • 配置 Flink 总内存(Total Flink Memory)更适合独立部署,因为在这种情况下,您需要声明给 Flink 本身分配多少内存。Flink 总内存分为 JVM 堆内存JVM Heap)和 堆外内存Off-heap Memory)。
  • 如果配置总进程内存(Total Process Memory),则表示应为 Flink JVM 进程分配多少内存。对于容器化部署,它对应于所请求容器的大小。

另一种设置内存的方法是配置总 Flink 内存所需的内部组件,这些组件针对具体的 Flink 进程。

必须使用上述三种方法之一配置 Flink 的内存(本地执行除外),否则 Flink 启动将失败。这意味着必须明确配置以下选项子集之一,这些子集没有默认值:
for TaskManagerfor JobManager

taskmanager.memory.flink.size
jobmanager.memory.flink.size
taskmanager.memory.process.size
jobmanager.memory.process.size
taskmanager.memory.task.heap.size

taskmanager.memory.managed.size
jobmanager.memory.heap.size

⭕ 不建议明确配置总的进程内存(

Total Process Memory

)和总的 Flink 内存(

Total Flink Memory

)。这可能会因潜在的内存配置冲突而导致部署失败。配置其他内存组件也需要谨慎,因为可能会产生更多的配置冲突。

2.JVM 参数

Flink 在启动进程时,会根据配置或导出的内存组件大小,显式添加以下与内存相关的 JVM 参数。
JVM 参数Value for TaskManagerValue for JobManager**-Xmx and -Xms**

Framework

+

Task Heap Memory
JVM Heap Memory

(Ⅰ)-XX:MaxDirectMemorySize

Framework

+

Task Off-heap

(Ⅱ) +

Network Memory
Off-heap Memory

(Ⅱ),(Ⅲ)-XX:MaxMetaspaceSize

JVM Metaspace
JVM Metaspace
  • (Ⅰ)请记住,根据所使用的 GC 算法,您可能无法使用全部堆内存。有些 GC 算法会为自己分配一定量的堆内存。这将导致堆指标返回不同的最大值。
  • (Ⅱ)请注意,用户代码中的本地非直接内存使用也可以作为堆外内存的一部分。
  • (Ⅲ)只有设置了相应的 jobmanager.memory.enable-jvm-direct-memory-limit 选项,才会为 JobManager 进程添加 JVM 直接内存限制。

3.根据比例限制的组件(Capped Fractionated Components)

本节将介绍一些选项的配置细节,这些选项可以是其他内存大小的一部分,同时受到 最小 - 最大范围 的限制,例如:

  • JVM Overhead 可以是总进程内存的一部分。
  • 网络内存(Network Memory)可以是 Flink 总内存的一部分(仅适用于 TaskManager)。

这些组件的大小必须始终介于最大值和最小值之间,否则 Flink 启动将失败。最大值和最小值都有默认值,也可以通过相关的设置来显式设置。

  • total Process memory = 1000 M B 1000MB 1000MB
  • JVM Overhead min = 64 M B 64MB 64MB
  • JVM Overhead max = 128 M B 128MB 128MB
  • JVM Overhead fraction = 0.1 0.1 0.1

那么 JVM Overhead 将是

     1000 
    
   
     M 
    
   
     B 
    
   
       
    
   
     × 
    
   
       
    
   
     0.1 
    
   
     = 
    
   
     100 
    
   
     M 
    
   
     B 
    
   
  
    1000MB\ ×\ 0.1 = 100MB 
   
  
1000MB × 0.1=100MB,在  
 
  
   
   
     64 
    
   
     − 
    
   
     128 
    
   
     M 
    
   
     B 
    
   
  
    64 - 128MB 
   
  
64−128MB 范围内。

请注意,如果配置相同的最大值和最小值,就会有效地将大小固定为该值。

如果没有明确配置组件内存,那么 Flink 将根据总内存使用比例来计算内存大小。计算值的上限为相应的最小/最大选项。例如,如果只设置了以下内存选项:

  • total Process memory = 1000 M B 1000MB 1000MB
  • JVM Overhead min = 128 M B 128MB 128MB
  • JVM Overhead max = 256 M B 256MB 256MB
  • JVM Overhead fraction = 0.1 0.1 0.1

那么 JVM Overhead 将为

     128 
    
   
     M 
    
   
     B 
    
   
  
    128MB 
   
  
128MB,因为根据比例得出的大小为  
 
  
   
   
     100 
    
   
     M 
    
   
     B 
    
   
  
    100MB 
   
  
100MB,小于最小值。

如果定义了总内存及其他组件的大小,比例也可能被忽略。在这种情况下,JVM Overhead 就是总内存的其余部分。导出值仍必须在最小/最大范围内,否则配置将失败。例如,假设只设置了以下内存选项:

  • total Process memory = 1000 M B 1000MB 1000MB
  • task heap = 100 M B 100MB 100MB
  • JVM Overhead min = 64 M B 64MB 64MB
  • JVM Overhead max = 256 M B 256MB 256MB
  • JVM Overhead fraction = 0.1 0.1 0.1

进程内存总量的所有其他部分都有默认值,包括默认

Managed Memory

分数(或 JobManager 中的

Off-heap Memory

)。这样,JVM Overhead 就不是比例(

     1000 
    
   
     M 
    
   
     B 
    
   
     × 
    
   
     0.1 
    
   
     = 
    
   
     100 
    
   
     M 
    
   
     B 
    
   
  
    1000MB × 0.1 = 100MB 
   
  
1000MB×0.1=100MB),而是总进程内存的其余部分,要么在  
 
  
   
   
     64 
    
   
     − 
    
   
     256 
    
   
     M 
    
   
     B 
    
   
  
    64 - 256MB 
   
  
64−256MB 范围内,要么失败。

本文转载自: https://blog.csdn.net/be_racle/article/details/136263713
版权归原作者 G皮T 所有, 如有侵权,请联系我们删除。

“【大数据】Flink 内存管理(一):设置 Flink 进程内存”的评论:

还没有评论