flink java提交任务,根据jobname获取jobid,rest获取任务的状态

本文介绍如何在Apache Flink中使用Java编程实现任务的创建、上传与控制,包括通过REST API获取任务ID及监测任务状态的方法。通过具体代码示例,详细展示了如何定义并执行Flink流处理任务,以及如何利用Apache HttpClient组件通过REST API进行任务状态的实时监测与任务的终止操作。

1.传入jobname:
在这里插入图片描述

public class ReduceDemo {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> words = env.socketTextStream("localhost", 8888);
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = words.map(w -> Tuple2.of(w, 1)).returns(Types.TUPLE(Types.STRING, Types.INT));
        KeyedStream<Tuple2<String, Integer>, Tuple> keyBy = wordAndOne.keyBy(0);
        /*sum*/
        SingleOutputStreamOperator<Tuple2<String, Integer>> reduce = keyBy.reduce(new ReduceFunction<Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2)  {
                String key = value1.f0;
                Integer count1 = value1.f1;
                Integer count2 = value2.f1;
                int count = count1 + count2;
                return Tuple2.of(key, count);
            }
        });
        reduce.print();
        env.execute("cz");
    }
}

2.上传任务:

public class Upjar {
    public static void main(String[] args) throws IOException {
        List<String> arg = new ArrayList<>();
        arg.add("sh");
        arg.add("-c");
        arg.add("./flink run -p 2  -C file://绝对路径 -C file://绝对路径 -C file://绝对路径 -c 主类路径 主类所在jar包的绝对路径\n");
        ProcessBuilder pb = new ProcessBuilder(arg);
        //设置工作目录
        pb.directory(new File("/home/flink/flink-1.10.0/bin"));
        //redirectErrorStream 属性默认值为false,意思是子进程的标准输出和错误输出被发送给两个独立的流,可通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问
        //值设置为 true,标准错误将与标准输出合并。合并的数据可从 Process.getInputStream() 返回的流读取,而从 Process.getErrorStream() 返回的流读取将直接到达文件尾
        pb.redirectErrorStream(true);
        File log = new File("/home/flink/flink-1.10.0/logs");
        pb.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
        Process p = pb.start();
        assert pb.redirectInput() == ProcessBuilder.Redirect.PIPE;
        //重定向标准输出到日志
        assert pb.redirectOutput().file() == log;
        assert p.getInputStream().read() == -1;

    }
}

3.获取jobid
在这里插入图片描述
通过rest访问根据jobname获取jobid,可使用 apache的httpcomponents,根据返回值获取jobid

public class HttpComponentsForRest {
    static String jobName = "97c5216de4ef4b15b16de3a3ab53fd78";
    static String urlPrefix = "http://192.168.1.127:8081";

    public static void main(String[] args) throws IOException {
        String jobID = getJobID(urlPrefix, jobName);
//        getJobState(urlPrefix, jobID);
//        stop(urlPrefix, jobID);


        try {
            while (true) {
                getJobState(urlPrefix, jobID);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.println("pipeline stop");
        }


    }

    /*若任务的状态为running,则调用api结束任务*/
    public static void stop(String urlPrefix, String jid) throws IOException {
        CloseableHttpResponse stopJob = send(new HttpPatch(urlPrefix + "/jobs/" + jid));
        StatusLine statusLine = stopJob.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        /*202代表执行成功,关闭pipeline*/
        if (statusCode != 202) {
            throw new RuntimeException("当前任务未能正确关闭");
        }

    }

    /*判断当前任务的状态   "state": "RUNNING" */
    public static void getJobState(String urlPrefix, String jid) throws IOException {
        CloseableHttpResponse getJobState = send(new HttpGet(urlPrefix + "/jobs/" + jid));
        String getJobStateRes = transform(getJobState);
        JSONObject jsonObject = JSON.parseObject(getJobStateRes);
        String state = jsonObject.getString("state");
        if (!"RUNNING".equals(state)) {
            throw new RuntimeException("当前任务处于停止或故障状态");
        }
    }

    /*根据jobname获取jobid*/
    public static String getJobID(String urlPrefix, String jobName) throws IOException {
        CloseableHttpResponse getJobID = send(new HttpGet(urlPrefix + "/jobs/overview"));
        String getJobIDRes = transform(getJobID);
        JSONObject res = JSON.parseObject(getJobIDRes);
        JSONArray jobs = res.getJSONArray("jobs");
        String jid = null;
        for (int i = 0; i < jobs.size(); i++) {
            JSONObject jsonObject = (JSONObject) jobs.get(i);
            String name = (String) jsonObject.get("name");
            if (name.equals(jobName)) {
                jid = (String) jsonObject.get("jid");
                break;
            }
        }
        if (jid == null || jid.equals("")) {
            throw new RuntimeException("pipeline在flink中没有对应的任务");
        }
        return jid;
    }

    public static CloseableHttpResponse send(HttpRequestBase httpRequestBase) throws IOException {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse response = httpclient.execute(httpRequestBase);
        return response;
    }

    public static String transform(CloseableHttpResponse response) throws IOException {
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        return result;
    }


}

关于flink中任务通过rest访问控制状态,可参考官方文档

<think>好的,我现在需要回答用户关于如何通过Flink Session模式提交任务的指南。首先,我需要回忆Flink的基本架构和Session模式的特点。Flink Session模式适用于多个作业共享集群资源的情况,适合短作业或测试环境。用户提到他们已经有YARN环境,所以可能需要结合YARN来部署。 接下来,我需要查阅用户提供的引用内容。引用[1]提到Flink可以在YARN上运行,用户不需要额外设置,说明用户可能已经配置好YARN,因此提交任务时需要利用YARN的相关命令。引用[4]提到了环境变量的设置,特别是HADOOP_HOME和PATH的配置,这可能是在提交任务前需要检查的环境配置。 然后,我应该分步骤说明提交任务的流程。首先确保环境变量正确,包括HADOOP_HOME和Flink的路径。然后启动YARN Session,这可能需要使用Flink的yarn-session.sh脚本,并指定参数如任务槽数、内存等。启动后,YARN会提供一个Application ID,用户需要通过这个ID提交Flink作业。提交作业可以使用flink run命令,并指定jar包和主类。最后,任务完成后需要关闭Session以释放资源。 同时,需要注意用户提到的Standalone集群模式(引用[2]),但这里用户明确询问的是Session模式,可能是在YARN上的Session。需要区分YARN Session和Standalone Session的不同步骤。例如,Standalone可能需要启动start-cluster.sh,而YARN则需要启动yarn-session.sh。 另外,引用[3]提到了安全配置,如JAAS和Delegation token,这可能在某些安全环境中需要额外配置,但用户的问题可能不涉及这些,不过还是应该作为注意事项提及。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何监控任务、资源配置优化、日志查看等。确保问题覆盖常见的使用场景和潜在问题。</think>### Apache Flink Session模式任务提交指南 #### **1. 环境准备** - **Hadoop/YARN环境**:确保已正确配置$HADOOP_HOME$和$PATH$[^4],例如: ```bash export HADOOP_HOME=/path/to/hadoop export PATH=$HADOOP_HOME/bin:$PATH ``` - **Flink安装包**:下载与Hadoop版本兼容的Flink安装包,并解压到指定目录。 #### **2. 启动YARN Session** 通过以下命令启动一个长期运行的Flink Session集群: ```bash ./bin/yarn-session.sh -n 4 -jm 1024m -tm 4096m -s 2 ``` - `-n`:指定TaskManager数量 - `-jm`:JobManager内存 - `-tm`:TaskManager内存 - `-s`:每个TaskManager的任务槽数 启动成功后,YARN会返回`Application ID`(如`application_XXXXX_001`),用于后续任务提交[^1]。 #### **3. 提交任务到Session集群** 使用`flink run`命令提交作业,需指定Session的`Application ID`: ```bash ./bin/flink run -m yarn-cluster -yid application_XXXXX_001 \ -c com.example.StreamingJob /path/to/your-job.jar ``` - `-m`:指定YARN集群模式 - `-yid`:关联已启动的Session集群 - `-c`:主类全限定名 #### **4. 任务监控与管理** - **Flink Web UI**:通过YARN ResourceManager界面获取Session集群的Web UI地址,查看任务状态、日志和指标。 - **命令行操作**:使用`flink list`、`flink cancel <jobID>`管理任务。 #### **5. 关闭Session集群** 任务执行完毕后,通过YARN命令终止集群: ```bash yarn application -kill application_XXXXX_001 ``` 或使用Flink脚本关闭(若以分离模式启动)[^2]。 --- ### **注意事项** 1. **资源分配**:Session模式会预先占用资源,需根据作业需求合理配置内存和槽位。 2. **安全配置**:若集群启用Kerberos认证,需配置JAAS文件或Delegation Token[^3]。 3. **日志排查**:任务失败时可从YARN的`Application Attempt`页面或Flink的`taskmanager.log`定位问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

但行益事莫问前程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值