【hadoop】 2005-RPC协议

来源:互联网 发布:淘宝买家微淘怎么发布 编辑:程序博客网 时间:2024/06/14 05:04
1、RPC: 远程调用协议。不同进程之间的远程方法调用。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

例如: 不同系统之间的交互,如WebService
2、以NameNode和DataNode通信为例来说明节点之间的调用




3、通过实例演示RPC通信过程
3.1 新建RPCServer
3.2 新建RPCClient
3.3 RPCServer和RPCClient分布在不同的进程下
3.4 借助Hadoop的RPC工具类实现
3.5 RPCServer 和RPCClient 分别部署到不同的机器上,然后运行RPCServer ,在通过RPCClient远程调用

package rpc;

/**
 *
 * @author shenfl
 *
 */
public interface ServerProtocol{
            
             public static final long versionID = 9876L;
            
             public String findMetaData(String fileName);
}



package rpc;

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.Server;

/**
 *
 * @author shenfl
 *
 */
public class RPCServer implements ServerProtocol {

             @Override
             public String findMetaData(String fileName ) {
                        System. out.println("find Meta in NameNode!" );
                         return fileName + " already is found, " + fileName
                                                + ", 3,{blk_001,blk_002}";
            }

             public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {

                         /**
                         * use jdk proxy
                         */
                        Server server = new RPC.Builder( new Configuration()).setInstance( new RPCServer())
                                                                                                .setProtocol(ServerProtocol. class)
                                                                                                .setBindAddress( "192.168.2.31")
                                                                                                .setPort(9999).build();
                         server.start();
            }

}


package rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

/**
 * @author shenfl
 *
 */
public class RPCClient {
            
            
             public static void main(String[] args) throws IOException {
                        
                         int port = 9999;
                        String hostName = "192.168.2.31";
                         /**
                         * get proxy object by hostName and port 
                         */
                        ServerProtocol proxy = RPC. getProxy(ServerProtocol.class, 9876L, new InetSocketAddress(hostName,port ), new Configuration());
                        
                         /**
                         *  call  real method
                         */
                        String metaData = proxy.findMetaData( "/readme01.txt");
                        System. out.println(metaData );
                        
                        RPC. stopProxy(proxy);
            }

}
4、采用图模式描述RPC的远程方法调用






0 0