Flink内存机制及资源评估方法

2022-09-11

< view all posts

思路

对Flink的资源评估,从内存着手可以进行比较精确的估计,这是因为Flink计算中的状态大小、保留时间都是确定的,因此极限情况下Flink的状态存储占用的内存大小也相对固定。这篇笔记就从状态大小出发,介绍通过内存利用评估Flink资源的方法。

因为Flink的CPU负载则根据计算逻辑的不同,可能存在较大的不确定性。因此,先估计内存,再采用经验公式估计 CPU 核心数 = 内存(GB) / 8 来估计 CPU 资源是一个比较方便的方案。(在我们的实际使用中,发现Flink是内存密集而非计算密集,因此比起使用核心内存比为 1:4 的标准机型,更推荐使用 1:8 的内存机型。)

原理

Flink早期版本的内存管理策略较为简单,虽然后续升级了策略,但是早期的这个版本在资源评估时仍有参考价值(因为它简单清晰)。其内存策略如下:

首先保证 25% 的 cutoff 作为 Flink 自己留的冗余,不参与内存分配,也就是说 Flink 自己只对配置给它的 75% 的内存进行使用规划。在这 75% 当中,首先有 10% 被网络拿走,接着剩余的内存又有30%被划走,保留作其它用途。因此,实际能用于状态存储的比例是 75% x 90% x 70% = 47.25%。

也就是说,对于一个 16G 的虚机,实际上状态存储在极限状态下能够使用到的内存是 16 * 47.25% = 7.56 GB。这个数值也是后面计算时带入的值。

另外,在后面的计算中,考虑到估计本身会有一定误差,还人为地引入了一个冗余系数。也就是说,实际上估计的是将极端压力再乘以冗余系数之后,支撑系统需要的资源。

计算方法

计算方法如下:

设共有N个统计维度,统计维度指统计逻辑对应到SQL语句中,GROUP BY 后面的字段。

首先计算状态个数:状态个数 = SUM( 窗口长度内维度n的统计量个数 * 窗口长度内维度n的unique值个数 ),n从1取到N

例如,系统中对某维度计算了x个统计值,而估计窗口长度内会出现y个unique键值交易,那么对该维度而言,上方公式括号内的值就是 x*y。之后再将每个维度这样计算并相加。

之后,计算需要的机器数:

机器数 = 向上取整( 窗口长度 / 窗口步长 * 状态个数 * 统计量单条状态大小 / 每台机器用于状态存储的内存大小 * 冗余系数 )

举例

以2C16G虚机举例,利用Flink计算48小时窗口的统计数据:

对应的条件设置如下:

48小时窗口 = 172800秒;

窗口900秒步长;

统计量单条状态大小8字节(即long类型);

每台机器用于状态存储的内存大小:7.56GB = 7560000000 byte;

冗余系数 = 1.5

状态个数 = 68003000(因涉及到具体统计逻辑,略去具体计算公式,计算方法上文已经介绍)

则根据公式:

机器数 = 向上取整(172800second / 900 second * 68003000* 8 byte / 7560000000 byte * 1.5) = 21 台