知识点
相关文章
更多最近更新
更多Hadoop源代码分析【RPC】
2019-03-28 14:19|来源: 网络
- Client-NameNode之间,其中NameNode是服务器
- Client-DataNode之间,其中DataNode是服务器
- DataNode-NameNode之间,其中NameNode是服务器
- DataNode-DateNode之间,其中某一个DateNode是服务器,另一个是客户端
如果我们考虑Hadoop 的Map/Reduce以后,这些系统间的通信就更复杂了。为了解决这些客户机/服务器之间的通信,Hadoop引入了一个RPC框架。该RPC框架利用 的Java的反射能力,避免了某些RPC解决方案中需要根据某种接口语言(如CORBA的IDL)生成存根和框架的问题。但是,该RPC框架要求调用的参 数和返回结果必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。同时,接口方法应该只抛出 IOException异常。
既然是RPC,当然就有客户端和服务器,当然,org.apache.hadoop.rpc也就有了类Client和类Server。但是类Server是一个抽象类,类RPC封装了Server,利用反射,把某个对象的方法开放出来,变成RPC中的服务器。
下图是org.apache.hadoop.rpc的类图。
1 public class UseRPC {
2
3 // hadoop配置信息
4 private static Configuration conf = new Configuration();
5
6 // 定义接口
7 public interface Serverif{
8 public String method(String args);
9 }
10
11 // 服务器端的实现
12 public static class ServerImpl implements Serverif{
13
14 // 业务逻辑的实现
15 public String method(String args){
16 return args;
17 }
18
19 }
20
21 public static void main(String args[]) throws Exception {
22 ServerImpl si = new ServerImpl();
23 int port = 8668 ;
24 org.apache.hadoop.ipc.Server server = RPC.getServer(si, port, 10 , true ,conf);
25 server.start();
26 server.join();
27 }
28
29 // 客户端的实现
30 public static class Client {
31
32 private static final Method GETTASK;
33
34
35 // 利用代理的方式调用,如果通过代理方式,服务器只能有一个
36 public String method_proxy(String args) throws Exception{
37 InetSocketAddress sa = new InetSocketAddress( " 192.168.1.1 " , 8668 );
38 Serverif si = (Serverif) RPC.getProxy(Serverif. class , sa, conf);
39 return si.method(args);
40 }
41
42 // 利用反射的方式调用,如果通过反射方式,服务器可以有多个,
43 // 参数为一个二维数据,相对应每个服务器的方法
44 public String method_reflected(String args) throws Exception{
45 InetSocketAddress[] sa = new InetSocketAddress[]{
46 new InetSocketAddress( " 192.168.1.1 " , 8668 ),
47 new InetSocketAddress( " 192.168.1.2 " , 8668 )};
48 Object[][] params = new Object[ 2 ][ 1 ];
49 params[ 0 ][ 0 ] = String. class ;
50 params[ 1 ][ 0 ] = String. class ;
51 // 得方法的反射
52 METHOD = Serverif. class .getMethod( " method " , new Class[] {String. class });
53 return (String)RPC.call(METHOD, params, sa, conf);
54 }
55
56 public static void main(String args[]) throws Exception {
57 String remoteIP = " 192.168.1.1 " ;
58 int port = 8668 ;
59 Client c = new Client();
60 System.out.println(c.method_proxy( " hello world " ));
61 }
62
63 }
64
65 }
【2-反射方式】该RPC框架利用 的Java的反射能力,避免了某些RPC解决方案中需要根据某种接口语言(如CORBA的IDL)生成存根和框架的问题。为什么Corba使用IDL要生成存根和框架?因为调用对象方法在编译期间会做静态检查,所以生成存根作为代理,可以使用代理通过静态检查。同【1-代理方式】,不过Hadoop的 RPC可以直接通过传递参数在运行时生成本地代理,这样使用更加方便。
相关问答
更多-
如何利用源代码分析视频的flash地址[2024-02-29]
要是那么容易找到的话 做网站的就不用吃饭了 他们的地址都是有加密 不过如果你不怕麻烦的话 可以在浏览器的临时文件里一个个的看 应该会有你要找的东西 还有 就是找个flash下载软件 他会帮你找的 -
通过实现原理及源代码分析HashMap该怎么用[2023-06-09]
HashMap ,都知道哪里要用 HashMap ,知道 Hashtable 和 HashMap 之间的区别 ,那么 为何这道面试题如此特殊呢?是因为这道题考察的深度很深。 这题经常出现在高级或中高级 面试中。投资银行更喜欢问这个问题,甚至会要求你实现 HashMap 来考察你的编程能力。 ConcurrentHashMap 和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的 旅程吧! -
如何高效的阅读hadoop源代码[2023-07-07]
第一个阶段:学习hadoop基本使用和基本原理,从应用角度对hadoop进行了解和学习 这是第一个阶段,你开始尝试使用hadoop,从应用层面,对hadoop有一定了解,比如你可以使用hadoop shell对hdfs进行操作,使用hdfs API编写一些程序上传,下载文件;使用MapReduce API编写一个数据处理程序。一旦你对hadoop的基本使用方法比较熟悉了,接下来可以尝试了解它的内部原理,注意,不需要通过阅读源代码了解内部原理,只需看一些博客,书籍,比如《Hadoop权威指南》,对于HDFS而 ... -
如何通过 callgraph 静态分析源代码[2022-07-21]
源码分析是程序员离不开的话题。无论是研究开源项目,还是平时做各类移植、开发,都避免不了对源码的深入解读。 传统的命令行工具 Cscope, Ctags 可以结合 vim 等工具提供高效快捷的跳转,但是无法清晰的展示函数内部的逻辑关系。 至于图形化的IDE,如 QtCreator, Source Insight, Eclipse, Android Studio 等,却显得笨重,而且不一定支持导出调用关系图。 -
我认为你的环境缺少FINDBUGS_HOME。 你可以从这里下载并安装findbugs。 之后,您应该运行以下来定义FINDBUGS_HOME: export FINDBUGS_HOME=/path/to/findbugs/installation 现在,由于缺少FINDBUGS_HOME环境变量,您的构建不应该失败。 I have solved by following commands: mvn clean mvn compile -Pnative mvn package mvn compil ...
-
你看过SVN的源代码吗? 这里是。 http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-mapreduce-examples/src/ Did you look at the source code in SVN? Here it is. http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop- ...
-
我明白了.........我没有构建(编译)本机库和命令 “mvn包-Pdist,native,docs -DskipTests -Dtar”我说打包它。 没有必要自己构建(编译)本机库。 所以有命令打包源代码没有本机库和文档,即“mvn package -Pdist -DskipTests -Dtar”,它成功运行而没有错误。 使用此命令,我们可以从源代码创建“hadoop distribution” I got the point......... i haven't built(compiled) n ...
-
我写了一篇关于这个主题的博客文章 - 您应该能够按照这些说明从源代码构建自己的源jar: http://whiteycode.blogspot.com/2012/05/building-hadoop-source-jars.html I've written a blog post on this subject - you should be able to follow these instructions to build your own source jar from the source: ht ...
-
hadoop 0.20不支持这个,请阅读本期https://issues.apache.org/jira/browse/HADOOP-6889 hadoop 0.20 doesn't support this, please read this issue https://issues.apache.org/jira/browse/HADOOP-6889
-
映射器api https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/Mapper.html 减少api https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/Reducer.html 帮助您入门的教程 http://hadoop.apache.org/docs/r0.18.3/mapred_tutorial.html The mapper ...