YARN RPC应用实例(1)

为了进一步说明YARN RPC的使用方法,本小节给出一个具体的应用实例。

在YARN中,ResourceManager和NodeManager之间的通信协议是ResourceTracker,其中NodeManager是该协议的客户端,ResourceManager是服务端,NodeManager通过该协议中定义的两个RPC函数(registerNodeManager和nodeHeartbeat)向ResourceManager注册和周期性发送心跳信息。ResourceManager(服务器端)中的相关代码如下:
 

 
 
  1. // ResourceTrackerService实现了ResourceTracker通信接口,并启动RPC Server  
  2. public class ResourceTrackerService extends AbstractService implements  
  3.     ResourceTracker {  
  4.   private Server server;  
  5.   ...  
  6.   protected void serviceStart() throws Exception {  
  7.     super.serviceStart();  
  8.     Configuration conf = getConfig();  
  9.     YarnRPC rpc = YarnRPC.create(conf); //使用YarnRPC类  
  10.     this.server = rpc.getServer(ResourceTracker.class, this, resourceTrackerAddress,  
  11.           conf, null, conf.getInt(YarnConfiguration.RM_RESOURCE_TRACKER_CLIENT_THREAD_COUNT,  
  12.           YarnConfiguration.DEFAULT_RM_RESOURCE_TRACKER_CLIENT_THREAD_COUNT));  
  13.      this.server.start();  
  14.   }  
  15.   ...  
  16.   @Override  
  17.   public RegisterNodeManagerResponse registerNodeManager(  
  18.       RegisterNodeManagerRequest request) throws YarnException,  
  19.       IOException {  
  20.     //具体实现  
  21.   }  
  22.   @Override  
  23.   public NodeHeartbeatResponse nodeHeartbeat(NodeHeartbeatRequest request)  
  24.       throws YarnException, IOException {  
  25.     //具体实现  
  26.   }  

NodeManager(客户端)中的相关代码如下。
 

 
 
  1. // 该函数是从YARN源代码中简单修改而来的  
  2. protected ResourceTracker getRMClient() throws IOException {  
  3.   Configuration conf = getConfig();  
  4.   InetSocketAddress rmAddress = getRMAddress(conf, protocol);  
  5.   RetryPolicy retryPolicy = createRetryPolicy(conf);  
  6.   ResourceTracker proxy = RMProxy.<T>getProxy(conf, ResourceTracker.class, rmAddress);  
  7.   LOG.info("Connecting to ResourceManager at " + rmAddress);  
  8.   return (ResourceTracker) RetryProxy.create(protocol, proxy, retryPolicy);  
  9. }  
  10. ...  
  11. this.resourceTracker = getRMClient();  
  12. ...  
  13. RegisterNodeManagerResponse regNMResponse = resourceTracker.registerNodeManager(request);  
  14. ...  
  15. response = resourceTracker.nodeHeartbeat(request); 

为了能够让以上代码正常工作,YARN按照以下流程实现各种功能。

步骤1 定义通信协议接口(Java Interface)。定义通信协议接口ResourceTracker,它包含registerNodeManager和nodeHeartbeat两个函数,且每个函数包含一个参数和一个返回值,具体如下:
 

 
 
  1. public interface ResourceTracker {  
  2.   public RegisterNodeManagerResponse registerNodeManager(  
  3.       RegisterNodeManagerRequest request) throws YarnException, IOException;  
  4.   public NodeHeartbeatResponse nodeHeartbeat(NodeHeartbeatRequest request)  
  5.       throws YarnException, IOException;  

步骤2 为通信协议ResourceTracker提供Protocol Buffers定义和Java实现。前面提到,Protocol Buffers仅提供了序列化框架,但未提供RPC实现,因此RPC部分需要由用户自己实现,而YARN则让ResourceTrackerService类实现了ResourceTracker协议,它的Protocol Buffers定义(具体见文件ResourceTracker.proto)如下:
 

 
 
  1. option java_package = "org.apache.hadoop.yarn.proto";  
  2. option java_outer_classname = "ResourceTracker";  
  3. option java_generic_services = true;  
  4. option java_generate_equals_and_hash = true;  
  5. import "yarn_server_common_service_protos.proto";  
  6.  
  7. service ResourceTrackerService {  
  8.   rpc registerNodeManager(RegisterNodeManagerRequestProto) returns (RegisterNodeManagerResponseProto);  
  9.   rpc nodeHeartbeat(NodeHeartbeatRequestProto) returns (NodeHeartbeatResponseProto);  

ResourceTracker的RPC函数实现是由ResourceManager中的ResourceTrackerService完成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值