Flink源码阅读(四)JobManager和TaskManager的rpc

本文从Flink JobManager和TaskManager的交互入手,探讨RPC通信方式。通过分析submitTask方法,揭示了Flink内部RPC框架的工作原理。客户端使用AkkaInvocationHandler代理,服务端通过AkkaRpcActor接收并处理请求。虽然Flink实现了自己的RPC框架,但也提出了可考虑使用Netty或其他成熟RPC框架替代的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

我们知道,jobmanager和taskmanager在集群模式下,是部署在不同机器上面的,那么现在就有一个问题,jobmanager和taskmanager是如何相互调用的。

分析

切入点

1 考虑以taskExecutor方法的submitTask方法为入口,查看调用关系在这里插入图片描述

图中并没有提供明显的线索,看RpcTaskManagerGateway所处的包,猜测其位于JobManager,然后突然调用到了TaskManager,很是困惑。

2 在submitTask中增加断点,获得调用堆栈
在这里插入图片描述

3.在org.apache.flink.runtime.jobmaster.RpcTaskManagerGateway.submitTask(TaskDeploymentDescriptor, Time)中增加断点在这里插入图片描述

结论

  经过上面的分析,flink中的rpc已经相当清楚了

客户端

  客户端被AkkaInvocationHandler代理,调用下面方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
   
		Class<?> declaringClass = method.getDeclaringClass();

		Object result;

		if (declaringClass.equals(AkkaBasedEndpoint.class) ||
			declaringClass.equals(Object.class) ||
			declaringClass.equals(RpcGateway.class) ||
			declaringClass.equals(StartStoppable.class) ||
			declaringClass.equals(MainThreadExecutable.class) ||
			declaringClass.equals(RpcServer.class)) {
   
   
			result = method.invoke(this, args);
		} else if (declaringClass.equals(FencedRpcGateway.class)) {
   
   
			throw new UnsupportedOperationException("AkkaInvocationHandler does not support the call FencedRpcGateway#" +
				method.getName() + ". This indicates that you retrieved a FencedRpcGateway without specifying a " +
				"fencing token. Please use RpcService#connect(RpcService, F, Time) with F being the fencing token to " +
				"retrieve a properly FencedRpcGateway.");
		} else {
   
   
		    //代理的方法
			result = invokeRpc(method
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值