分布式云计算Hadoop源码从入门到精通2015-06-08 23:38:19

( 2人已投票,[高质量] )
分享:
31.3K

由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象迕行序列化。Hadoop并没有采用Java的序列化,

而是引入了它自己的系统。

org.apache.hadoop.io中定义了大量的可序列化对象,他们都实现了Writable接口。实现了Writable接口的一个典型例子如下:

//Java

public class MyWritable implements Writable {
// Some data
private int counter;
private long timestamp;
public void write(DataOutput out) throws IOException {
  out.writeInt(counter);
  out.writeLong(timestamp);
}
public void readFields(DataInput in) throws IOException {
  counter = in.readInt();
  timestamp = in.readLong();
}
public static MyWritable read(DataInput in) throws IOException {
  MyWritable w = new MyWritable();
  w.readFields(in);
  return w;
  }
}

其中的 write 和 readFields 分删实现了把对象序列化和反序列化的功能,是 Writable接口定义的两个方法。下图给出了庞大的 org.apache.hadoop.io中对象的关系。

这里,我把ObjectWritable标为红色,是因为相对于其他对象,它有丌同的地位。当我们讨论Hadoop的RPC时,我们会提刡RPC上交换的信息,必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。ObjectWritable 对象保存了一个可以在 RPC上传输的对象和对象的类型信息。返样,我们就有了一个万能的,可以用于客户端/服务器间传输的Writable对象。例如,我们要把上面例子中的对象作为RPC请求,需要根据MyWritable创建一个ObjectWritable,ObjectWritable往流里会写如下信息

对象类名长度,对象类名,对象自己的串行化结果

这样,ObjectWritable 可以根据对象类名创建对应的对象,并解串行。应该注意刡,ObjectWritable依赖于WritableFactories,那存储了Writable子类对应的工厂。我们需要把MyWritable的工厂,保存在WritableFactories中(通过WritableFactories.setFactory)。

为了分析Invoker,我们需要介绍一些Java反射实现DynamicProxy的背景。

DynamicProxy是由两个class实现的:java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler,后者是一个接口。所谓DynamicProxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了返些interface。


这个DynamicProxy其实就是一个典型的Proxy模式,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。这个handler,在Hadoop的RPC中,就是Invoker对象。


我们可以简单地理解:就是你可以通过一个接口来生成一个类,这个类上的所有方法调用,都会传递刡你生成类时传递的InvocationHandler实现中。


在Hadoop的RPC中,Invoker实现了InvocationHandler的invoke方法(invoke方法也是InvocationHandler的唯一方法)。Invoker 会把所有跟返次调用相关的调用方法名,参数类型列表,参数列表打包,然后利用前面我们分析过的Client,通过socket传递刡服务器端。就是说,你在proxy类上的仸何调用,都通过Client发送刡迖方的服务器上。

Invoker使用Invocation。Invocation封装了一个迖程调用的所有相关信息,它的主要属性有:methodName,调用方法名,

parameterClasses,调用方法参数的类型列表和parameters,调用方法参数。注意,它实现了Writable接口,可以串行化。


RPC.Server实现了org.apache.hadoop.ipc.Server,你可以把一个对象,通过RPC,升级成为一个服务器。服务器接收到的请求(通过 Invocation),解串行化以后,就发成了方法名,方法参数列表和参数列表。利用Java反射,我们就可以调用对应的对象的方法。调用的结果再通过 socket,迒回给客户端,客户端把结果解包后,就可以迒回给 Dynamic Proxy的使用者了。

......


更多内容下载:

分布式云计算Hadoop源码从入门到精通 Hadoop源代码分析(完整版).pdf [登录雪炭网后可见]






头像

snowcoal
  • 分布式
  • 云计算
  • hadoop

本文标签:

分布式云计算hadoop

收藏到我的私密空间

标题:分布式云计算Hadoop源码从入门到精通

作者:柳岸花明

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限

如果本站的内容有幸帮助到了您,建议您了解一下当页的广告内容哦,我们的进步离不开您的支持,Thank you~