关于Flink SQL Client在Application Mode下的使用及启动方式咨询
Flink SQL Client与Application Mode的兼容问题及解决方案
直接结论
Application Mode 不支持用Flink SQL Client做交互式查询——官方设计里SQL Client就是为Session Mode量身打造的,和Application Mode的运行模式天然不兼容。
为什么不行?
Application Mode的逻辑是:把整个作业(包括所有依赖、配置)打包成一个独立Jar提交,集群为每个作业单独启动JobManager,作业跑完就释放资源。而SQL Client是个交互式工具,需要一个长期运行的Session(也就是一直活着的JobManager)来接收你输入的SQL、解析并执行,这和Application Mode“一次性作业”的模式完全对不上。
两种可行的解决路径
路径1:用Session Mode(最省心的SQL Client用法)
如果业务场景允许用Session Mode,按以下步骤来:
- 准备依赖Jar:把SQL需要的连接器(比如Kafka、Hive)、自定义UDF这些Jar包,要么放到Flink集群所有节点的
lib目录里,要么启动Session时用-j参数指定Jar路径。 - 启动Session集群:
本地集群:
YARN Session:./bin/start-cluster.sh
K8s Session:./bin/yarn-session.sh -d./bin/kubernetes-session.sh -Dkubernetes.cluster-id=my-session - 启动SQL Client连接Session:
本地嵌入式连接:
远程连接YARN/K8s Session:./bin/sql-client.sh embedded
之后就可以在SQL Client里写SQL、执行查询了。./bin/sql-client.sh remote -h <jobmanager-host> -p <jobmanager-port>
路径2:把SQL打包成Jar,用Application Mode提交
如果必须用Application Mode,那就把SQL脚本转成可执行Jar提交:
- 用SQL Client把SQL脚本打包成作业Jar:
./bin/sql-client.sh -f your-sql-script.sql -d target/your-sql-job.jar - 提交到Application Mode:
本地集群:
YARN:./bin/flink run-application -t local target/your-sql-job.jar
K8s:./bin/flink run-application -t yarn-application target/your-sql-job.jar
这种方式相当于把SQL变成了一个固化的批/流作业,虽然没了SQL Client的交互式体验,但能适配Application Mode的要求。./bin/flink run-application -t kubernetes-application -Dkubernetes.cluster-id=my-cluster target/your-sql-job.jar
补充说明
你之前看到的“把Jar包嵌入JobManager”是Session Mode的要求——因为Session的JobManager要长期运行,得提前加载好SQL执行需要的依赖;而Application Mode的Jar本身就包含所有依赖,不需要提前放到集群节点上。
内容的提问来源于stack exchange,提问作者jorgebo10
相关产品推荐
相关产品推荐

