美文网首页
YarnRPC过程

YarnRPC过程

作者: searchworld | 来源:发表于2017-11-26 00:10 被阅读101次

最近在看《深入解析YARN架构设计与实现原理》,看到第三章YRAN RPC实现的时候对其中如果使用ProtoBuf不是很理解,尤其是里面同一个类会有Java定义和ProtoBuf两个实现,两者的交互细节书上写的不是很清楚,这里根据自己的理解简单记录下。这里以server端为例。

Server的创建在是通过RpcServerFactoryPBImpl.getServer方法,这里protocol参数以ResourceTracker为例(在ResourceTrackerService.serviceStart中),instance参数就是ResourceTrackerService本身,也就是真正实现了rpc调用服务端方法的类。最终实现方法是:

public Server getServer(Class<?> protocol, Object instance,
      InetSocketAddress addr, Configuration conf,
      SecretManager<? extends TokenIdentifier> secretManager, int numHandlers,
      String portRangeConfig) {
    
    Constructor<?> constructor = serviceCache.get(protocol);
    if (constructor == null) {
      Class<?> pbServiceImplClazz = null;
      try {
        // getPbServiceImplClassName 根据约定的规则在 PB_IMPL_PACKAGE_SUFFIX 找到  ResourceTrackerPBServiceImpl 类
        pbServiceImplClazz = localConf
            .getClassByName(getPbServiceImplClassName(protocol));
      } catch (ClassNotFoundException e) {
        throw new YarnRuntimeException("Failed to load class: ["
            + getPbServiceImplClassName(protocol) + "]", e);
      }
      try {
        constructor = pbServiceImplClazz.getConstructor(protocol);
        constructor.setAccessible(true);
        serviceCache.putIfAbsent(protocol, constructor);
      } catch (NoSuchMethodException e) {
        throw new YarnRuntimeException("Could not find constructor with params: "
            + Long.TYPE + ", " + InetSocketAddress.class + ", "
            + Configuration.class, e);
      }
    }
    
    Object service = null;
    try {
      // 使用ResourceTrackerService实例去构造ResourceTrackerPBServiceImpl,
      // ResourceTrackerPBServiceImpl的真正功能只是将PB版的请求(比如NodeHeartbeatRequestProto)封装成Java版的请求(对应的是NodeHeartbeatRequestPBImpl),
      // 再传给ResourceTrackerService实际调用产生Java版的Response,转成PB版的返回
      service = constructor.newInstance(instance);
    } catch (InvocationTargetException e) {
      throw new YarnRuntimeException(e);
    } catch (IllegalAccessException e) {
      throw new YarnRuntimeException(e);
    } catch (InstantiationException e) {
      throw new YarnRuntimeException(e);
    }

    // service是ResourceTrackerPBServiceImpl的实例,实现 ResourceTrackerPB接口,因此pbProtocol就是ResourceTrackerPB
    Class<?> pbProtocol = service.getClass().getInterfaces()[0];
    Method method = protoCache.get(protocol);
    if (method == null) {
      Class<?> protoClazz = null;
      try {
        // 这里也是根据约定找到 ResourceTracker$ResourceTrackerService类,这个由PB生成
        protoClazz = localConf.getClassByName(getProtoClassName(protocol));
      } catch (ClassNotFoundException e) {
        throw new YarnRuntimeException("Failed to load class: ["
            + getProtoClassName(protocol) + "]", e);
      }
      try {
        method = protoClazz.getMethod("newReflectiveBlockingService",
            pbProtocol.getInterfaces()[0]);
        method.setAccessible(true);
        protoCache.putIfAbsent(protocol, method);
      } catch (NoSuchMethodException e) {
        throw new YarnRuntimeException(e);
      }
    }
    
    try {
      // method即 newReflectiveBlockingService 方法最终调用 ResourceTrackerPBServiceImpl相应的方法
      return createServer(pbProtocol, addr, conf, secretManager, numHandlers,
          (BlockingService)method.invoke(null, service), portRangeConfig);
    } catch (InvocationTargetException e) {
      throw new YarnRuntimeException(e);
    } catch (IllegalAccessException e) {
      throw new YarnRuntimeException(e);
    } catch (IOException e) {
      throw new YarnRuntimeException(e);
    }
  }
  • ResourceTrackerService会启动一个RPC server,本身真正实现了服务端RPC请求的处理逻辑,在RPC server中注册自己。
  • ResourceTrackerPBServiceImpl是作为代理进行Java和PB实现的转换,实际是调用ResourceTrackerService真正的实现。Yarn RPC中Request和Response有两种,一种是PB定义的,真正序列化的时候使用;一种是Java定义的,对PB生成的进行封装,在编程的时候使用,因此需要进行转换
  • ResourceTracker$ResourceTrackerService是PB自动生成的类,最终是执行ResourceTrackerPBServiceImpl相应的方法

相关文章

  • YarnRPC过程

    最近在看《深入解析YARN架构设计与实现原理》,看到第三章YRAN RPC实现的时候对其中如果使用ProtoBuf...

  • 过程,过程,过程

    慎重的对待那些过程,因为过程影响最后的结果! “小明呀,今天你要把这件事情前前后后地梳理一遍哈。”“小明呀,这个问...

  • 过程都是好过程

    最近看了半年多前就很火的电视剧《我的前半生》,之前只看了几集,也不知哪来的心情还想起这部电视剧。 看了这部电视剧,...

  • 过程

    自我人格还未完全形成时期,要远离错误的环境

  • 过程

    作者-林白 一月你还没有出现 二月你睡在隔壁 三月下起了大雨 四月里遍地蔷薇 五月我们面对面坐着,犹如梦 就这样六...

  • 过程

    一月,你还没有出现 二月,你睡在隔壁 三月,下起了大雨 四月里,遍地蔷薇 五月,我们对面坐着 犹如梦中 就这样六月...

  • 过程

    “我怀念的,是无话不说。” 作者/春梅 羚城 小雨宜 翻看日记本忌 出门忘记带伞 一月 这一年怎么开始 我窝在家里...

  • 过程

    一个身沐朝霞的人 短视是致命危险 坐在情绪的断崖边 等待寓言中标志明确目的性的存在 那些路都闪着光 择一而行 时刻...

  • 过程

    心好疼,想哭,要流泪,怎么办很努力画画试试。分散注意力。要求自己在16点前只能画画,不能想他们的事,不能想伤害。我...

  • 过程

    一月突如其来, 二月甜蜜忧伤, 三月一碰即碎 四月分崩离合 五月我们在对面坐着,相顾无言 六月鸳鸯不独宿 七月时过...

网友评论

      本文标题:YarnRPC过程

      本文链接:https://www.haomeiwen.com/subject/efyhbxtx.html