摘要:本文介绍了 dinky 在 Flink on Kubernetes 的实践分享。内容包括:
- 前言
- Kubernetes Native Session
- Kubernetes Native Application
- 优点
- 不足与建议
- 总结
Tips:历史传送门~
《Dinky在IDEA远程调试实践分享》
《Flink CDC 和 kafka 进行多源合并和下游同步更新》
《Dlink 在 FinkCDC 流式入湖 Hudi 的实践分享》
《Dlink 在 Flink-mysql-cdc 到 Doris 的实践》
GitHub 地址
https://github.com/DataLinkDC/dlink
https://gitee.com/DataLinkDC/dlink
欢迎大家关注 Dlink 的发展~
一、前言
Apache Flink(分布式计算框架)和 Kubernetes(资源管理调度)作为当下最流行的技术,将两者结合使用也是必需的。怎么才能方便的操作 Flink?怎么才能方便的操作 Flink on Kubernetes ?
目前 Flink 在 Kubernetes 的应用逐渐成熟,我司目前也应用了 Flink on Kubernetes, 但缺乏一套 Flink 运维平台,在调研多个开源项目后,发现 dinky (原dlink)的设计更符合我们的需求,但其主要偏 on yarn 的应用,虽然支持k8s,但缺乏文档支持,我们便进行了这方面的探索,主要分为 Native Session 和 Native Application 两个方向,在此分享下实践经验,如有错误还请更正。
二、Kubernetes Native Session
1.编译部署dinky
1、服务器编译环境准备(依据官网):
2、拉取源码到指定服务器:
https://github.com/DataLinkDC/dlink/tree/dev
3、编译打包。
代码语言:javascript复制cd dlink
mvn clean install -Dmaven.test.skip=true
4、拷贝安装包到指定目录,并解压。
代码语言:javascript复制cp ./build/dlink-release-0.6.0-SNAPSHOT.tar.gz /home/dinky
tar -zxvf /home/dinky/dlink-release-0.6.0-SNAPSHOT.tar.gz
5、进入dlink-release-0.6.0-SNAPSHOT目录:
根据sql脚本,升级选 dlink_history.sql 根据日期找到自己的基准日期,执行后续的sql,否则首次使用则可直接执行 dlink.sql。
6、配置数据库链接:
代码语言:javascript复制vim config/application.yml
7、根据flink版本:将对应的 dlink-client jar 包移动到lib目录(本篇分享使用的 Flink 版本为1.14.3):
代码语言:javascript复制mv extends/dlink-client-1.14-0.6.0-SNAPSHOT.jar ./lib
8、根据flink版本:将对应的依赖,以及接下来需要使用的第三方依赖放入plugins目录下:
创建plugins:
代码语言:javascript复制mkdir plugins
本文使用的是flink 1.14.3版本:plugins下面的jar有:
9、启动dinky:
代码语言:javascript复制 ./auto.sh start
2.Flink镜像制作(可选)
1、如果有自定义包需要提供的话,flink镜像制作:
代码语言:javascript复制docker pull flink:1.14.3-scala_2.11-java8
docker run -d -e FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" --name=flink_jobmanager flink:1.14.3-scala_2.11-java8 jobmanager
docker exec -it flink_job
docker cp /root/flink-jar/flink-sql-connector-mysql-cdc-2.1.1.jar acfd540eaf7e:/opt/flink/libmanager /bin/bash
ls /opt/flink/lib
docker cp /root/flink-jar/flink-sql-connector-mysql-cdc-2.1.1.jar acfd540eaf7e:/opt/flink/lib
docker commit -m="flink-custom-lib" -a="sss" flink_jobmanager flink_cl_v1:1.14.3-scala_2.11-java8
最后push到自己的仓库。
3.Dinky 基本配置
1、平台首页 http://localhost:8888
默认用户名/密码:admin/admin
2、修改下sql分隔符,推荐改为 ;rn
作为分割符。
4.注册 Native Session 集群实例
1、开启 k8s native session 的 NodePort,暴露 FlinkWebUI 地址和端口。
2、添加k8s session集群:
5.作业开发
1、新增目录,创建任务:
图中Flink集群下拉框中的 yarn-session 仅作为分类标志,不影响使用,以唯一标识为准,即集群名称。
三、Kuberbetes Native Application
(需要确保部署服务器上已安装kubectl,可以正常连通k8s)
1.编译部署dinky
1、重复 native session模式下的 编译部署dinky操作。
2、启动dinky。
2.Flink 镜像制作
1、参照上文Flink镜像制作,将/home/dinky/dlink-release-0.6.0-SNAPSHOT/jar/dlink-app-0.6.0-SNAPSHOT-jar-with-dependencies.jar 打包至docker 镜像中。
2、配置dinky的 通用模板 Jar 路径:local:///opt/flink/lib/dlink-app-0.6.0-SNAPSHOT-jar-with-dependencies.jar。
3.Dinky 注册集群配置
1、配置k8s application 集群模板:
其中 cluster-id 默认以作业名称作为更高优先级的配置,也可以使用最高优先级配置的方法(set 语法)指定:
优先级由低到高:Flink配置文件<集群配置<树节点name<右侧其他配置<右侧作业名<set kubernetes.cluster-id = 'k8s-app1';
代码语言:javascript复制set kubernetes.cluster-id = 'k8s-flink-app';
4.作业开发
1、提交application任务:
2、通过历史查看任务提交记录:
四、优点
1.FlinkSQL 交互开发
dinky 改变了传统的 Flink SQL 作业的开发和运维方式,通过基于Flink源码定制的平台化能力,大大降低了企业内Flink的使用成本。相比于其他的开源项目,它带来了更专业的功能与更低成本的开发运维。
2.不存在镜像过多或冗余的问题
dinky 通过 dlink-app 的镜像统一提交 FlinkSQL 任务,不需要搭建其他镜像,缩短了 FlinkSQL Application 的任务提交流程,提升了提交速度,最主要的是不会产生其他大量镜像,尤其存在大量作业的情况下,该优势更为明显。
五、不足与建议
1.对udf和依赖扩展自动化支持有限
目前版本来看,扩展udf和其他依赖时,需要手动重新构建镜像。建议后续可以添加可视化及自动化的构建部署镜像支持。
2.当dinky自身进行扩展时需要重启dinky进程
扩展 flink 的udf、连接器及其他依赖时,需要重启应用才可生效。
3.对k8s Application 的 Jar 任务支持不友好
目前 dinky 的 Jar 管理的任务 Jar 无法直接应用到 k8s 模式,需要手动构建镜像,建议可以自动化构建部署镜像。
六、总结
Flink on kubernetes,面对新的架构,怎么能简单操作,快速上手?
在使用dinky一段时间后,总体感觉不错!sql平台简单易用,可以提高开发效率。功能点也挺多的,作者也在积极的迭代,也在不断的完善中。期待后续的udf功能完善、自动化构建镜像、代码jar功能等。推荐试用。