incubator-streampark
incubator-streampark copied to clipboard
[Proposal][Refactor] support Flink job on native kubernetes mode
Search before asking
- [X] I had searched in the feature and found no similar feature requirement.
Description
先用中文描述,后续补充中文版本(Will rewrite in english late.)
1. 背景
随着云原生的普及,Kubernetes 成为越来越多公司的云原生底座,越来越多的大数据作业被运行到 k8s 上面,比如 Flink,官方从 1.12 版本已经开始支持 on native k8s 的模式。参考:https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/native_kubernetes/
该 issue 主要讨论如何在平台侧更好的支持 Flink on native k8s.
2. 限制
主要讨论目前社区现状的限制和目前 StreamX 实现上的限制。
1. 社区限制
社区目前在 Flink on k8s 使用方面最大的限制在于需要 main jar 存在于 Flink 镜像中,这也就意味着需要冗杂的前置工作(镜像打包发布等)
2. StreamX 实现限制
目前 StreamX 针对上面的社区限制将镜像的打包发布等做到平台侧,这虽然可以解决问题,但是会导致如下问题:
- 链路太长
- StreamX 内部需要 docker 环境,特别是 StreamX 容器化部署的时候会导致 StreamX 镜像较大
3. Proposal
针对上面的问题,一个可行的改进点是基于 Flink 官方提供的 Pod Template 的方式。
简单来说,Pod Template 就是用户提供一个 Pod 模板,Flink 在启动 JobManager 和 TaskManager 的时候使用该模板来初始化 JobManager 和 TaskManager 的 Pod。
基于 Pod Template,我们可以将一个 downloader 镜像作为 init container 加到 Pod Template 中,在作业启动时,downloader 将用户的 main jar 或者 sql 等下载到 JM/TM 内部的 user classpath 下,然后启动。
4. Task 分解
涉及到的 Task 主要包括:
- StreamX 镜像打包流程改造
- 新增 StorageHandler 负责用户的资源文件(main jar、sql 等)的上传和下载,这个也是 downloader 的核心逻辑。上传是在 StreamX 侧完成,将用户的资源文件上传到 remote storage,可以是 hdfs,也可以是公有云的存储系统,比如阿里云的 oss,AWS 的 s3 等
- 新增 Pod Template 的核心提交逻辑
Usage Scenario
No response
Related issues
No response
Are you willing to submit a PR?
- [X] Yes I am willing to submit a PR!
Code of Conduct
- [X] I agree to follow this project's Code of Conduct
非常棒的特性, 当前StreamX支持的Flink最低版本也是 1.12, 刚好满足这个条件. 这么一来大概会涉及到这些流程:
- 废弃现在的打Jar 和 打镜像的逻辑
- 在任务新增或者修改在本地的local workspace下(如需要)将任务的依赖文件(jar | udf | connector)等 放置到该任务(附带appId)的目录下
- 在前端按钮点击"上线" 时, 启动 StorageHandler, 将这些资源文件上传到 remote storage
- 当任务点击"启动" 时, 在 Pod Template 中挂载资源文件,并且实现核心提交逻辑.
会涉及到前端和后端的改动操作.后续可以讨论个拆分任务的方案. 共同协作
Subtasks:
- 新增 StorageService 模块 https://github.com/streamxhub/streamx/pull/1367