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

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

 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连  吧 (点赞 李、关注 、收藏 )!!!您的支持  将激励  博主输出更多优质内容!!!

Flink 内存管理(四):TaskManager 内存分配(实战篇)

1.单独分配 Total Process Size2.单独分配 Total Flink Size3.单独分配 Heap Size && Managed Memory4.分配 Total Process Size 和 Heap Size && Managed Memory5.分配 Total Flink Size 和 Heap Size && Managed Memory6.内存分配小结

在 《Flink 内存管理(一):设置 Flink 进程内存》中我们提到,必须使用下述三种方法之一配置 Flink 的内存(本地执行除外),否则 Flink 启动将失败。这意味着必须明确配置以下选项子集之一,这些子集没有默认值。

序号for TaskManagerfor JobManager1️⃣taskmanager.memory.flink.sizejobmanager.memory.flink.size2️⃣taskmanager.memory.process.sizejobmanager.memory.process.size3️⃣taskmanager.memory.task.heap.size 和 taskmanager.memory.managed.sizejobmanager.memory.heap.size

1.单独分配 Total Process Size

单独分配 Total Process Size,其它的组件都会自动分配。

taskmanager.memory.process.size: 2000m

内存分配步骤如下:

首先 Total Process Size

=

2000

M

= 2000M

=2000M因为没有显示分配组件中的任何参数,所以 JVM Overhead

=

2000

M

×

0.1

=

200

M

= 2000M × 0.1 = 200M

=2000M×0.1=200MJVM Metaspace

=

256

M

= 256M

=256M⭐ 所以 Native Memory = JVM Overhead + JVM Metaspace

=

456

M

= 456M

=456MTotal Flink Size

=

2000

M

200

M

256

M

=

1544

M

B

=

1.508

G

B

= 2000M - 200M - 256M = 1544MB = 1.508GB

=2000M−200M−256M=1544MB=1.508GBNetwork Memory

=

1544

×

0.1

=

154.4

M

= 1544 × 0.1 = 154.4M

=1544×0.1=154.4MTask Off-Heap

=

=

=

0

M

B

0MB

0MB(默认)Framework Off-Heap

=

=

=

128

M

128M

128M(默认)⭐ 所以 Total Direct Memory

=

154.4

M

+

0

+

128

M

=

282.4

M

= 154.4M + 0 + 128M = 282.4M

=154.4M+0+128M=282.4MManaged Memory

=

1544

M

B

×

0.4

=

617.6

M

= 1544MB × 0.4 = 617.6M

=1544MB×0.4=617.6MTotal JVM Heap Memory

=

1544

M

282.4

M

617.6

M

=

644

M

B

= 1544M - 282.4M - 617.6M = 644MB

=1544M−282.4M−617.6M=644MBFramework Heap

=

128

M

= 128M

=128MTask Heap

=

644

M

128

M

=

516

M

= 644M - 128M = 516M

=644M−128M=516M

可以与以下的日志进行对比,完全能对上,!

2.单独分配 Total Flink Size

taskmanager.memory.flink.size: 2000m

假如直接只分配 taskmanager.memory.flink.size: 2000m

Total Flink Size

=

2000

M

= 2000M

=2000MManaged Memory

=

2000

M

×

0.4

=

800

M

= 2000M × 0.4 = 800M

=2000M×0.4=800MNetWork Memory

=

2000

M

×

0.1

=

200

M

= 2000M × 0.1 = 200M

=2000M×0.1=200MFramework Off-Heap

=

128

M

= 128M

=128MTask Off-Heap

=

0

B

y

t

e

=

0

M

= 0Byte = 0M

=0Byte=0M⭐ 所以 Total Direct Memory

=

200

M

+

128

M

+

0

M

=

328

M

= 200M + 128M + 0M= 328M

=200M+128M+0M=328MTotal Off-Heap Memory

=

800

M

+

328

M

=

1128

M

= 800M + 328M = 1128M

=800M+328M=1128MTotal JVM Heap

=

2000

M

800

M

328

M

=

872

M

= 2000M - 800M - 328M = 872M

=2000M−800M−328M=872MFramework Heap

=

128

M

= 128M

=128MTask Heap

=

872

M

128

M

=

744

M

= 872M - 128M = 744M

=872M−128M=744MJVM MetaSpace

=

256

M

= 256M

=256M(默认)JVM Overhead

=

(

= (

=(JVM Overhead

+

 

256

M

+\ 256M

+ 256M Metaspace

+

 

2000

M

+\ 2000M

+ 2000M Total Flink Size

)

×

0.1

) × 0.1

)×0.1,求解 JVM Overhead

=

250.667

M

= 250.667M

=250.667M 在

192

M

B

1

G

B

192MB ~ 1GB

192MB~1GB,生效Total Process Size

=

2000

M

+

256

M

+

250.667

M

=

2506.667

M

=

2.448

G

B

= 2000M + 256M + 250.667M = 2506.667M = 2.448GB

=2000M+256M+250.667M=2506.667M=2.448GB

3.单独分配 Heap Size && Managed Memory

taskmanager.memory.task.heap.size: 1000m

taskmanager.memory.managed.size: 1000m

Framework Heap

=

128

M

= 128M

=128M(默认)Task Heap

=

1000

M

= 1000M

=1000M(配置)Total JVM Heap

=

1000

M

+

128

M

=

1128

M

=

1.102

G

B

= 1000M + 128M = 1128M = 1.102GB

=1000M+128M=1128M=1.102GBManaged Memory

=

1000

M

= 1000M

=1000M(配置)Framework Off-Heap

=

128

M

= 128M

=128MTask Off-Heap

=

0

M

= 0M

=0MNetWork

=

=

= Total Flink Size

×

 

0.1

×\ 0.1

× 0.1

=

(

= (

=(NetWork

+

 

1128

M

+

1000

M

+

128

M

+

0

M

)

×

0.1

+\ 1128M + 1000M + 128M + 0M) × 0.1

+ 1128M+1000M+128M+0M)×0.1,计算得到 Network

=

250.667

M

B

= 250.667MB

=250.667MB,处于

64

M

B

1

G

B

64MB ~ 1GB

64MB~1GB,有效⭐ 所以 Total Direct Memory

=

128

M

+

250.667

M

=

378.667

M

= 128M + 250.667M = 378.667M

=128M+250.667M=378.667MTotal Flink Size

=

1128

M

+

1378.667

M

=

2506.667

M

=

2.448

G

B

= 1128M + 1378.667M = 2506.667M = 2.448GB

=1128M+1378.667M=2506.667M=2.448GBJVM Metaspace

=

256

M

= 256M

=256M(默认)JVM Overhead

=

(

= (

=(JVM Overhead

+

 

1128

M

+

1000

M

+

378.667

M

+

256

M

)

×

0.1

=

306.963

M

+\ 1128M + 1000M + 378.667M + 256M) × 0.1 = 306.963M

+ 1128M+1000M+378.667M+256M)×0.1=306.963M,处于

192

M

1

G

B

192M ~ 1GB

192M~1GB,有效Total Process Size

=

2506.667

M

+

256

M

+

306.963

M

=

3069.63

M

=

2.998

G

= 2506.667M + 256M + 306.963M = 3069.63M = 2.998G

=2506.667M+256M+306.963M=3069.63M=2.998G

4.分配 Total Process Size 和 Heap Size && Managed Memory

指定 Total Process Size,同时显式分配组件 JVM Heap 和 Mamaged Memory。

taskmanager.memory.process.size: 3000m

taskmanager.memory.task.heap.size: 1000m

taskmanager.memory.managed.size: 1000m

Total Process Size

=

3000

M

= 3000M

=3000MFramework Heap

=

128

M

= 128M

=128M(默认)Task Heap

=

1000

M

= 1000M

=1000M(配置)Total JVM Heap

=

=

= Framework Heap

+

+

+ Task Heap

=

128

M

+

1000

M

=

1128

M

=

1.102

G

= 128M + 1000M = 1128M = 1.102G

=128M+1000M=1128M=1.102GManaged Memory

=

1000

M

= 1000M

=1000M(配置)Framework Off-Heap

=

128

M

= 128M

=128M(默认)Task Off-Heap

=

0

M

= 0M

=0M(默认)Network Memory

=

(

= (

=(Network Memory

+

 

1128

M

+

1128

M

)

×

0.1

=

250.667

M

+\ 1128M + 1128M) × 0.1 = 250.667M

+ 1128M+1128M)×0.1=250.667M,在

64

M

1

G

B

64M ~ 1GB

64M~1GB 之间,满足要求Total Off-Heap

=

1000

M

+

128

M

+

250.667

M

+

0

M

=

1378.667

M

=

1.346

G

B

= 1000M + 128M + 250.667M + 0M = 1378.667M = 1.346GB

=1000M+128M+250.667M+0M=1378.667M=1.346GBTotal Flink Size

=

1128

M

+

1378.667

M

=

2506.667

M

=

2.448

G

B

= 1128M + 1378.667M = 2506.667M = 2.448GB

=1128M+1378.667M=2506.667M=2.448GBJVM Metaspace

=

256

M

= 256M

=256MJVM Overhead

=

3000

M

2506.667

M

256

M

=

237.333

M

= 3000M - 2506.667M - 256M = 237.333M

=3000M−2506.667M−256M=237.333M,在

192

M

1

G

B

192M ~ 1GB

192M~1GB 之间,满足要求

5.分配 Total Flink Size 和 Heap Size && Managed Memory

指定 Total Flink Size,同时显式分配组件 JVM Heap 和 Mamaged Memory。

taskmanager.memory.flink.size: 3000m

taskmanager.memory.task.heap.size: 1000m

taskmanager.memory.managed.size: 1000m

Total Flink Size

=

3000

M

=

2.93

G

B

= 3000M = 2.93GB

=3000M=2.93GB(配置)Managed Memory

=

1000

M

= 1000M

=1000M(配置)Task Heap

=

1000

M

= 1000M

=1000M(配置)Framework Heap

=

128

M

= 128M

=128M(默认)Total JVM Heap

=

=

= Framework Heap + Task Heap

=

128

M

+

1000

M

=

1128

M

= 128M + 1000M =1128M

=128M+1000M=1128MTotal Off-Heap Memory

=

3000

M

1128

M

=

1872

M

=

1.828

G

B

= 3000M - 1128M = 1872M = 1.828GB

=3000M−1128M=1872M=1.828GBDirect Memory

=

=

= Total Off-Heap Memory - Managed Memory

=

1872

M

1000

M

=

872

M

= 1872M - 1000M = 872M

=1872M−1000M=872MTask Off-Heap

=

0

M

= 0M

=0M(默认)Framework Off-Heap

=

128

M

= 128M

=128M(默认)Network Memory

=

=

= Direct Memory

-

− Task Off-Heap - Framework Off-Heap

=

872

M

0

M

128

M

=

744

M

= 872M - 0M - 128M = 744M

=872M−0M−128M=744MJVM Metaspace

=

256

M

= 256M

=256M(默认)JVM Overhead

=

(

= (

=(JVM Overhead

+

 

3000

M

+

256

M

)

×

0.1

+\ 3000M + 256M) × 0.1

+ 3000M+256M)×0.1,计算得到 JVM Overhead

=

361.778

M

= 361.778M

=361.778M,处于

192

M

1

G

192M~1G

192M~1G 之间,符合条件Total Process Size

=

3000

M

+

256

M

+

361.778

M

=

3617.778

M

=

3.533

G

B

= 3000M + 256M + 361.778M = 3617.778M = 3.533GB

=3000M+256M+361.778M=3617.778M=3.533GB

6.内存分配小结

在 Flink 的集群内存分配的过程中,我们大致可以通过

3

3

3 种方式进行分配。

指定 Total Process Size 或 Total Flink Size,取决于你用什么方式部署。单独指定某个组件,比如 Task-Heap 的大小,其它的组件都会被推导出来。指定 Total Process / Flink Size && Heap or Off-Heap 其中之一,其它的组件通过默认值进行填充或者进推导,如:

Total Flink Size = Total Heap Size + Total Off-Heap SizeTotal Heap Size = Task Heap + Framework HeapTotal Off-Heap = Task Off-Heap + Framework Off-Heap + Network Memory + Managed MemoryNetwork = Total Flink Size

×

 

0.1

×\ 0.1

× 0.1(没有指定其它组件情况下)JVM Overhead = Total Process Size

×

 

0.1

×\ 0.1

× 0.1(没有指定其它组件情况下)… …

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。