环境
想要尝试新版本的 flink, 但是又跟现有环境冲突, 比如 JDK 8 和 11, scala 2.11 和 2.22, Kafka 和 Zookeeper 版本以及数据的冲突和混用的危险, 这种情况就适合用 Docker 来解决了, 环境 版本 数据 等等问题都能得到较好的管理和隔离, 而且加上 compose / swarm / Kubernates 的支持, 管理效率极大提高.
官方示例 - flink-playgrounds/table-walkthrough
Flink 官方提供了一个 Docker Compose 的方式供我们试玩 Flink:
https://github.com/apache/flink-playgrounds
首先需要有 :
- Java 8 or 11 (本地开发和构建 Flink 程序用)
- Maven (本地开发和构建 Flink 程序用)
- Docker (运行 JobManager TaskManager Kafka Zookeeper MySQL Grafana 等等容器)
Docker 和 Compose 准备
检查 docker 是否已经启动:systemctl status docker.service
若无 docker compose 则需要安装 :DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
# for all users
# sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version
构建 images
接着就可以 git clone 仓库:git clone -b release-1.14 git@github.com:apache/flink-playgrounds.git
cd table-walkthrough
在 flink-playgrounds.git 中, 有一个文件 table-walkthrough/docker-compose.yml
(文件部分内容如下), 定义了要用到的一些 services (JobManager TaskManager Kafka Zookeeper MySQL Grafana 等等), 它们的 images / 端口 / 环境变量 / 依赖关系等等. 详细说明文档可参考: Compose file version 2 reference
version: '2.1' |
其中可以看到上面 jobmanager 的 build: .
, 会使用 table-walkthrough/Dockerfile
进行 image build, 将会编译和构建 table-walkthrough
这个目录下的 Maven 项目, 并和 Flink 库一起构成 docker image.
Dockerfile
文件:
FROM maven:3.8-jdk-8-slim AS builder |
不过在执行构建之前, 我们需要实现 report() 方法 (table-walkthrough/src/main/java/org/apache/flink/playgrounds/spendreport/SpendReport.java):
public static Table report(Table transactions) { |
在其中加入业务逻辑, 这里进行简单的 groupBy account_id
和 log_ts
:
public static Table report(Table transactions) { |
然后就可以开始执行构建了:
➜ docker compose build |
完成之后, 可以看到新的 images:
➜ docker compose images |
启动 services
然后启动所有 services :docker-compose up -d
可以看到启动的 services :
➜ docker compose ps |
打开 Flink WebUI 可以查看运行中的 Jobs: http://localhost:8082/
打开 Grafana 查看实时统计结果
MySQL 查询写入的数据 :
mysql> select * from spend_report limit 10; |
想要停止时 : docker compose stop
示例中的 Dockerfile 构建起来还是比较慢的, 若有代码修改, 重新构建会重复浪费一些时间, 可以修改构建步骤, 比如把 mvn 部分独立出来.
参考
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/try-flink/table_api/