使用java代码提交flink job 任务

本文介绍了一个使用Java程序实现的Flink作业客户端提交示例。该示例通过指定集群配置信息及作业JAR包路径,实现了远程向Flink集群提交作业的功能,并展示了如何获取提交后的作业ID。

以下代码是使用java程序客户端提交flink job的示例代码

package client;
import org.apache.flink.api.common.ExecutionConfig;
import org.apache.flink.api.common.JobID;
import org.apache.flink.client.deployment.StandaloneClusterId;
import org.apache.flink.client.program.PackagedProgram;
import org.apache.flink.client.program.PackagedProgramUtils;
import org.apache.flink.client.program.rest.RestClusterClient;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.JobManagerOptions;
import org.apache.flink.configuration.RestOptions;
import org.apache.flink.core.fs.Path;
import org.apache.flink.runtime.jobgraph.JobGraph;
import org.apache.flink.runtime.jobgraph.JobVertex;
import org.apache.flink.runtime.jobgraph.SavepointRestoreSettings;
import org.apache.flink.runtime.jobgraph.tasks.AbstractInvokable;
import org.apache.flink.streaming.api.graph.StreamGraph;

import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;


/**
 * @ClassName FlinkClient
 * @Description TODO
 * @Author Getech
 * @Date 2021/6/24 17:59
 */
public class FlinkClient {

    public static void main(String[] args) {
        String jarFilePath = "D:\\02develop\\2020workspace\\apache-flink\\example\\WordCountSQL.jar";
        RestClusterClient<StandaloneClusterId> client = null;
        try {
            // 集群信息
            Configuration configuration = new Configuration();
            configuration.setString(JobManagerOptions.ADDRESS, "10.8.4.129");
            configuration.setInteger(JobManagerOptions.PORT, 6123);
            configuration.setInteger(RestOptions.PORT, 8081);
            client = new RestClusterClient<StandaloneClusterId>(configuration, StandaloneClusterId.getInstance());
            int parallelism = 1;
            File jarFile=new File(jarFilePath);
            SavepointRestoreSettings savepointRestoreSettings=SavepointRestoreSettings.none();
            PackagedProgram program = PackagedProgram.newBuilder()
                    .setConfiguration(configuration)
                    .setEntryPointClassName("org.apache.flink.table.examples.java.WordCountSQL")
                    .setJarFile(jarFile)
                    .setSavepointRestoreSettings(savepointRestoreSettings).build();
            JobGraph jobGraph=PackagedProgramUtils.createJobGraph(program,configuration,parallelism,false);
            CompletableFuture<JobID> result = client.submitJob(jobGraph);
            JobID jobId=  result.get();
            System.out.println("提交完成");
            System.out.println("jobId:"+ jobId.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

 

<think>好的,用户现在问的是提交Flink任务时的客户端有哪些。之前他们问过关于YARN三种模式的区别,现在可能是在进一步了解Flink任务提交流程。需要先确认Flink支持的客户端类型,然后逐一分析每个客户端的特点、适用场景和区别。 首先,Flink的客户端主要有三种:CLI命令行客户端、REST客户端、以及通过编程方式(比如Java/Scala API)提交。可能还需要提到Web UI,虽然它本身不是提交客户端,但可以作为补充说明。 用户可能的实际需求是选择适合他们环境的提交方式。比如,如果是自动化脚本,可能会用CLI或者REST API;如果是集成到应用程序中,可能用编程方式。需要注意不同客户端的依赖条件和适用场景。 接下来要检查之前回答的结构,确保和之前的风格一致,使用清晰的分类和对比。可能需要解释每个客户端的优缺点,以及使用示例,比如CLI的基本命令,REST API的调用方法,编程方式的具体代码结构等。 同时,用户可能对客户端与集群的交互方式感兴趣,比如分离模式是否需要客户端长期运行。比如在YARN Application模式下,客户端提交后可以退出,而Per-Job需要客户端保持连接。需要在这些点上进行说明,帮助用户理解不同客户端的适用情况。 还要注意Flink版本的影响,比如REST客户端在较新版本中的增强,或者Application模式在1.11+的支持情况。这可能影响用户的选择,特别是如果他们使用的是旧版本。 最后,总结部分需要给出选择建议,帮助用户根据使用场景做出决定,比如开发测试推荐CLI,生产自动化推荐REST或编程方式。确保信息准确,结构清晰,符合用户的需求。</think>Flink 提交任务的客户端主要有以下三种类型,它们在功能、使用场景和依赖条件上有所不同: --- ### 1. **CLI 命令行客户端(`flink run`)** #### 定义 - **核心工具**:通过Flink自带的命令行工具(`bin/flink`)提交任务。 - **直接操作**:需在安装Flink的机器上执行命令。 #### 特点 - **基本功能**: - 支持提交 Jar 包到集群(Session/Per-Job/Application 模式)。 - 支持动态参数传递(如`--parallelism`、`--class`)。 - 可查看作业状态、取消作业等。 - **依赖条件**: - 需本地安装Flink客户端。 - 需访问集群配置(如YARN配置)。 #### 使用示例 ```bash # 提交 Jar 到 YARN Application 模式 ./bin/flink run -t yarn-application -c com.example.Main ./app.jar # 提交到已启动的 YARN Session 集群 ./bin/flink run -t yarn-session -Djobmanager.rpc.address=jm-host ./app.jar ``` #### 适用场景 - **开发/测试环境**:手动调试或快速提交作业。 - **脚本化部署**:结合Shell脚本实现自动化。 #### 缺点 - **强依赖本地环境**:需安装Flink并配置集群连接。 - **功能有限**:不支持复杂交互(如动态扩缩容)。 --- ### 2. **REST API 客户端** #### 定义 - **HTTP交互**:通过Flink提供的REST API直接与集群通信。 - **跨平台性**:可通过任意HTTP工具(如`curl`、Postman)或代码调用。 #### 特点 - **核心功能**: - 提交作业(需先将Jar上传到集群)。 - 查询作业状态、触发Savepoint、取消作业等。 - 获取集群指标(如TaskManager数量、Slot使用率)。 - **依赖条件**: - 需知道Flink集群的REST端点(如`http://<jobmanager>:8081`)。 - 无需本地安装Flink客户端。 #### 使用示例 ```bash # 上传 Jar 到集群 curl -X POST -H "Expect:" -F "jarfile=@./app.jar" http://flink-cluster:8081/jars/upload # 提交作业(使用上传的Jar ID) curl -X POST http://flink-cluster:8081/jars/{jar-id}/run \ -d '{"entryClass":"com.example.Main", "programArgs":"--input hdfs:///data"}' ``` #### 适用场景 - **生产运维**:集成到监控系统或CI/CD流程。 - **跨网络提交**:从外部系统(如控制台、Web服务)触发任务。 #### 缺点 - **流程繁琐**:需先上传Jar再提交作业。 - **版本兼容性**:不同Flink版本的REST API可能有差异。 --- ### 3. **编程式客户端(Java/Scala API)** #### 定义 - **代码提交**:通过Flink的`PipelineExecutor`接口(如`YarnClusterDescriptor`)以编程方式提交作业。 - **高度定制化**:可嵌入到Java/Scala应用程序中。 #### 特点 - **核心能力**: - 动态构建集群(如指定YARN队列、资源参数)。 - 直接提交`StreamExecutionEnvironment`中定义的作业逻辑。 - 支持与应用程序深度集成(如异常回调、指标收集)。 - **依赖条件**: - 需引入Flink相关依赖(如`flink-clients`)。 - 需有编程环境(如JVM)。 #### 使用示例(Java) ```java // 创建YARN集群描述器 YarnClusterDescriptor clusterDescriptor = yarnClient.createClusterDescriptor(); // 配置集群参数 ClusterSpecification clusterSpec = new ClusterSpecification.ClusterSpecificationBuilder() .setMasterMemoryMB(2048) .setTaskManagerMemoryMB(4096) .build(); // 提交应用到YARN ClusterClientProvider<ApplicationId> provider = clusterDescriptor.deployApplicationCluster( clusterSpec, new YarnApplicationClusterEntryPoint.ClusterDeploymentContextBuilder() .setJarPath(new Path("hdfs:///app.jar")) .build() ); // 获取集群ID ApplicationId appId = provider.getClusterClient().getClusterId(); ``` #### 适用场景 - **SDK集成**:将Flink任务嵌入到大型应用中(如数据平台)。 - **动态集群管理**:按需创建/销毁集群(如多租户环境)。 #### 缺点 - **开发复杂度高**:需熟悉Flink内部API。 - **升级风险**:Flink版本升级可能导致代码不兼容。 --- ### 对比总结 | 维度 | CLI 客户端 | REST API 客户端 | 编程式客户端 | |---------------------|----------------------------|----------------------------|---------------------------| | **使用门槛** | 低(命令行操作) | 中(需HTTP交互知识) | 高(需编程能力) | | **环境依赖** | 需安装Flink | 无需Flink安装 | 需引入Flink依赖 | | **灵活性** | 一般(固定命令参数) | 一般(依赖API设计) | 高(可自定义逻辑) | | **适用场景** | 手动提交、脚本化任务 | 运维自动化、外部系统集成 | 嵌入式开发、复杂调度逻辑 | | **典型工具** | `flink run` | `curl`、Postman、HttpClient | Java/Scala 应用程序 | --- ### 选择建议 - **快速测试/手动操作** → **CLI客户端** (适合本地调试或简单脚本)。 - **生产自动化/第三方集成** → **REST API** (与运维系统无缝衔接)。 - **深度定制化需求** → **编程式客户端** (如自研调度平台或动态资源管理)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成伟平2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值