Flink集群中的常用配置

Flink提供了很多配置,都可以再./conf/flink-conf.yaml文件中定义

这个文件会供多个组件使用.比如启动脚本会读取,而且CLI客户端也会读取.

那么我们就说一下常见的集群配置

1.     CPU

Flink的工作节点不会主动限制自身消耗的CPU,而是采用处理槽来控制可以分配给工作进程的任务数,每个TaskManager提供一定数量的处理槽,交给ResourceManager来进行统一的注册管理,JobMananger需要请求一个或者多个处理槽来执行应用

那么我们可以根据CPU的资源上限,来设置处理槽数量,设置的方式是通过配置文件中的taskmanager.numberOfTaskSlots来指定的.

一般这个大小只需要在集群部署模式下设置,对于YARN或者Kubernetes中,Flink是通过上层管理启动多个单处理槽的TaskManager

2.     内存和网络缓冲

Flink的主进程和工作进程对内存有着不同的需求,

首先是主进程,其对内存需求并不大,除非管理多个应用,或者应用具有多个算子,可能需要利用jobmanager.heap.size配置项来增加JVM堆的容量.

而对于TaskManager则是需要设置JVM堆内存大小,TaskManager 中的一个JVM包含下面所有Slot需要用到的内存.

那么为了设置他,可以通过taskmanager.heap.size配置.供所有对象使用,但除了一个基本的JVM内存大小

Flink还有两个组件很消耗内存,Flink的网络栈和RocksDB,Flink的网络栈基于Netty库,从本地内存分配网络缓冲区,那么由于存在分区或者广播连接的算子,连接数可能会变成并行度的乘积.对于这种应用,这个关系会导致网络传输占用大量内存

对于网络的分配,参数可以是taskmanager.network.memory.fraction

决定了JVM为网络缓冲区分配的内存比例,这个比例会和JVM堆内存竞争.

其次是taskmanager.network.segment-size

默认是32kb,可以通过降低单个缓冲区大小来增加其数量.不过这样会降低网络整体的工作效率.

除了网络缓存,还有就是RocksDB的占用量,但是对于RocksDB的内存占用量来说,没有直观的计算方法.具体占用大小可以通过每个键值分区算子只会创建一个单独的RocksDB实例.

每个实例占用200-240MB的堆外内存.

故在为TaskManager配置内存的时候,应该适当调整JVM堆内存的大小,以便为非堆内存留下足够的资源.

3.     磁盘存储

Flink的工作进程需要在本地文件系统上存储数据,包含JAR等

这些数据的落盘目录是通过io.tmp.dirs配置项配置的.指定一个或者多个目录来存储数据,默认情况下,数据会写入默认的临时目录,java系统变量 java.io.tmpdir对应的目录.

需要注意默认的临时目录会定时的清理,如果希望不被清理掉,可以选择其他目录存储.

除此外,还可以指定env.log.dir参数来配置TaskManager的日志文件目录

RocksDB状态后端会将应用维护在本地文件系统中.对应的目录可以通过state.backemd.rocksdb.localdir参数设置.如果没有设置,则是使用io.tmp.dirs的值.

4.     检查点和状态后端

状态后端也提供了很多配置项,比如设置一个默认的状态后端

以及配置状态后端的本地文件存储路径,state.backend.rocksdb.localdir

以及计时器状态放在堆中还是RocksDB中 state.backend.rocksdb.timer-service.factory

5.     安全性配置

Flink允许内部或者外部的网络通信启用SSL加密,对于内部通信,可以通过彼此分发证书来进行验证.

以及Flink外部通信,也可以启用SSL进行加密,但是效果可能不如启动一个外部代理服务器效果好,毕竟不是专门做这个的.

发表评论

邮箱地址不会被公开。 必填项已用*标注