Flink优化
-
flink高并发方向的优化:
Flink是一个处理实时数据流和批数据的分布式计算系统。在处理实时数据流时,高并发是非常重要的因素,因此对于高并发的需求,Flink提供了一些优化方案,下面详细说明几个优化方案。
-
使用异步IO
在处理实时数据流的过程中,常常需要进行输入输出操作(IO),IO操作通常是非常耗时的,因此在高并发场景下,需要使用异步IO来优化IO性能。具体而言,异步IO通过IO线程从操作系统底层读取数据,然后交由业务线程去处理,从而提高了线程的吞吐量和并发性能。Flink中已经提供了异步IO的接口,开发人员只需要实现具体的异步IO模块即可。
-
使用负载均衡
当一个Flink任务要处理的消息非常多时,为了优化性能,可以将消息分散到多个不同的子任务中去处理,从而实现负载均衡。对于Flink而言,可通过任务并行度调整实现负载均衡,通常情况下,将并行度设置为CPU核心数量的2-3倍比较合适。
-
窗口优化
Flink提供了窗口模式,能够将数据分割成有限的组(窗口),然后对每个窗口进行处理,窗口大小决定了获取数据的频率,同时也影响了性能。为此,可通过设置动态窗口和定向窗口的方式进行优化。
动态窗口优化:在处理一系列数据时,不同的数据所属的窗口区间大小不同,窗口随着数据的变化而动态改变。这样,能够避免像固定窗口那样频繁切换,造成不必要的开销和数据丢失等问题。
定向窗口优化:对于多个数据流之间存在关联关系的应用,可以使用定向窗口进行优化。为此,需要将多个数据流的数据先进行合并,然后才能设定窗口进行处理。这种方式能够避免数据流不同步的情况发生,同时也能够减少操作开销。
-
使用布隆过滤器
在Flink处理实时数据流的过程中,常常需要进行去重操作,而去重本身是比较耗时,布隆过滤器的
时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
保密性强,布隆过滤器不存储元素本身
存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)
-
jvm调优方面的优化:
Flink是一种开源的流处理系统,可以对有限数据、无限数据和事件时间应用到流处理、数据微批处理、离线批处理的计算模型统一视图。
JVM(Java虚拟机)是执行Java字节码的虚拟计算机。Flink在JVM上构建,因此,JVM调优在Flink性能优化过程中是非常重要的一环。这篇文章将会详细介绍在Flink实时处理方向中的JVM调优方案。
-
垃圾回收器的选择
垃圾回收器是处理Java程序中的垃圾回收和内存管理的关键部分。在Flink中,对于Java Heap的大小和垃圾回收算法的选择,对程序性能的影响非常大。
在JVM中,垃圾回收器分为串行垃圾回收器、并行垃圾回收器、CMS垃圾回收器、G1垃圾回收器四种。每个垃圾回收器的缺点是其他垃圾收集器的优点。在选择垃圾回收器时,需根据程序的类型、程序运行的环境、处理的数据量等因素进行考虑。
-
最大堆内存的分配
在Flink应用中,最大堆大小是配置最多的参数之一。默认值为1Gb。但是,如果您的应用程序需要更多的资源,例如更大的状态后端、更大的Java对象或更大的socket缓冲区,那么可以将最大堆分配增加到更大的值。
堆内存的大小设置
flink中最重要的参数是任务管理器的堆内存大小(taskmanager.memory.task.heap.size)和JVM堆内存大小(taskmanager.cpu.cores)。
堆内存的大小设置是flink性能优化的关键,通常人们会设置MAX JVM堆空间的大小为32~64G,但是这种设置不一定适合所有的场景,如果数据量小或者比较简单,就不需要那么大的内存,相反,JVM堆内存如果设置过小,堆空间可能会被填满,导致频繁的full GC,因此,任务管理器的堆内存大小设置需要根据具体情况实际分析实践
-
合适的JVM参数配置
通过适当的配置JVM参数,可以提高Flink的性能和可伸缩性。下面是一些常用的JVM参数:
-
-XX:+UseG1GC:指定GC为G1垃圾回收器,可以大大提高垃圾回收的效率。
-
-XX:MaxGCPauseMillis:指定垃圾回收的最大暂停时间,可以避免程序中长时间的停滞。
-
-XX:+HeapDumpOnOutOfMemoryError:内存溢出时自动产生一个转储文件,方便进行调试。
-
-Xmx:指定JVM最大内存,可以根据需要进行调整。
| 当前存在的问题 | 优化方向研究测试 | |
|---|---|---|
| 1,高并发情况下,有些服务配置资源没有有效利用 | flink以及jvm参数的调整优化以及调试 | |
| 2,高并发情况下,checkpoint的提交时间几十倍增长,甚至是提交超时,导致服务消费慢,占用资源多 | 非对齐方式checkpoint能否减小资源占用 | |
| 2,高并发情况下,checkpoint的提交时间几十倍增长,甚至是提交超时,导致服务消费慢,占用资源多 | 大状态与checkpoint的关系以及优化方法 | |
| 2,高并发情况下,checkpoint的提交时间几十倍增长,甚至是提交超时,导致服务消费慢,占用资源多 | checkpoint的提交状态能否减小 | |
| 2,高并发情况下,checkpoint的提交时间几十倍增长,甚至是提交超时,导致服务消费慢,占用资源多 | 高并发情况下 开启缓冲区能否减小checkpoint时间,以及提高成功率方面的探索 | |
| 3,k8s集群上会有服务偶现 数据正常消费,但是kafka积压告警的情况 |
。