2026/6/20 12:58:27
网站建设
项目流程
防静电产品东莞网站建设技术支持,长沙建站公司哪有,华为云速建站可以做英文网站,网站建设包括什么1. 先搞清楚#xff1a;Docker 里跑 Flink#xff0c;你到底在跑什么
Flink 的官方镜像本质上就是一个标准 Flink 发行版 入口脚本。你可以用它启动三种角色#xff1a;
JobManager#xff08;Session 集群#xff09;JobManager#xff08;Application 集群#xff…1. 先搞清楚Docker 里跑 Flink你到底在跑什么Flink 的官方镜像本质上就是一个标准 Flink 发行版 入口脚本。你可以用它启动三种角色JobManagerSession 集群JobManagerApplication 集群standalone-jobTaskManager给任意集群用核心差别只在于你是先起集群再提交作业Session还是“集群作业”Application。2. 最快启动手动 docker run 启一个 Session 集群2.1 创建网络 指定 JobManager RPC 地址JobManager 和 TaskManager 要互相发现所以必须设置jobmanager.rpc.address并且建议放进同一个 Docker network。FLINK_PROPERTIESjobmanager.rpc.address: jobmanagerdockernetwork create flink-network2.2 启 JobManager带 Web UIdockerrun\--rm\--namejobmanager\--network flink-network\--publish8081:8081\--envFLINK_PROPERTIES${FLINK_PROPERTIES}\flink:2.2.0-scala_2.12 jobmanager2.3 启 TaskManager可多个dockerrun\--rm\--nametaskmanager\--network flink-network\--envFLINK_PROPERTIES${FLINK_PROPERTIES}\flink:2.2.0-scala_2.12 taskmanager2.4 提交作业在你本机有 Flink 客户端的前提下./bin/flink run ./examples/streaming/TopSpeedWindowing.jar访问 Web UIhttp://localhost:8081停止集群直接 CtrlC 或docker stop jobmanager taskmanager3. 推荐方式Docker Compose 一键起 Session / Application / SQL ClientCompose 的优势是配置集中、扩缩容方便、可复制到其他机器。3.1 Session Mode最常用docker-compose.yml示例version:2.2services:jobmanager:image:flink:2.2.0-scala_2.12ports:-8081:8081command:jobmanagerenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanagertaskmanager:image:flink:2.2.0-scala_2.12depends_on:-jobmanagercommand:taskmanagerscale:1environment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2启动dockercompose up扩容 TaskManager两种写法二选一dockercompose scaletaskmanager3# 或者新版本docker compose up --scale taskmanager3关闭dockercompose down3.2 SQL Client Session 集群本地写 SQL 最爽的组合version:2.2services:jobmanager:image:flink:2.2.0-scala_2.12ports:-8081:8081command:jobmanagerenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanagertaskmanager:image:flink:2.2.0-scala_2.12depends_on:-jobmanagercommand:taskmanagerscale:1environment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2sql-client:image:flink:2.2.0-scala_2.12command:bin/sql-client.shdepends_on:-jobmanagerenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager rest.address: jobmanager启动集群后进入 SQL Clientdockercompose run sql-client重要提醒SQL Client 只是“提交端”真正跑算子的还是 JM/TM。你用到的连接器依赖必须在集群侧也可见见第 5 节。3.3 Application Mode一个应用一个集群隔离更强Application Mode 的关键点作业 JAR 必须在容器里可用通常/opt/flink/usrlib或者通过--jars指定远端下载路径。Compose 示例挂载 usrlibversion:2.2services:jobmanager:image:flink:2.2.0-scala_2.12ports:-8081:8081command:standalone-job --job-classname com.job.ClassNamevolumes:-/host/path/to/job/artifacts:/opt/flink/usrlibenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager parallelism.default: 2taskmanager:image:flink:2.2.0-scala_2.12depends_on:-jobmanagercommand:taskmanagerscale:1volumes:-/host/path/to/job/artifacts:/opt/flink/usrlibenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 parallelism.default: 2如果你要从 savepoint 拉起Application Mode 常见需求--fromSavepoint /path/to/savepoint--allowNonRestoredState可选注意savepoint 路径必须在所有容器里都能访问DFS 或挂载卷。4. 三种配置方式动态参数、环境变量、挂载 conf你可以用任意一种“覆盖”容器内的flink-conf.yaml。4.1 动态参数-D覆盖dockerrun flink:2.2.0-scala_2.12 taskmanager\-D jobmanager.rpc.addressjobmanager\-D taskmanager.numberOfTaskSlots3\-D blob.server.port61244.2 环境变量 FLINK_PROPERTIES最常用FLINK_PROPERTIESjobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 3 blob.server.port: 6124 dockerrun --envFLINK_PROPERTIES${FLINK_PROPERTIES}flink:2.2.0-scala_2.12 taskmanager提示jobmanager.rpc.address必配其它按需。4.3 挂载自定义 conf你要全量接管配置dockerrun\--mounttypebind,src/host/path/to/custom/conf,target/opt/flink/conf\flink:2.2.0-scala_2.12 jobmanager注意挂载目录里要包含必要的配置文件并且 Flink 配置文件要可写入口脚本有时会修改。5. 连接器与 SQL Client最容易踩的坑也是最关键的坑坑 1连接器 JAR 只放在 SQL Client 里不行SQL Client 只是提交 SQL真正执行 SQL 的运行时在 JM/TM。你需要确保JobManager / TaskManager 的/opt/flink/lib或 plugin 路径里也有相同连接器 JARSQL Client 容器里也有否则解析/提交阶段可能缺类坑 2ADD JAR对宿主机路径不生效在容器里“本地文件系统”是 Docker overlay filesystem不是你的宿主机路径。想让集群看到 JAR方案 A自定义镜像把 JAR 放进/opt/flink/lib方案 B挂载卷把 JAR 挂进/opt/flink/lib或/opt/flink/usrlib方案 CApplication Mode 用--jars从 S3/HTTP/DFS 拉推荐做一个带 Kafka 连接器的自定义镜像示例 Dockerfile官方示例思路FROM flink:2.2.0-scala_2.12 ARG kafka_connector_version4.0.0-2.0 RUN wget -P /opt/flink/lib https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-kafka/${kafka_connector_version}/flink-sql-connector-kafka-${kafka_connector_version}.jar然后在 compose 里build替换image让 jobmanager/taskmanager/sql-client 都用同一镜像。6. 插件启用S3、Hadoop FS 这些“不是放 lib 就完事”Flink 的 filesystem 插件通常需要放到/opt/flink/plugins/plugin-name/下官方镜像提供了ENABLE_BUILT_IN_PLUGINS来启用自带插件 JAR从/opt/flink/opt链接到 plugins。示例dockerrun\--envENABLE_BUILT_IN_PLUGINSflink-s3-fs-hadoop-2.2.0.jar\flink:2.2.0-scala_2.12 jobmanager多个插件用;分隔。7. 容器里做“本地恢复”Working Directory 挂载卷强烈建议如果你用了 RocksDB state backend 或者希望 TaskManager 重启后更快恢复建议把 working dir 做成“可持久化”挂载卷否则容器一重启本地 state 直接消失。建议做法挂载一个宿主机目录到容器例如/data/flink/working - /data/flink/working配置process.working-dir指向这个路径开启state.backend.local-recovery: true给 TaskManager 固定taskmanager.resource-id在容器环境尤其重要Compose 片段示例思路services:taskmanager:image:flink:2.2.0-scala_2.12volumes:-/data/flink/working:/data/flink/workingenvironment:-|FLINK_PROPERTIES jobmanager.rpc.address: jobmanager process.working-dir: /data/flink/working state.backend.local-recovery: true taskmanager.resource-id: tm-01如果你会 scale 多个 TM要让每个实例的taskmanager.resource-id唯一否则会踩目录冲突坑。生产里更常见的做法是“每台机器固定一个 TM 固定 resource-id”或用编排系统注入唯一 ID。8. 内存分配器jemalloc 与 glibc 的选择官方镜像默认使用 jemalloc 来缓解内存碎片问题。如果你想切回 glibcdockerrun --envDISABLE_JEMALLOCtrue flink:2.2.0-scala_2.12 taskmanager如果你使用 glibc建议限制 arena 数避免内存膨胀尤其是 RocksDB checkpoint/savepoint 时更明显dockerrun --envMALLOC_ARENA_MAX1flink:2.2.0-scala_2.12 taskmanager9. 在 Docker 里跑 PyFlink自定义镜像一步到位示例 DockerfileFROM flink:2.2.0 RUN apt-get update -y \ apt-get install -y python3 python3-pip python3-dev \ rm -rf /var/lib/apt/lists/* RUN ln -s /usr/bin/python3 /usr/bin/python RUN pip3 install apache-flink2.2.0构建dockerbuild -t pyflink:latest.10. 镜像标签最佳实践别用 latest别偷懒强烈建议显式使用包含 FlinkScala 的 tag比如flink:2.2.0-scala_2.12原因很现实Scala 版本与 Flink 版本不匹配时类冲突会让你怀疑人生。官方镜像有两个渠道Docker Hub 官方flink更推荐apache/flink社区维护适合应急11. 一套“最短闭环”的调试套路特别适合你做压测/验证你前面提到 “Print 验证正确性 BlackHole 压测性能”在 Docker Session 集群里尤其好用开发阶段source 用datagensink 用print看输出是否符合预期压测阶段sink 换blackhole你就能把瓶颈收敛到 join/agg/topn/UDF 本身避免 sink 抢戏观察方式看 Web UI 的 backpressure、busy、checkpoint如果有、以及算子吞吐