Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flink REST API 的设计指南

Flink REST API 的设计指南

原创
作者头像
KyleMeow
修改于 2023-06-05 13:40:57
修改于 2023-06-05 13:40:57
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

Flink REST API 介绍

Flink REST API 是 JobManager 提供的 HTTP 接口,用户可以通过 GET、POST 等 REST 定义的方法,请求获取作业、JobManager、TaskManager 的运行状态、监控信息、各项配置等等。

作为平台方,我们会给 Flink 增加各项新功能,例如提交 SQL 代码、动态调整作业配置、实时开启或关闭某些特性、下发调试指令等等,都可以通过扩展 REST API 来实现。

但是,由于这套系统的调用是阻塞性的,如果某个 API 长期不响应,就会持续阻塞调用方,甚至会造成 JobManager 长期卡顿,严重影响其他接口的正常请求。

因此,我们在新增接口时,一定要遵循一定的法则,以确保整体的可用和可靠性。

非阻塞的 Flink REST API 设计要点

关于拓展 Flink REST API 的方法,我们可以在 Flink 官网文档、各类技术社区文章中得到详细的指引,因而这里不再赘述基础的细节,而是更侧重于讲解遇到的一些常见的问题和解决方案。

从设计流程上来看,如文章所述,我们可以先定义这个接口所需的请求体结构(RequestBody)返回体结构(ResponseBody) 、参数列表(MessageParameters)随后实现一个 Handler(AbstractRestHandler),即可在 flink-runtime 模块的 WebMonitorEndpoint 类中,注册这个新的 Handler。

从请求链路上来看,一个请求主要流向是:

用户请求 → Netty Server → 用户定义的 Handler → ResourceManagerGateway → ResourceManager → TaskExecutorGateway → TaskManager → 用户定义的 Task

请求体、返回体设计

通常对于接受 GET 方法的 REST API 而言,可以直接使用 EmptyRequestBody 类作为请求体的结构,方便快捷。

但对于 POST 方法的 API,我们通常需要实现 RequestBody 接口,来定义该 REST 接口的请求体。

我们还需要实现 ResponseBody 接口,来定义该 REST 接口的返回体结构。

注意 ⚠:Flink 使用 Shade 操作后的 Jackson 注解来描述每个字段,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonProperty

因此我们不要直接引入未 shade 的 Jackson 类,以免与用户自己的 Jackson 类发生冲突。

参数列表设计

参数列表(MessageParameters)指的是 URL 请求里问号后面的参数,例如 /info/config?limit=5&order=desc 的加粗部分。

注意 ⚠:Flink 现有的参数列表的字段很多都采用 public final 或者 protected final 修饰,目的是为了便于编写测试用例。如果没有特殊需求,则建议使用 private final 来修饰。

REST Handler 设计

handler 是一个 REST API 接口的执行者,我们可以通过实现 handleRequest 方法来定义请求的处理逻辑。

注意 ⚠:很多接口 Handler 在构造方法里,有一个名为 executor 的参数。这个线程池的名字是 DispatcherRestEndpoint,用来异步执行一些耗时的操作。如果 Handler 里需要执行的操作很重,则一定要把操作交给这个 executor 来执行(CompletableFuture.supplyAsync 的第二个参数指定它),避免阻塞整个 Netty Server,造成 Flink UI 不响应的严重后果。

至此,我们可以让用户请求顺利到达 JobManager 的 JVM。对于需要调用 TaskManager 的功能,我们还需要了解一下 JobManager 与 TaskManager 的通讯机制。

JobManager 和 TaskManager 的通讯机制与超时处理

Flink 使用 Akka 的 Actor 模型来实现 JobManager 与 TaskManager 的命令下发与执行。我们定义了 RPC 接口后,Flink 与 Akka 会通过动态代理的方式,为我们自动生成 RPC 远程调用所需的对象;因此我们只需要把他当作本地方法来实现即可,无需关心被调用方的位置。

在 REST Handler 的具体实现上,我们在 handleRequest 方法的传参里,可以看到有一个 ResourceManagerGateway 类型的 gateway 的参数,它就是 REST Handler 与 ResourceManager(同属于 JobManager)通信的桥梁。

ResourceManager 网关和异步执行

ResourceManagerGateway 接口里定义了所有 JobManager(ResourceManager)可处理的请求列表,因此如果我们希望增加一个新的请求类型,就在这里新增一个相应的方法。

新增 Gateway 方法后,我们还需要在 ResourceManager 类里给出具体实现。在实现时,我们可以通过 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
taskExecutors.get(taskManagerId)

来获取某个特定的 TaskManager 的通讯接口(TaskExecutorGateway),它调用后返回一个 CompletableFuture 对象。

注意 ⚠:如果需要批量调用多个 TaskManager 的网关接口,为了保证所有的 TaskManager 都响应后才得到最终返回值,我们可以用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FutureUtils.combineAll(responseFutures)

来合并所有返回的 CompletableFuture 对象。

注意 ⚠: Gateway 是通讯的核心组件,因此请务必确保所有的方法都可以迅速返回(用 CompletableFuture 封装并异步执行),否则可能造成作业崩溃重启等严重后果。

TaskExecutor 网关以及处理异步超时

TaskExecutorGateway 是 JobManager(ResourceManager)与 TaskManager(TaskExecutor)之间通讯的桥梁。通过为 TaskExecutorGateway 接口中新增方法,并在 TaskExecutor 类中实现该方法,我们可以实现对 TaskManager 的功能调用。

注意 ⚠: 在 TaskExecutor 具体执行任务时,可能必须包含阻塞操作(例如下载日志、执行外部调用、触发 GC 等),但客观上又必须在规定的 timeout 范围内向 ResourceManager 返回结果,因此可以配合 FutureUtils.orTimeout 来实现超时就报错的效果。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public CompletableFuture<SomeResponse> doSomething(int param, @RpcTimeout Time timeout) {
    return FutureUtils.orTimeout(CompletableFuture.supplyAsync(
            () {
                // 一些耗时的工作
                return new SomeResponse("success");
            }, ioExecutor), timeout.getSize(), timeout.getUnit());
}

总结

新增一个 Flink REST API 很简单;但是如果设计不当,阻塞了 Flink 的核心流程,会造成作业不稳定甚至多组件超时退出的后果。

因此,用好异步逻辑,尽可能减少阻塞,防止超时,是我们必须关注的细节,也是开发完成后的重点测试项。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Flink源码实战(一)】给Flink增加一个REST API
Flink官方实现了大量的REST API接口,有用于Flink UI展示数据、也用于各自监控面板。这些REST API的webserver作为JobManager的一部分在运行。默认端口是8081,可以通过flink-conf.yaml的rest.port参数进行配置。
皮皮熊
2021/06/10
4K0
【Flink源码实战(一)】给Flink增加一个REST API
[源码解析] Flink的Slot究竟是什么?(1)
Flink的Slot概念大家应该都听说过,但是可能很多朋友还不甚了解其中细节,比如具体Slot究竟代表什么?在代码中如何实现?Slot在生成执行图、调度、分配资源、部署、执行阶段分别起到什么作用?本文和下文将带领大家一起分析源码,为你揭开Slot背后的机理。
罗西的思考
2020/09/07
3.3K0
[源码解析] Flink的Slot究竟是什么?(1)
从头分析flink源码第五篇之提交jobGraph时各组件内部都发生了什么?
上几篇文章中我们分析了一个flink wordcount任务生成streamGraph和jobGraph的过程。接下来,我们继续从jobGraph生成后开始来分析executionGraph的生成过程及任务的提交过程,本文主要分析任务提交过程中各组件的执行逻辑,如TaskManager、ResourceManager、JobManager等。本文只涉及到本地运行wordcount时各组件的内部运行逻辑分析,不包括其他资源管理模式如yarn或Kubernetes模式下任务的提交流程(后续会专门行文来分析)。文章较长,代码较多,不喜慎入。
山行AI
2021/09/14
1.4K0
从头分析flink源码第五篇之提交jobGraph时各组件内部都发生了什么?
Flink Metrics&REST API 介绍和原理解析
一个监控系统对于每一个服务和应用基本上都是必不可少的。在 Flink 源码中监控相关功能主要在 flink-metrics 模块中,用于对 Flink 应用进行性能度量。Flink 监控模块使用的是当前比较流行的 metrics-core 库,来自 Coda Hale 的 dropwizard/metrics [1]。dropwizard/metrics 不仅仅在 Flink 项目中使用到,Kafka、Spark 等项目也是用的这个库。Metrics 包含监控的指标(Metric)以及指标如何导出(Reporter)。Metric 为多层树形结构,Metric Group + Metric Name 构成了指标的唯一标识。Reporter 支持上报到 JMX、Influxdb、Prometheus 等时序数据库。Flink 监控模块具体的使用配置可以在 flink-core 模块的 org.apache.flink.configuration.MetricOptions 中找到。
吴云涛
2022/04/07
4.5K2
Flink Metrics&REST API 介绍和原理解析
[源码解析] Flink的Slot究竟是什么?(2)
Flink的Slot概念大家应该都听说过,但是可能很多朋友还不甚了解其中细节,比如具体Slot究竟代表什么?在代码中如何实现?Slot在生成执行图、调度、分配资源、部署、执行阶段分别起到什么作用?本文和上文将带领大家一起分析源码,为你揭开Slot背后的机理。
罗西的思考
2020/09/07
1.3K0
[源码解析] Flink的Slot究竟是什么?(2)
Flink面试通关手册「160题升级版」
主要是当Flink开启Checkpoint的时候,会往Source端插入一条barrir,然后这个barrir随着数据流向一直流动,当流入到一个算子的时候,这个算子就开始制作checkpoint,制作的是从barrir来到之前的时候当前算子的状态,将状态写入状态后端当中。然后将barrir往下流动,当流动到keyby 或者shuffle算子的时候,例如当一个算子的数据,依赖于多个流的时候,这个时候会有barrir对齐,也就是当所有的barrir都来到这个算子的时候进行制作checkpoint,依次进行流动,当流动到sink算子的时候,并且sink算子也制作完成checkpoint会向jobmanager 报告 checkpoint n 制作完成。
大数据真好玩
2021/07/07
2.8K0
flink源码分析之TaskManager启动篇
客户端不是运行时和程序执行的一部分,但用于准备数据流并将其发送到JobManager。之后,客户端可以断开连接(分离模式 detached mode),或者保持连接以接收进度报告(附加模式 attached mode)。客户机可以作为触发执行的Java/Scala程序的一部分运行,也可以在命令行使用./bin/flink run...开启进程中运行。
山行AI
2020/10/27
3K0
flink源码分析之TaskManager启动篇
聊聊flink的log.file配置
flink-release-1.6.2/flink-dist/src/main/flink-bin/conf/log4j.properties
code4it
2018/11/22
6K0
聊聊flink的log.file配置
2021年大数据Flink(九):Flink原理初探
它扮演的是集群管理者的角色,负责调度任务、协调 checkpoints、协调故障恢复、收集 Job 的状态信息,并管理 Flink 集群中的从节点 TaskManager。
Lansonli
2021/10/11
1.2K0
数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配
4)在perJob模式下,最终调用的是YarnJobClusterEntrypoint
袋鼠云数栈
2021/05/26
1.8K0
数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配
flink on yarn部分源码解析 (FLIP-6 new mode)
我们在https://www.cnblogs.com/dongxiao-yang/p/9403427.html文章里分析了flink提交single job到yarn集群上的代码,flink在1.5版
sanmutongzi
2020/03/04
9460
flink on yarn部分源码解析 (FLIP-6 new mode)
大数据Flink进阶(八):Apache Flink架构介绍
在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。
Lansonli
2023/03/27
2.7K0
大数据Flink进阶(八):Apache Flink架构介绍
【Flink】第三十三篇: 任务线程模型
线程模型能帮助我们更深刻的理解Flink任务执行原理,更精确的控制Flink程序,这些是使用Flink解决复杂问题、写出高性能和高可用程序的基础。
章鱼carl
2022/03/31
2.2K0
【Flink】第三十三篇: 任务线程模型
Flink(arm) on K8S 部署时的那些坑
我对k8s还算了解,但在此之前没接触过flink,部署起来确实有点困难。本文记录在此过程中遇到的问题,以及问题原因和解决方案。
用户1529997
2024/08/07
4190
Flink(arm) on K8S 部署时的那些坑
[源码解析] 从TimeoutException看Flink的心跳机制
本文从一个调试时候常见的异常 "TimeoutException: Heartbeat of TaskManager timed out"切入,为大家剖析Flink的心跳机制。文中代码基于Flink 1.10。
罗西的思考
2020/09/07
5.9K0
Flink核心概念之架构解析
Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,例如Hadoop YARN、Apache Mesos和Kubernetes,但也可以设置作为独立集群甚至库运行。
从大数据到人工智能
2022/02/08
7870
Flink核心概念之架构解析
Flink源码走读(一):Flink工程目录
导语 | Flink已经成为未来流计算趋势,目前在很多大厂已经有了大规模的使用。最近在学习Flink源码,就想把自己学习的过程分享出来,希望能帮助到志同道合的朋友。开始阅读源码,说明读者已经对flink的基本概念有一些了解,这里就不再重复介绍Flink了。本文作为学习过程的第一章,首先对Flink的工程目录做一个解读,了解了工程下各个模块的作用,才能在遇到问题时准确定位到代码,进一步学习。
2011aad
2020/02/14
9.2K2
Flink源码走读(一):Flink工程目录
Flink on YARN 基础架构与启动流程
本文转载Flink官方社区文章:一张图轻松掌握 Flink on YARN 基础架构与启动流程
神秘的寇先森
2020/02/19
2.3K0
Flink架构
Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,如Hadoop YARN,但也可以设置作为独立集群甚至库运行。
JavaEdge
2024/08/03
1620
Flink架构
Flink源码分析之RPC通信
Flink基于Akka来实现内部各组件(ResourceManager、Dispatcher、JobMaster、TaskExecutor等)间的RPC通信。本篇着重分析Flink的RPC设计,如何封装Actor模型,RPC的创建和调用流程。
楞头青
2022/07/12
1.7K2
相关推荐
【Flink源码实战(一)】给Flink增加一个REST API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验