标签:blog http io ar os 使用 sp java for
package mavshuang.rpc; import org.apache.hadoop.ipc.VersionedProtocol; public interface MyBizable extends VersionedProtocol { public static final long VERSION = 123456L; public abstract String hello(String name); }
package mavshuang.rpc;import java.io.IOException; public class MyBiz implements MyBizable { public long getProtocolVersion(String protocol , long clientVersion) throws IOException { return MyBizable.VERSION; } public String hello(String name) { System.out.println("我被调用了!"); return "hello" +name; } }
package mavshuang.rpc; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; public class MyClient { public static void main(String[] args) throws Exception { final MyBizable proxy = (MyBizable) RPC.waitForProxy(MyBizable.class, MyBizable.VERSION, new InetSocketAddress(MyServer.SERVER_IP, MyServer.SERVER_PORT), new Configuration()); String result = proxy.hello("world,hello mavs!"); System.out.println("客户端返回的结果:" + result); RPC.stopProxy(proxy); // 关闭网络连接 } }说明:RPC.getProxy(),该方法有四个参数,第一个参数是被调用的接口类,第二个是客户端版本号,第三个是服务端地址。返回的代理对象,就是服务端对象的代理,内部就是使用 java.lang.Proxy 实现的。
package mavshuang.rpc; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Server; public class MyServer { public static final String SERVER_IP = "localhost";// 指定服务器IP public static final int SERVER_PORT = 9999;// 指定服务器端口 public static void main(String[] args) throws Exception { /** * 构造一个 RPC 服务端. * * @param instance * 实例对象中的方法会被客户端调用 * @param bindAddress * the address to bind on to listen for connection:监听连接的IP地址 * @param port * the port to listen for connections on:监听连接的端口号 * @param conf * the configuration to use:使用的确认协议 */ final Server server = RPC.getServer(new MyBiz(), SERVER_IP, SERVER_PORT, new Configuration()); server.start();// 启动服务 } }说明:RPC.getServer 方法,该方法有四个参数,第一个参数是被调用的 java对象,第二个参数是服务器的地址,第三个参数是服务器的端口。获得服务器对象后,启动服务器。这样,服务器就在指定端口监听客户端的请求。
查看 NameNode 的源码,如下图所示
按照分析 NameNode 的思路,看一下 DataNode 的源码接口。
在上图中,返回值正是第 713 行创建的对象。继续查看该方法:
在上图中,可以看到 namenode 其实是 ClientProtocal 接口。那么,这个对象是什么时候创建?如下图所示。
继续在 FileSystem 类分析,读数据使用的是 open(…)方法,可以看到源码,如下图所示。
在上图中,返回的是 DFSClient 类中 DFSDataInputStream 类,显而易见,这是一个内部类。这个内部类的构造函数,有两个形参,第一个参数是 dfs.open(…)创建的对象。看一下方法的源码,如下图所示。
在上图中,这个构造方法中最重要的语句是第 1834 行,打开信息,从第 1840 行开始是 openInfo()的源代码,截图显示不全。注意第 1841 行,是获取数据块的信息的。查看这一行的源代码,如下图所示。
标签:blog http io ar os 使用 sp java for
原文地址:http://blog.csdn.net/mavs41/article/details/41090531