【Flink】flink on k8s 部署方案
1. HDFS部署 (k8s)
hdfs的作用是用户保存flink的检查点与保持点
但是大数据集群目前还是建议单独使用CDH或者HDP部署
目前文中的这种hdfs on k8s方式做高可用不太方便
1.1 配置文件
hdfs-conf.yaml
apiVersion: v1
kind: ConfigMap
metadata:namespace: dev-flink-platname: kube-hadoop-conf
data:HDFS_MASTER_SERVICE: hadoop-hdfs-masterHDOOP_YARN_MASTER: hadoop-yarn-master
hdfs-service.yaml
apiVersion: v1
kind: Service
metadata:namespace: dev-flink-platname: hadoop-hdfs-master
spec:type: NodePortselector:app: hdfs-masterports:- name: rpcport: 9000targetPort: 9000- name: httpport: 50070targetPort: 50070nodePort: 32007
hdfs-namenode.yaml
没有配置secondary-namenode,而是通过ReplicationController的replicas来保证namenode的副本数
apiVersion: v1
kind: ReplicationController
metadata:namespace: dev-flink-platname: hdfs-masterlabels:app: hdfs-master
spec:replicas: 1selector:name: hdfs-mastertemplate:metadata:labels:name: hdfs-masterspec:containers:- name: hdfs-masterimage: kubeguide/hadoop:latestimagePullPolicy: IfNotPresentports:- containerPort: 9000- containerPort: 50070env:- name: HADOOP_NODE_TYPEvalue: namenode- name: HDFS_MASTER_SERVICEvalueFrom:configMapKeyRef:name: kube-hadoop-confkey: HDFS_MASTER_SERVICE- name: HDOOP_YARN_MASTERvalueFrom:configMapKeyRef:name: kube-hadoop-confkey: HDOOP_YARN_MASTERrestartPolicy: Always
hdfs-datanode.yaml
apiVersion: v1
kind: Pod
metadata:namespace: dev-flink-platname: hadoop-datanodelabels:app: hadoop-datanode
spec:containers:- name: hadoop-datanodeimage: kubeguide/hadoop:latestimagePullPolicy: IfNotPresentports:- containerPort: 9000- containerPort: 50070 env:- name: HADOOP_NODE_TYPEvalue: datanode- name: HDFS_MASTER_SERVICEvalueFrom:configMapKeyRef:name: kube-hadoop-confkey: HDFS_MASTER_SERVICE- name: HDOOP_YARN_MASTERvalueFrom:configMapKeyRef:name: kube-hadoop-confkey: HDOOP_YARN_MASTER restartPolicy: Always
2. Flink部署 (k8s)
2.1 Flink部署方式
- flink standalone
- flink on yarn
- flink on k8s
我们采用的是flink on k8s的部署方式
2.2 flink on k8s 部署方案
Flink 选择 Kubernetes 的主要原因是结合 Flink 和 Kubernetes 的长稳性。
① Flink 特性:提供的实时服务是需要长时间、稳定地运行,常应用于电信网络质量监控、实时风控、实时推荐等稳定性要求较高的场景;
② Kubernetes 优势:为应用提供了部署、管理能力,同时保证其稳定运行。Kubernetes 具有很好的生态,可以集成各种运维工具,例如 prometheus、主流日志采集工具等。Kubernetes 具有很好的扩缩容机制,可以大大提高资源利用率。
Session 模式
预先构建 Flink 集群,且该集群长期处于运行状态,但不能自动扩缩容。用户通过 client 提交作业到运行中的 JobManager,而 JobManager 将任务分配到运行中的 TaskManager
优点 | 缺点 |
---|---|
Flink 集群是预先启动运行的。用户提交作业的时候,作业可以立即分配到 TaskManager,即作业启动速度快 | 资源利用率低,提前确定 TaskManager 数量,如果作业需要的资源少,则大量 TaskManager 处于闲置状态。反正 TaskManager 资源不足 |
作业隔离性差,多个作业的任务存在资源竞争,相互影响。如果一个作业异常导致 TaskManager 挂了,该 TaskManager 上的全部作业都会被重启 | |
Application 模式
每个作业独占一个 Flink 集群,当作业完成后,集群也会被回收。
注意:
① Flink 镜像需要包含作业即Application 依赖的 Class
② 启动作业的时候需要指定 Main 函数入口类
优点 | 缺点 |
---|---|
一个作业独占一个集群,作业的隔离性好 | 资源利用率低,提前确定 TaskManager 数量,如果作业需要的资源少,则大量 TaskManager 处于闲置状态。反之 TaskManager 资源不足。同时,JobManager 不能复用 |
Flink Native Session 模式
类似 Session 模式,需要预先构建 JobManager。不同点是用户通过 Flink Client 向 JobManager 提交作业后,根据作业需要的 Slot 数量,JobManager 直接向 Kubernetes 申请 TaskManager 资源,最后把作业提交到 TaskManager 上。
优点 | 缺点 |
---|---|
TaskManager 的资源是实时的、按需进行的创建,对资源的利用率更高 | 作业真正运行起来的时间较长,因为需要等待 TaskManager 创建 |
Flink Native Application 模式
类似 Application 模式,每个作业独占一个 Flink 集群,当作业完成后,集群也会被回收。不同点是 Native 特性,即 Flink 直接与 Kubernetes 进行通信并按需申请资源,无需用户指定 TaskManager 资源的数量。
优点 | 缺点 |
---|---|
一个作业独占一个集群,作业的隔离性好 | 一个作业独占一个集群,JobManager 不能复用 |
资源利用率相对较高,按需申请 JobManager 和 TaskManager | 作业启动较慢,在作业提交后,才开始创建 JobManager 和 TaskManager |
运行模式总结
模式 | 隔离性 | 作业启动时间 | 资源利用率 | 资源按需创建 |
---|---|---|---|---|
Session | 弱,作业共享集群 | 较短,立即启动 | 较低,集群长期存在 | 否 |
Application | 强,作业独享集群 | 最长,等待集群创建完成 | 一般,作业结束后释放资源 | 否 |
Native Session | 弱,作业共享集群 | 一般,等待 TaskManager 创建 | 较低,TaskManager 按需申请 | 是 |
Native Application | 强,作业独占集群 | 一般, 等待集群创建完成 | 最好,集群按需创建 | 是 |
Kubernetes 高可用 Services
Session 模式和 Application 模式集群都支持使用 Kubernetes 高可用服务。需要在 flink-configuration-configmap.yaml 中添加如下 Flink 配置项。
Note 配置了 HA 存储目录相对应的文件系统必须在运行时可用。请参阅自定义Flink 镜像和启用文件系统插件获取更多相关信息。
apiVersion: v1
kind: ConfigMap
metadata:name: flink-configlabels:app: flink
data:flink-conf.yaml: |+...kubernetes.cluster-id: <cluster-id>high-availability: org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactoryhigh-availability.storageDir: hdfs:///flink/recoveryrestart-strategy: fixed-delayrestart-strategy.fixed-delay.attempts: 10...
此外,你必须使用具有创建、编辑、删除 ConfigMap 权限的 service 账号启动 JobManager 和 TaskManager pod。请查看如何为 pod 配置 service 账号获取更多信息。
当启用了高可用,Flink 会使用自己的 HA 服务进行服务发现。因此,JobManager Pod 会使用 IP 地址而不是 Kubernetes 的 service 名称来作为 jobmanager.rpc.address 的配置项启动。
2.3 配置文件
flink-conf.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: flink-confignamespace: fat-bigdata-clusterlabels:app: flink
data:flink-conf.yaml: |+jobmanager.rpc.address: flink-jobmanagertaskmanager.numberOfTaskSlots: 50blob.server.port: 6124jobmanager.rpc.port: 6123taskmanager.rpc.port: 6122jobmanager.heap.size: 1524mtaskmanager.memory.process.size: 4096mexecution.target: kubernetes-sessionstate.backend: filesystemstate.checkpoints.dir: hdfs://192.168.5.131:25305/flink/cpstate.savepoints.dir: hdfs://192.168.5.131:25305/flink/spstate.backend.incremental: truekubernetes.cluster-id: fat-bigdata-cluster-k8s-idclassloader.resolve-order: parent-firsthigh-availability: org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactoryhigh-availability.storageDir: hdfs://192.168.5.131:25305/flink/recovery#restart-strategy: fixed-delay#restart-strategy.fixed-delay.attempts: 10#high-availability.jobmanager.port: 34560#metrics.internal.query-service.port: 34561kubernetes.namespace: fat-bigdata-clusterkubernetes.service-account: flink-bigdata-clusterlog4j.properties: |+log4j.rootLogger=INFO, filelog4j.logger.akka=INFOlog4j.logger.org.apache.kafka=INFOlog4j.logger.org.apache.hadoop=INFOlog4j.logger.org.apache.zookeeper=INFOlog4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.file=${log.file}log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%nlog4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, file
jobmanager-service.yaml
apiVersion: v1
kind: Service
metadata:namespace: fat-bigdata-clustername: flink-jobmanager
spec:type: ClusterIPports:- name: rpcport: 6123- name: blobport: 6124- name: uiport: 8081selector:app: flinkcomponent: jobmanager
jobmanager-rest-service.yaml
apiVersion: v1
kind: Service
metadata:namespace: dev-flink-platname: flink-jobmanager-rest
spec:type: NodePortports:- name: restport: 8081targetPort: 8081nodePort: 30081selector:app: flinkcomponent: jobmanager
jobmanager-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:namespace: fat-bigdata-clustername: flink-jobmanager
spec:replicas: 1selector:matchLabels:app: flinkcomponent: jobmanagertemplate:metadata:labels:app: flinkcomponent: jobmanagerspec:containers:- name: jobmanagerimage: flink:1.13.2env:- name: FLINK_PROPERTIESvalue: 'jobmanager.rpc.address: flink-jobmanager'workingDir: /opt/flinkcommand: ["/bin/bash", "-c", "$FLINK_HOME/bin/jobmanager.sh start;\while :;doif [[ -f $(find log -name '*jobmanager*.log' -print -quit) ]];then tail -f -n +1 log/*jobmanager*.log;fi;done"]ports:- containerPort: 6123name: rpc- containerPort: 6124name: blob- containerPort: 8081name: uilivenessProbe:tcpSocket:port: 6123initialDelaySeconds: 30periodSeconds: 60volumeMounts:
# - name: flink-config-volume
# mountPath: /opt/flink/conf/- name: flink-lib-volumemountPath: /opt/flink/lib/securityContext:runAsUser: 9999 # refers to user _flink_ from official flink image, change if necessaryvolumes:
# - name: flink-config-volume
# configMap:
# name: flink-config
# items:
# - key: flink-conf.yaml
# path: flink-conf.yaml
# - key: log4j.properties
# path: log4j.properties- name: flink-lib-volumehostPath:path: /home/sll/lib/type: Directory
taskmanager-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:namespace: fat-bigdata-clustername: flink-taskmanager
spec:replicas: 1selector:matchLabels:app: flinkcomponent: taskmanagertemplate:metadata:labels:app: flinkcomponent: taskmanagerspec:containers:- name: taskmanagerimage: flink:1.13.2workingDir: /opt/flinkcommand: ["/bin/bash", "-c", "$FLINK_HOME/bin/taskmanager.sh start; \while :;doif [[ -f $(find log -name '*taskmanager*.log' -print -quit) ]];then tail -f -n +1 log/*taskmanager*.log;fi;done"]ports:- containerPort: 6122name: rpclivenessProbe:tcpSocket:port: 6122initialDelaySeconds: 30periodSeconds: 60volumeMounts:- name: flink-config-volumemountPath: /opt/flink/conf/- name: flink-lib-volumemountPath: /opt/flink/lib/securityContext:runAsUser: 9999 # refers to user _flink_ from official flink image, change if necessaryvolumes:- name: flink-config-volumeconfigMap:name: flink-configitems:- key: flink-conf.yamlpath: flink-conf.yaml- key: log4j.propertiespath: log4j.properties- name: flink-lib-volumehostPath:path: /home/sll/libtype: Directory
serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: fat-bigdata-clusternamespace: fat-bigdata-cluster
automountServiceAccountToken: false
configmaps-cluster-role.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: fat-bigdata-clustername: configmaps-reader
rules:- apiGroups: [""]resources: ["configmaps"]verbs: ["update","create","get", "watch", "list"]
绑定clusterRole与serviceaccount
k create clusterrolebinding flink-reader-binding --clusterrole=configmaps-reader --serviceaccount=fat-bigdata-cluster:default
【Flink】flink on k8s 部署方案相关推荐
- flink on k8s部署方案实践--详细步骤
背景 Flink-operator极大的方便了我们管理 Flink 集群及其作业,我们只需要自定义yaml文件就可以做到. Flink 官方还未给出 flink-operator 方案,不过 Goog ...
- flink on k8s部署方案调研
背景 flink是目前最常用的大数据流计算处理引擎,一共有local,standalone,yarn,kubernetes四种安装部署机构方案.通常使用yarn进行管理,随着k8s云计算体系越来越成熟 ...
- 【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战
上一篇博文介绍了如何独立部署一个高可用的Flink集群,本篇介绍如何用Native k8s去部署高可用的Flink 集群.本篇介绍的集群构建在AWS上,和构建在自己的服务器相比,主要区别在文件系统的选 ...
- Flink JobManager HA模式部署(基于Standalone)
参考文章:https://ci.apache.org/projects/flink/flink-docs-release-1.3/setup/jobmanager_high_availability. ...
- flink yarn模式HA部署
文章目录 1.yarn cluster 模式部署介绍 2.flink session HA模式 3.flink-per-job模式 该文章基于上一篇: Flink的local和standalone H ...
- Flink (四) Flink 的安装和部署- Flink on Yarn 模式 / 集群HA / 并行度和Slot
接上一篇 Flink (三) Flink 的安装和部署- -Standalone模式 3. Flink 提交到 Yarn Flink on Yarn 模式的原理是依靠 YARN 来调度 Flink ...
- Flink Standalone 集群部署
Flink 支持使用多种部署模式来满足不同规模应用的需求,常见的有单机模式,Standalone Cluster 模式,同时 Flink 也支持部署在其他第三方平台上,如 YARN,Mesos,Doc ...
- Nacos集群部署方案
1. 介绍 生产环境部署nacos使用集群部署方案cluster来保障高可用 2. 集群部署架构图 nacos官方推荐把所有服务列表放到VIP下面,然后挂到一个域名下面 http://ip1:port ...
- Nacos生产环境集群部署方案
1.介绍 生产环境中部署nacos首先肯定是使用集群模式cluster保证高可用. 2.集群部署架构图 nacos 官方推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面 http://i ...
最新文章
- mysql中的时间函数---运维常用
- 51Nod 1439 - 互质对(容斥+莫比乌斯函数)
- 分布式缓存 - hash环/一致性hash
- php中nodethirtythree,node常用模块 - LinearLaw的个人空间 - OSCHINA - 中文开源技术交流社区...
- WebStorm文件类型关联设置
- 双纵坐标的绘图命令_Matplotlib绘图 | 快速定义图表样式的小技巧
- php中访问控制_PHP之Trait详解
- jsp页面将数据导出到Excel
- re模块常用修饰符_re模块中常用功能函数
- 论文笔记_S2D.27_2006-NIPS-从单目图像学习深度
- pytest allure测试报告_pytest文档32allure描述用例详细讲解
- python问卷星微信登录_使用Python自动填写问卷星(pyppeteer反爬虫版)
- vba字典学习案例二
- Git commit --amend
- 日本麻将中的牌型名称,充满格调与文艺
- 学习路之Linux--获取root权限
- 工作就是这么简单——去哪儿网CTO吴永强
- linux中test命令详解
- 不小心合并了icloud通讯录_iCloud合并通讯录没了如何恢复?最简单的技巧分析
- HBase进化之从NoSQL到NewSQL,凤凰涅槃成就Phoenix 1
热门文章
- KALI Linux三种安装方式之U盘安装
- uni-app小程序里用echarts-for-wx-uniapp,dispatchAction不起作用
- 首批+唯一。阿里云实时计算 Flink 版通过信通院大数据产品稳定性测试
- 计算机导论基于计算思维答案,基于计算思维的计算机导论课程改革实践.PDF
- 如何解决计算机黑屏问题,电脑黑屏不显示怎么办?不花钱就能解决的方法,分分钟教会你!...
- DOMBOM移动端事件jQuery
- [益智]:蚂蚁走树枝
- ESRI Shapefile格式解析
- HackRF 代码讲解 (一)
- 代理--ip池的使用--阿布云的使用