前面提到了Flink kubernetes Operator有4种部署方式。
可以参考这篇文章:https://blog.youkuaiyun.com/jwandbj/article/details/134603119?spm=1001.2014.3001.5502
所以我们这里直接使用Flink Kubernetes Operator的Application模式,通过把jar包挂载的方式进行部署。
一、jar包要挂载可以使用华为云的obs或者阿里云的oss,或者disk磁盘来挂载都可以;挂载的方式使用pvc,所以在执行flinkcdc-mysql-doris.yaml之前,还需要创建一个pvc:
#Flink 作业jar 持久化存储pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: flink-jar-pvc # jar pvc名称
namespace: flink
spec:
storageClassName: csi-disk #sc名称
accessModes:
- ReadWriteOnce #采用ReadOnlyMany的访问模式
resources:
requests:
storage: 1Gi #存储容量,根据实际需要更改
二、创建好了挂载的pvc,还需要把checkpoint也用pvc挂载起来。如果没有设置checkpoint的存储地址,flink默认会把checkpoint的存储地址放到内存里面,这个时候就会出现一个问题,任务一开始是可以正常运行的,等运行到一定时候就会报错,从日志上看不出任务的问题。所以checkpoint也需要设置存储的地点,这里通过pvc挂载的方式来设置存储点,设置的这些pvc名称一定要和flinkcdc-mysql-doris.yaml文件里面的名称是一致的。
#Flink 作业jar 持久化存储pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: flink-checkpoint-pvc # jar pvc名称
namespace: flink
spec:
storageClassName: local-path #sc名称
accessModes:
- ReadWriteOnce #采用ReadOnlyMany的访问模式
resources:
requests:
storage: 1Gi #存储容量,根据实际需要更改
三、下面是执行的yaml文件:flinkcdc-mysql-doris.yaml,在Kubernetes的环境中,通过执行下面命令进行部署:
kubectl apply -f flinkcdc-mysql-doris.yaml -n 命名空间
flinkcdc-mysql-doris.yaml文件
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
namespace: flink
name: flinkcdc-mysql-doris
spec:
image: flink:1.16.0 # 使用flink-sql的镜像
flinkVersion: v1_16
imagePullPolicy: IfNotPresent # 镜像拉取策略,本地没有则从仓库拉取
ingress: # ingress配置,用于访问flink web页面
template: "flink.ztorn.com/{{namespace}}/{{name}}(/|$)(.*)"
className: "nginx"
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$2"
flinkConfiguration:
taskmanager.numberOfTaskSlots: "1"
state.checkpoints.dir: file:///opt/flink/checkpoints
#classloader.resolve-order: parent-first # 默认是child-first,必须改为parent-first,先加载flink自带的Jar,要不然容易出现各种类型不匹配问题
jobmanager.memory.heap.size: 1024mb
jobmanager.memory.jvm-metaspace.size: 384mb
jobmanager.memory.off-heap.size: 256mb
jobmanager.memory.jvm-overhead.min: 128mb
jobmanager.memory.jvm-overhead.max: 896mb
jobmanager.memory.jvm-overhead.fraction: "0.1"
taskmanager.memory.task.heap.size: 2048mb # 用于flink应用的算子和用户代码的JVM堆内存
taskmanager.memory.managed.size: 256mb # 由flink管理的用于排序、哈希表、缓存中间结果及Rocks DB State Backend的本地内存
taskmanager.memory.task.off-heap.size: 256mb # 用于flink应用的算子及用户代码的堆外内存
taskmanager.memory.jvm-metaspace.size: 384mb # Flink JVM进程的Metaspace
taskmanager.memory.jvm-overhead.min: 256mb # 用于其他JVM开销的本地内存,例如栈空间、垃圾回收空间
taskmanager.memory.jvm-overhead.max: 2048mb
taskmanager.memory.jvm-overhead.fraction: "0.1"
serviceAccount: flink
jobManager:
resource:
memory: "2024m"
cpu: 1
taskManager:
resource:
memory: "4096m"
cpu: 2
podTemplate:
spec:
nodeSelector:
tag: bigdata
containers:
- name: flink-main-container
env:
- name: TZ
value: Asia/Shanghai
volumeMounts:
- name: flink-obs # 挂载nfs上的jar
mountPath: /opt/flink/jar
subPath: flink
- name: flink-checkpoint-pvc # 挂载checkpoint pvc
mountPath: /opt/flink/checkpoints
subPath: wh
volumes:
- name: flink-obs
persistentVolumeClaim:
claimName: flink-obs
- name: flink-checkpoint-pvc
persistentVolumeClaim:
claimName: flink-checkpoint-pvc
job:
jarURI: local:///opt/flink/jar/xxx.jar # 使用pv方式挂载jar包
entryClass: com.ztorn.ZtornApplication
args: # 传递到作业main方法的参数
- "database"
- "database\\.tablename"
- "192.168.0.1"
- "username"
- "password"
- "initial"
- "1693462200"
- "file:///opt/flink/checkpoints"
parallelism: 1
upgradeMode: stateless