zoukankan      html  css  js  c++  java
  • Hadoop RPC

    Hadoop RPC机制

         RPC:远程服务调用,底层就是通过网络实现跨服务的应用调用。WebService是最常见的应用。下图给RCP的基本原理:基本分为四层,序列化层、函数调用层、网络传输层、服务端框架层。

    Hadoop的节点之间的通信、节点之间的心跳等都涉及跨服务应用的调用,也就是经常会运用RCP,所以Hadoop干脆就开发了一套自己的RCP框架,这Hadoop RCP框架与Alibaba Dubbo来源和使用场景类似(JDK,已经有的RMI的RCP实现为啥Hadoop和Alibaba又自己开发一套?因为不好用!),常见的RCP框架还有:zero ice、motan(新浪阉割Dubbo版)。Hadoop实现RCP的方式跟WebService不同,属于定制版(核心技术:动态代理、反射、序列化、非阻塞的异步IO:NIO),就是为了解决hadoop场景下的服务调用。

      Hadoop RCP的也是相当强大:透明、可控和高性能,Hadoop的具体各层实现:

        (1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;
      (2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;
      (3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;
      (4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;

     Hadoop RPC 应用实例:

     服务端:LoginServiceInterface.java

    public interface LoginServiceInterface {
        
        public static final long versionID=1L;
        public String login(String username,String password);
    
    }

     应用接口实现类:LoginServiceImpl.java 

    public class LoginServiceImpl implements LoginServiceInterface {
    
        @Override
        public String login(String username, String password) {
            
            return username + " logged in successfully!";
        }
    
    }

     启动RCP服务端:Starter.java

    import java.io.IOException;
    import org.apache.hadoop.HadoopIllegalArgumentException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    import org.apache.hadoop.ipc.RPC.Builder;
    import org.apache.hadoop.ipc.RPC.Server;
    
    public class Starter {
    
        public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
            
            
    Builder builder = new RPC.Builder(new Configuration());
    
    builder.setBindAddress("weekend110").setPort(10000).setProtocol(LoginServiceInterface.class).setInstance(new LoginServiceImpl());
            
            Server server = builder.build();    
            server.start();
        }
        
    }

    客户端服务端同样实现该接口:LoginServiceInterface.java   该接口的实现类:LoginController.java

    import java.net.InetSocketAddress;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    public class LoginController {
    
        public static void main(String[] args) throws Exception {
            
    //proxy就是上图中的proxy,利用代理类(实现LoginController和Socket)
    LoginServiceInterface proxy = RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("weekend110", 10000), new Configuration());
            
            String result = proxy.login("mijie", "123456");
            
            System.out.println(result);
        }
        
        
    }
  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/java-oracle/p/8334114.html
Copyright © 2011-2022 走看看