Flink的WebMonitorEndpoint介绍+自定义Flink的Handler

Flink的WebMonitorEndpoint介绍+自定义Flink的Handler
一、WebMonitorEndpoint
1)概述

WebMonitorEndpoint 是基于Netty通信框架实现了Restful的服务后端,提供Restful接口支持Flink Web页面在内的所有Rest请求,例如获取集群监控指标。

WebMonitorEndpoint的创建过程比较简单,并且RestEndpoint实现了针对Session和JobCluster集群的SessionRestEndpointFactory和JobRestEndpointFactory两种工厂创建类。

2)类结构

WebMonitorEndpoint继承了RestServerEndpoint基本实现类,其中RestServerEndpoint基于Netty框架实现了Rest服务后端,并提供了自定义Handler的初始化和实现的抽象方法。

WebMonitorEndpoint和DispatcherRestEndpoint等子类能够拓展处理各自业务的Rest接口对应的Handlers实现。

对于WebMonitorEndpoint的另一个实现类MiniDispatcherRestEndpoint,主要是针对本地执行实现的mini版DispatcherRestEndpoint,区别在于MiniDispatcherRestEndpoint不用加载JobGraph提交使用的Handlers,这是因为MiniDispatcherRestEndpoint不支持通过RestAPI提交JobGraph。

在IDEA中执行作业时创建的实际上是MiniCluster,而在MiniCluster中对应的WebMonitorEndpoint实现是MiniDispatcherRestEndpoint。

3)创建 WebMonitorEndpoint
return new DispatcherRestEndpoint(
                dispatcherGatewayRetriever,
                configuration,
                restHandlerConfiguration,
                resourceManagerGatewayRetriever,
                transientBlobService,
                executor,
                metricFetcher,
                leaderElectionService,
                RestEndpointFactory.createExecutionGraphCache(restHandlerConfiguration),
                fatalErrorHandler);
参数解析
创建方法涉及参数如下。

configuration:集群配置参数。

dispatcherGatewayRetriever:DispatcherGateway服务地址获取器,用于获取当前活跃的dispatcherGateway地址。基于dispatcherGateway可以实现与Dispatcher的RPC通信,最终提交的JobGraph通过dispatcherGateway发送给Dispatcher组件。

resourceManagerGatewayRetriever:ResourceManagerGateway服务地址获取器,用于获取当前活跃的ResourceManagerGateway地址,通过ResourceManagerGateway实现ResourceManager组件之间的RPC通信,例如在TaskManagersHandler中通过调用ResourceManagerGateway获取集群中的TaskManagers监控信息。

transientBlobService:临时二进制对象数据存储服务,BlobServer接收数据后,会及时清理Cache中的对象数据。

executor:用于处理WebMonitorEndpoint请求的线程池服务。

metricFetcher:用于拉取JobManager和TaskManager上的Metric监控指标。

leaderElectionService:用于在高可用集群中启动和选择服务的Leader节点,如通过leaderElectionService启动WebMonitorEndpoint RPC服务,然后将Leader节点注册至ZooKeeper,以此实现WebMonitorEndpoint服务的高可用。

fatalErrorHandler:异常处理器,当WebMonitorEndpoint出现异常时调用fatalErrorHandler中的处理接口。
4)启动 WebMonitorEndpoint
webMonitorEndpoint.start();
方法主要包含如下逻辑:

检查RestServerEndpoint.state是否为CREATED状态。

启动RestEndpoint,创建Handler使用的路由类Router,用于根据地址寻找对应的Handlers。

调用initializeHandlers()方法初始化子类注册的Handlers,例如WebMonitorEndpoint中的Handlers实现。

调用registerHandler()方法注册已经加载的Handlers。

创建ChannelInitializer服务,初始化Netty中的Channel,在initChannel()方法中设定SocketChannel中Pipeline使用的拦截器。
在Netty中使用ServerBootstrap或者bootstrap启动服务端或者客户端时,会为每个Channel链接创建一个独立的Pipeline,此时需要将自定义的Handler加入Pipeline。
这里实际上会将加载的Handlers加入创建的Pipeline。
在Pipeline中也会按照顺序在尾部增加HttpServerCodec、FileUploadHandler以及ChunkedWriteHandler等基础Handlers处理器。

创建bossGroup和workerGroup两个NioEventLoopGroup实例,可以将其理解为两个线程池,bossGroup设置了一个用于处理连接请求和建立连接的线程,workGroup用于在连接建立之后处理I/O请求。

创建ServerBootstrap启动类并绑定bossGroup、workerGroup和initializer等参数。

为了防止出现端口占用的情况,从restBindPortRange中抽取端口范围。使用bootstrap.bind(chosenPort)按照顺序进行绑定,如果绑定成功则调用bind()方法,启动ServerBootstrap服务,此时Web端口(默认为8081)就可以正常访问了。

将RestServerEndpoint中的状态设定为RUNNING,调用WebMonitorEndpoint.startinternal()方法,启动RPC高可用服务。
初始化 JobSubmitHandler 主要有以下步骤
调用WebMonitorEndpoint.initializeHandlers()方法,加载WebMonitorEndpoint中用于监控指标展示的Handlers。

创建JobSubmitHandler,用于任务提交,其中leaderRetriever参数用于获取DispatcherGateway的Leader地址。

如果集群允许通过Web提交JobGraph,就会通过WebSubmissionExtension加载Web提交任务相关的Handler,在WebSubmissionExtension中包含通过WebSubmissionExtension提交作业的全部Handler,如上传JAR包使用的JarUploadHandler、执行任务使用的JarRunHandler等,对Per-Job类型集群来讲,JarUploadHandler默认是不加载的,不允许提交和运行新的作业。

在loadWebSubmissionExtension()方法中,实际上通过反射的方式构建WebSubmissionExtension,然后获取WebSubmissionExtension中的Handlers。

将jobSubmitHandler添加到handlers中,并返回handlers集合。
节点选举以及方法回调,startInternal();

小结

1.初始化一堆Handler
2.启动Netty服务,注册Handler
3.启动内部服务: 执行竞选,WebMonitorEndpoint本身就是一个LeaderContender角色
4.竞选成功,其实只是把WebMonitorEndpoint的address以及和zk的sessionId写入znode中

二、分析 JarRunnerHandler
1)核心类

1.处理请求的类:JarRunHandler

2.绑定Handler和URL的类:JarRunHeaders

2)请求处理的核心流程
创建并初始化 JarRunHandler
jarRunHandler =
                new JarRunHandler(
                        leaderRetriever,
                        timeout,
                        responseHeaders,
                        JarRunHeaders.getInstance(),
                        jarDir,
                        configuration,
                        jarRunExecutor,
                        applicationRunnerSupplier);

在这里插入图片描述

三、分析 ClusterOverviewHandler
1)创建ClusterOverviewHandler
// 创建并初始化 ClusterOverviewHandler
ClusterOverviewHandler clusterOverviewHandler =
                new ClusterOverviewHandler(
                        leaderRetriever,
                        timeout,
                        responseHeaders,
                        ClusterOverviewHeaders.getInstance());
1.ClusterOverviewHandler处理请求的核心方法
		@Override
    public CompletableFuture<ClusterOverviewWithVersion> handleRequest(
            @Nonnull HandlerRequest<EmptyRequestBody, EmptyMessageParameters> request,
            @Nonnull RestfulGateway gateway) {
        
        // 调用 RestfulGateway 获取对应的参数信息
        CompletableFuture<ClusterOverview> overviewFuture = gateway.requestClusterOverview(timeout);

        return overviewFuture.thenApply(
                statusOverview ->
                        ClusterOverviewWithVersion.fromStatusOverview(
                                statusOverview, version, commitID));
    }
2.ClusterOverviewHeaders中包含请求的方式、URL、版本等信息
public final class ClusterOverviewHeaders
        implements MessageHeaders<
                EmptyRequestBody, ClusterOverviewWithVersion, EmptyMessageParameters> {

    private static final ClusterOverviewHeaders INSTANCE = new ClusterOverviewHeaders();

    public static final String URL = "/overview";

    // make this class a singleton
    private ClusterOverviewHeaders() {}

    @Override
    public Class<EmptyRequestBody> getRequestClass() {
        return EmptyRequestBody.class;
    }

    @Override
    public HttpMethodWrapper getHttpMethod() {
        return HttpMethodWrapper.GET;
    }

    @Override
    public String getTargetRestEndpointURL() {
        return URL;
    }

    @Override
    public Class<ClusterOverviewWithVersion> getResponseClass() {
        return ClusterOverviewWithVersion.class;
    }

    @Override
    public HttpResponseStatus getResponseStatusCode() {
        return HttpResponseStatus.OK;
    }

    @Override
    public EmptyMessageParameters getUnresolvedMessageParameters() {
        return EmptyMessageParameters.getInstance();
    }

    public static ClusterOverviewHeaders getInstance() {
        return INSTANCE;
    }

    @Override
    public String getDescription() {
        return "Returns an overview over the Flink cluster.";
    }
}
2)添加到 handler 集合中
handlers.add(Tuple2.of(clusterOverviewHandler.getMessageHeaders(), clusterOverviewHandler));
3)注册 handler
handlers.forEach(handler -> registerHandler(router, handler, log));
private static void registerHandler(
            Router router,
            String handlerURL,
            HttpMethodWrapper httpMethod,
            ChannelInboundHandler handler) {
        switch (httpMethod) {
            case GET:
                router.addGet(handlerURL, handler);
                break;
            case POST:
                router.addPost(handlerURL, handler);
                break;
            case DELETE:
                router.addDelete(handlerURL, handler);
                break;
            case PATCH:
                router.addPatch(handlerURL, handler);
                break;
            default:
                throw new RuntimeException("Unsupported http method: " + httpMethod + '.');
        }
    }
四、自定义 WebMonitorHandler

1)新建 Handler【用于处理核心业务请求】,继承 AbstractRestHandler 重写 handleRequest 方法,注意方法的返回值需要为 CompletableFuture<?>。

package org.apache.flink.runtime.rest.mycustom;

import org.apache.flink.api.common.time.Time;
import org.apache.flink.runtime.messages.webmonitor.ClusterOverview;
import org.apache.flink.runtime.rest.handler.AbstractRestHandler;
import org.apache.flink.runtime.rest.handler.HandlerRequest;
import org.apache.flink.runtime.rest.messages.EmptyMessageParameters;
import org.apache.flink.runtime.rest.messages.EmptyRequestBody;
import org.apache.flink.runtime.rest.messages.MessageHeaders;
import org.apache.flink.runtime.util.EnvironmentInformation;
import org.apache.flink.runtime.webmonitor.RestfulGateway;
import org.apache.flink.runtime.webmonitor.retriever.GatewayRetriever;

import javax.annotation.Nonnull;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.function.Supplier;

public class MyWebMonitorHandler extends AbstractRestHandler<
        RestfulGateway,
        EmptyRequestBody,
        MyHandlerResponseBody,
        EmptyMessageParameters> {
    private static final String version = EnvironmentInformation.getVersion();

    private static final String commitID = EnvironmentInformation.getRevisionInformation().commitId;

    public MyWebMonitorHandler(
            GatewayRetriever<? extends RestfulGateway> leaderRetriever,
            Time timeout,
            Map<String, String> responseHeaders,
            MessageHeaders<EmptyRequestBody, MyHandlerResponseBody, EmptyMessageParameters>
                    messageHeaders) {
        super(leaderRetriever, timeout, responseHeaders, messageHeaders);
    }

    @Override
    public CompletableFuture<MyHandlerResponseBody> handleRequest(
            @Nonnull HandlerRequest<EmptyRequestBody, EmptyMessageParameters> request,
            @Nonnull RestfulGateway gateway) {

        CompletableFuture<ClusterOverview> future = gateway.requestClusterOverview(Time.seconds(3));

        return future.thenApply(new Function<ClusterOverview, MyHandlerResponseBody>() {
            @Override
            public MyHandlerResponseBody apply(ClusterOverview clusterOverview) {
                return new MyHandlerResponseBody(gateway.getHostname(),
                        gateway.getAddress(),
                        clusterOverview.getNumSlotsTotal(),
                        version,
                        commitID);
            }
        });
    }
}
2)新建 Headers【用于绑定 Handler 和 URL】,实现 MessageHeaders 接口,并重写以下方法
package org.apache.flink.runtime.rest.mycustom;

import org.apache.flink.runtime.rest.HttpMethodWrapper;
import org.apache.flink.runtime.rest.messages.EmptyMessageParameters;
import org.apache.flink.runtime.rest.messages.EmptyRequestBody;
import org.apache.flink.runtime.rest.messages.MessageHeaders;
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpResponseStatus;

public class MyWebMonitorHeaders implements MessageHeaders<
        EmptyRequestBody, MyHandlerResponseBody, EmptyMessageParameters> {
    
    private static final MyWebMonitorHeaders INSTANCE = new MyWebMonitorHeaders();

    public static final String URL = "/my/handler";

    private MyWebMonitorHeaders() {}

    @Override
    public Class<EmptyRequestBody> getRequestClass() {
        return EmptyRequestBody.class;
    }

    @Override
    public HttpMethodWrapper getHttpMethod() {
        return HttpMethodWrapper.GET;
    }

    @Override
    public String getTargetRestEndpointURL() {
        return URL;
    }

    @Override
    public Class<MyHandlerResponseBody> getResponseClass() {
        return MyHandlerResponseBody.class;
    }

    @Override
    public HttpResponseStatus getResponseStatusCode() {
        return HttpResponseStatus.OK;
    }

    @Override
    public EmptyMessageParameters getUnresolvedMessageParameters() {
        return EmptyMessageParameters.getInstance();
    }

    public static MyWebMonitorHeaders getInstance() {
        return INSTANCE;
    }

    @Override
    public String getDescription() {
        return "My Custom Handler";
    }
}

返回的响应类

package org.apache.flink.runtime.rest.mycustom;

import org.apache.flink.runtime.messages.webmonitor.InfoMessage;
import org.apache.flink.runtime.rest.messages.ResponseBody;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonProperty;

public class MyHandlerResponseBody implements ResponseBody, InfoMessage {

    @JsonProperty("hostname")
    private String hostName;

    @JsonProperty("address")
    private String address;

    @JsonProperty("slots")
    private Integer slots;

    @JsonProperty("flink-version")
    private final String version;

    @JsonProperty("flink-commit")
    private final String commitId;

    public MyHandlerResponseBody(@JsonProperty("hostname") String hostName,
                                 @JsonProperty("address") String address,
                                 @JsonProperty("slots") Integer slots,
                                 @JsonProperty("flink-version") String version,
                                 @JsonProperty("flink-commit") String commitId) {
        this.hostName = hostName;
        this.address = address;
        this.slots = slots;
        this.version = version;
        this.commitId = commitId;
    }

    @Override
    public String toString() {
        return "myHandler {"
                + "hostname="
                + hostName
                + ", address="
                + address
                + ", slots="
                + slots
                + ", version="
                + version
                + ", commit="
                + commitId
                + '}';
    }
}
3)在 RestServerEndpoint#initializeHandlers 方法中进行初始化,随后会和默认的 handler 一起进行注册
MyWebMonitorHandler myWebMonitorHandler =
                new MyWebMonitorHandler(
                        leaderRetriever,
                        timeout,
                        responseHeaders,
                        MyWebMonitorHeaders.getInstance());
                        
handlers.add(Tuple2.of(myWebMonitorHandler.getMessageHeaders(),myWebMonitorHandler));
4)测试

在这里插入图片描述

五、罗列一份 Flink 的 Handler 和 请求的 URL

列举的方式为:将 Flink 的日志改为 DEBUG 模式,在启动集群的时候会打印。

log.debug(
    "Register handler {} under {}@{}.",
    specificationHandler.f1,
    specificationHandler.f0.getHttpMethod(),
    versionedHandlerURL);
cluster.ShutdownHandlerDELETE@/v1/cluster.
cluster.ShutdownHandlerDELETE@/cluster.
cluster.DashboardConfigHandlerGET@/v1/config.
cluster.DashboardConfigHandlerGET@/config.
dataset.ClusterDataSetListHandlerGET@/v1/datasets.
dataset.ClusterDataSetListHandlerGET@/datasets.
ClusterDataSetDeleteStatusHandlerGET@/v1/datasets/delete/:triggerid.
ClusterDataSetDeleteStatusHandlerGET@/datasets/delete/:triggerid.
ClusterDataSetDeleteTriggerHandlerDELETE@/v1/datasets/:datasetid.
ClusterDataSetDeleteTriggerHandlerDELETE@/datasets/:datasetid.
handlers.JarListHandlerGET@/v1/jars.
handlers.JarListHandlerGET@/jars.
handlers.JarUploadHandlerPOST@/v1/jars/upload.
handlers.JarUploadHandlerPOST@/jars/upload.
handlers.JarDeleteHandlerDELETE@/v1/jars/:jarid.
handlers.JarDeleteHandlerDELETE@/jars/:jarid.
handlers.JarPlanHandlerGET@/v1/jars/:jarid/plan.
handlers.JarPlanHandlerGET@/jars/:jarid/plan.
handlers.JarPlanHandlerPOST@/v1/jars/:jarid/plan.
handlers.JarPlanHandlerPOST@/jars/:jarid/plan.
handlers.JarRunHandlerPOST@/v1/jars/:jarid/run.
handlers.JarRunHandlerPOST@/jars/:jarid/run.
cluster.ClusterConfigHandlerGET@/v1/jobmanager/config.
cluster.ClusterConfigHandlerGET@/jobmanager/config.
cluster.JobManagerLogFileHandlerGET@/v1/jobmanager/log.
cluster.JobManagerLogFileHandlerGET@/jobmanager/log.
cluster.JobManagerLogListHandlerGET@/v1/jobmanager/logs.
cluster.JobManagerLogListHandlerGET@/jobmanager/logs.
cluster.JobManagerCustomLogHandlerGET@/v1/jobmanager/logs/:filename.
cluster.JobManagerCustomLogHandlerGET@/jobmanager/logs/:filename.
job.metrics.JobManagerMetricsHandlerGET@/v1/jobmanager/metrics.
job.metrics.JobManagerMetricsHandlerGET@/jobmanager/metrics.
cluster.JobManagerLogFileHandlerGET@/v1/jobmanager/stdout.
cluster.JobManagerLogFileHandlerGET@/jobmanager/stdout.
job.JobIdsHandlerGET@/v1/jobs.
job.JobIdsHandlerGET@/jobs.
job.JobSubmitHandlerPOST@/v1/jobs.
job.JobSubmitHandlerPOST@/jobs.
job.metrics.AggregatingJobsMetricsHandlerGET@/v1/jobs/metrics.
job.metrics.AggregatingJobsMetricsHandlerGET@/jobs/metrics.
job.JobsOverviewHandlerGET@/v1/jobs/overview.
job.JobsOverviewHandlerGET@/jobs/overview.
job.JobDetailsHandlerGET@/v1/jobs/:jobid.
job.JobDetailsHandlerGET@/jobs/:jobid.
job.JobCancellationHandlerPATCH@/v1/jobs/:jobid.
job.JobCancellationHandlerPATCH@/jobs/:jobid.
job.JobAccumulatorsHandlerGET@/v1/jobs/:jobid/accumulators.
job.JobAccumulatorsHandlerGET@/jobs/:jobid/accumulators.
job.checkpoints.CheckpointingStatisticsHandlerGET@/v1/jobs/:jobid/checkpoints.
job.checkpoints.CheckpointingStatisticsHandlerGET@/jobs/:jobid/checkpoints.
job.checkpoints.CheckpointConfigHandlerGET@/v1/jobs/:jobid/checkpoints/config.
job.checkpoints.CheckpointConfigHandlerGET@/jobs/:jobid/checkpoints/config.
job.checkpoints.CheckpointStatisticDetailsHandlerGET@/v1/jobs/:jobid/checkpoints/details/:checkpointid.
job.checkpoints.CheckpointStatisticDetailsHandlerGET@/jobs/:jobid/checkpoints/details/:checkpointid.
job.checkpoints.TaskCheckpointStatisticDetailsHandlGET@/v1/jobs/:jobid/checkpoints/details/:checkpointid/subtasks/:vertexid.
job.checkpoints.TaskCheckpointStatisticDetailsHandlGET@/jobs/:jobid/checkpoints/details/:checkpointid/subtasks/:vertexid.
job.JobConfigHandlerGET@/v1/jobs/:jobid/config.
job.JobConfigHandlerGET@/jobs/:jobid/config.
job.coordination.ClientCoordinationHandlerPOST@/v1/jobs/:jobid/coordinators/:operatorid.
job.coordination.ClientCoordinationHandlerPOST@/jobs/:jobid/coordinators/:operatorid.
job.JobExceptionsHandlerGET@/v1/jobs/:jobid/exceptions.
job.JobExceptionsHandlerGET@/jobs/:jobid/exceptions.
job.JobExecutionResultHandlerGET@/v1/jobs/:jobid/execution-result.
job.JobExecutionResultHandlerGET@/jobs/:jobid/execution-result.
job.metrics.JobMetricsHandlerGET@/v1/jobs/:jobid/metrics.
job.metrics.JobMetricsHandlerGET@/jobs/:jobid/metrics.
job.JobPlanHandlerGET@/v1/jobs/:jobid/plan.
job.JobPlanHandlerGET@/jobs/:jobid/plan.
RescalingTriggerHandlerPATCH@/v1/jobs/:jobid/rescaling.
RescalingTriggerHandlerPATCH@/jobs/:jobid/rescaling.
RescalingStatusHandlerGET@/v1/jobs/:jobid/rescaling/:triggerid.
RescalingStatusHandlerGET@/jobs/:jobid/rescaling/:triggerid.
SavepointTriggerHandlerPOST@/v1/jobs/:jobid/savepoints.
SavepointTriggerHandlerPOST@/jobs/:jobid/savepoints.
SavepointStatusHandlerGET@/v1/jobs/:jobid/savepoints/:triggerid.
SavepointStatusHandlerGET@/jobs/:jobid/savepoints/:triggerid.
StopWithSavepointHandlerPOST@/v1/jobs/:jobid/stop.
StopWithSavepointHandlerPOST@/jobs/:jobid/stop.
job.JobVertexDetailsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid.
job.JobVertexDetailsHandlerGET@/jobs/:jobid/vertices/:vertexid.
job.JobVertexAccumulatorsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/accumulators.
job.JobVertexAccumulatorsHandlerGET@/jobs/:jobid/vertices/:vertexid/accumulators.
job.JobVertexBackPressureHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/backpressure.
job.JobVertexBackPressureHandlerGET@/jobs/:jobid/vertices/:vertexid/backpressure.
DisabledJobVertexFlameGraphHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/flamegraph.
DisabledJobVertexFlameGraphHandlerGET@/jobs/:jobid/vertices/:vertexid/flamegraph.
job.metrics.JobVertexMetricsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/metrics.
job.metrics.JobVertexMetricsHandlerGET@/jobs/:jobid/vertices/:vertexid/metrics.
job.SubtasksAllAccumulatorsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/accumulators.
job.SubtasksAllAccumulatorsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/accumulators.
job.metrics.AggregatingSubtasksMetricsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/metrics.
job.metrics.AggregatingSubtasksMetricsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/metrics.
job.SubtaskCurrentAttemptDetailsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex.
job.SubtaskCurrentAttemptDetailsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex.
job.SubtaskExecutionAttemptDetailsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/attempts/:attempt.
job.SubtaskExecutionAttemptDetailsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/attempts/:attempt.
job.SubtaskExecutionAttemptAccumulatorsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/attempts/:attempt/accumulators.
job.SubtaskExecutionAttemptAccumulatorsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/attempts/:attempt/accumulators.
job.metrics.SubtaskMetricsHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/metrics.
job.metrics.SubtaskMetricsHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasks/:subtaskindex/metrics.
job.SubtasksTimesHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/subtasktimes.
job.SubtasksTimesHandlerGET@/jobs/:jobid/vertices/:vertexid/subtasktimes.
job.JobVertexTaskManagersHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/taskmanagers.
job.JobVertexTaskManagersHandlerGET@/jobs/:jobid/vertices/:vertexid/taskmanagers.
job.metrics.JobVertexWatermarksHandlerGET@/v1/jobs/:jobid/vertices/:vertexid/watermarks.
job.metrics.JobVertexWatermarksHandlerGET@/jobs/:jobid/vertices/:vertexid/watermarks.
job.JobCancellationHandlerGET@/v1/jobs/:jobid/yarn-cancel.
job.JobCancellationHandlerGET@/jobs/:jobid/yarn-cancel.
job.JobCancellationHandlerGET@/v1/jobs/:jobid/yarn-stop.
job.JobCancellationHandlerGET@/jobs/:jobid/yarn-stop.
cluster.ClusterOverviewHandlerGET@/v1/overview.
cluster.ClusterOverviewHandlerGET@/overview.
SavepointDisposalTriggerHandlerPOST@/v1/savepoint-disposal.
SavepointDisposalTriggerHandlerPOST@/savepoint-disposal.
SavepointDisposalStatusHandlerGET@/v1/savepoint-disposal/:triggerid.
SavepointDisposalStatusHandlerGET@/savepoint-disposal/:triggerid.
taskmanager.TaskManagersHandlerGET@/v1/taskmanagers.
taskmanager.TaskManagersHandlerGET@/taskmanagers.
job.metrics.AggregatingTaskManagersMetricsHandlerGET@/v1/taskmanagers/metrics.
job.metrics.AggregatingTaskManagersMetricsHandlerGET@/taskmanagers/metrics.
taskmanager.TaskManagerDetailsHandlerGET@/v1/taskmanagers/:taskmanagerid.
taskmanager.TaskManagerDetailsHandlerGET@/taskmanagers/:taskmanagerid.
taskmanager.TaskManagerLogFileHandlerGET@/v1/taskmanagers/:taskmanagerid/log.
taskmanager.TaskManagerLogFileHandlerGET@/taskmanagers/:taskmanagerid/log.
taskmanager.TaskManagerLogListHandlerGET@/v1/taskmanagers/:taskmanagerid/logs.
taskmanager.TaskManagerLogListHandlerGET@/taskmanagers/:taskmanagerid/logs.
taskmanager.TaskManagerCustomLogHandlerGET@/v1/taskmanagers/:taskmanagerid/logs/:filename.
taskmanager.TaskManagerCustomLogHandlerGET@/taskmanagers/:taskmanagerid/logs/:filename.
job.metrics.TaskManagerMetricsHandlerGET@/v1/taskmanagers/:taskmanagerid/metrics.
job.metrics.TaskManagerMetricsHandlerGET@/taskmanagers/:taskmanagerid/metrics.
taskmanager.TaskManagerStdoutFileHandlerGET@/v1/taskmanagers/:taskmanagerid/stdout.
taskmanager.TaskManagerStdoutFileHandlerGET@/taskmanagers/:taskmanagerid/stdout.
taskmanager.TaskManagerThreadDumpHandlerGET@/v1/taskmanagers/:taskmanagerid/thread-dump.
taskmanager.TaskManagerThreadDumpHandlerGET@/taskmanagers/:taskmanagerid/thread-dump.
legacy.files.StaticFileServerHandlerGET@/v1/😗.
legacy.files.StaticFileServerHandlerGET@/😗.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫猫爱吃小鱼粮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值