Flink官方提供的 Docker 運行 Flink Application Mode?模式,逐句解讀含義,并且給予操作實例:
以下是 Flink 官方提供的 Docker 命令,用于在?Application Mode?下運行 Flink Job(standalone-job
?作為 JobManager,taskmanager
?作為 TaskManager)。
1. JobManager 啟動命令解析
docker run \--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \ # 掛載本地文件到容器--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \ # 掛載第二個文件(如依賴包)--rm \ # 容器退出后自動刪除--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ # 傳遞 Flink 配置--name=jobmanager \ # 容器名稱--network flink-network \ # 使用 Docker 網絡(需提前創建)flink:1.20.1-scala_2.12 standalone-job \ # 使用 Flink 鏡像并啟動 JobManager--job-classname com.job.ClassName \ # 指定主類[--job-id <job id>] \ # (可選)手動指定 Job ID[--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \ # (可選)從 Savepoint 恢復[job arguments] # (可選)傳遞給 Job 的參數
2. TaskManager 啟動命令解析
docker run \--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \ # 掛載本地文件到容器--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \ # 掛載第二個文件--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ # 傳遞 Flink 配置flink:1.20.1-scala_2.12 taskmanager # 啟動 TaskManager
操作實例(基于舉例的需求)
1. 準備環境
-
JAR 路徑:?
/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar
-
主類:?
com.dev.flink_nc_demo1
-
Flink 鏡像:?
flink:1.20.1-java11
(需替換?scala_2.12
?版本) -
Docker 網絡: 確保?
flink-network
?已創建(若沒有,運行?docker network create flink-network
)
2. 啟動 JobManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \ # 掛載 JAR--rm \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \ # 直接指定 FLINK_PROPERTIES--name=jobmanager \--network flink-network \flink:1.20.1-java11 standalone-job \ # 使用 Java 11 鏡像--job-classname com.dev.flink_nc_demo1 # 指定主類
說明:
-
由于你的 JAR 是單個文件,直接掛載到?
/opt/flink/usrlib/
?下(Flink 默認加載該目錄下的 JAR)。 -
FLINK_PROPERTIES
?直接寫死,避免依賴 Shell 變量。
3. 啟動 TaskManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \ # 掛載相同 JAR--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \ # 必須與 JobManager 一致--network flink-network \ # 使用相同網絡flink:1.20.1-java11 taskmanager
說明:
-
TaskManager 需要訪問 JobManager,因此?
FLINK_PROPERTIES
?必須包含?jobmanager.rpc.address: jobmanager
(指向 JobManager 容器名)。
關鍵注意事項
-
Docker 網絡
-
JobManager 和 TaskManager 必須使用同一個網絡(
flink-network
)。 -
如果未創建,先運行:
docker network create flink-network
-
-
JAR 掛載
-
如果 JAR 有額外依賴(如配置文件、Lib 目錄),需額外掛載到?
/opt/flink/usrlib/
。
-
-
日志查看
-
查看 JobManager 日志:
docker logs jobmanager
-
查看 TaskManager 日志(需替換容器 ID):
docker logs <taskmanager-container-id>
-
-
調試建議
-
如果 Job 啟動失敗,可以進入容器檢查文件是否掛載成功:
docker exec -it jobmanager bash ls /opt/flink/usrlib/ # 確認 JAR 存在
-
完整示例(一鍵運行)
# 創建網絡(如果尚未創建)
docker network create flink-network# 啟動 JobManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \--rm \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \--name=jobmanager \--network flink-network \flink:1.20.1-java11 standalone-job \--job-classname com.dev.flink_nc_demo1# 啟動 TaskManager(另開終端)
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \--network flink-network \flink:1.20.1-java11 taskmanager
這樣,?Flink Job 就會在 Docker 集群中以?Application Mode?運行!如果有問題,可以檢查日志或調整掛載路徑。
備注:
1、啟動standalone是啟動的job-manager,task-manager的啟動需要另開終端。
2、log會打印在掛起的task-manager控制臺,或者通過容器查看log
docker logs 28f9c444a3e8
3、由于
A?Flink Application cluster?is a dedicated cluster which runs a single job. In this case, you deploy the cluster with the job as one step, thus, there is no extra job submission needed.
?所以運行該job的是standalone-job
?模式(Application Mode)不會出現8081webui,該flink集群僅可以運行這一個job,不再接受提交其他任務。
-
? 默認情況下不會暴露 Web UI,因為?
standalone-job
?是一個?一次性執行的 Job,任務完成后容器會退出(尤其是加了?--rm
?參數時)。 -
如果想啟用 Web UI,需要:
-
使用?
jobmanager
?角色(而非?standalone-job
),這樣 Flink 會以常駐服務運行。 -
顯式映射?
8081
?端口(通過?-p 8081:8081
)。
-
4、任務完成,standalone-job啟動的jobmanager自動退出,taskmanger需要手動ctrl c退出