没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Hadoop
源代码分析(一) 总括
关键字: 分布式 云计算
经济不行啦,只好潜心研究技术。
的核心竞争技术是它的计算平台。 的大牛们用了下面 篇文章,介绍了它们的计算设施。
:
:
:!
"#:
$%&:&
很快,' 上就出现了一个类似的解决方案,目前它们都属于 ' 的 (& 项目,对应的分别是:
)*+
)(,
"#)("
$%&)(&
目前,基于类似思想的 -. 项目还很多,如 / 用于用户分析的 (。
(, 作为一个分布式文件系统,是所有这些项目的基础。分析好 (, ,有利于了解其他系统。由于 (& 的 (, 和
$%& 是同一个项目,我们就把他们放在一块,进行分析。
下图是 $%& 整个项目的顶层包图和他们的依赖关系。(& 包之间的依赖关系比较复杂,原因是 (, 提供了一
个分布式文件系统,该系统提供 '01,可以屏蔽本地文件系统和分布式文件系统,甚至象 '2. 3 这样的在线存储系统。
这就造成了分布式文件系统的实现,或者是分布式文件系统的底层的实现,依赖于某些貌似高层的功能。功能的相互引用,造
成了蜘蛛网型的依赖关系。一个典型的例子就是包 .!,.! 用于读取系统配置,它依赖于 !,主要是读取配置文件的时候,
需要使用文件系统,而部分的文件系统的功能,在包 ! 中被抽象了。
(& 的关键部分集中于图中蓝色部分,这也是我们考察的重点。
4
5
Hadoop
源代码分析(二) 包的功能分析
下面给出了 (& 的包的功能分析。
Package Dependences
tool
提供一些命令行工具,如 DistCp,archive
mapreduce
Hadoop 的 Map/Reduce 实现
filecache
提供 HDFS 文件的本地缓存,用于加快 Map/Reduce 的
数据访问速度
fs
文件系统的抽象,可以理解为支持多种文件系统实现
的统一文件访问接口
hdfs
HDFS,Hadoop 的分布式文件系统实现
ipc
一个简单的 IPC 的实现,依赖于 io 提供的编解码功能
参考:http://zhangyu8374.javaeye.com/blog/86306
io
表示层。将各种数据编码/解码,方便于在网络上传输
net
封装部分网络功能,如 DNS,socket
security
用户和用户组信息
conf
系统的配置参数
metrics
系统统计数据的收集,属于网管范畴
util
工具类
record
根据 DDL(数据描述语言)自动生成他们的编解码函
数,目前可以提供 C++和 Java
http
基于 Jetty 的 HTTP Servlet,用户通过浏览器可以观察
文件系统的一些状态信息和日志
log
提供 HTTP 访问日志的 HTTP Servlet
Hadoop
源代码分析(三) 对象序列化
由于 (& 的 $%& 和 (, 都有通信的需求,需要对通信的对象进行序列化。(& 并没有采用 6 的序列
化,而是引入了它自己的系统。
& 中定义了大量的可序列化对象,他们都实现了 7 接口。实现了 7 接口的一个典型例
子如下:
Java 代码
publicclassMyWritableimplementsWritable{
//Somedata
3 privateintcounter;
privatelongtimestamp;
4444
8 44444&49:,-4;4941-<=.4>44444
? 4444444491.:.;@44444
444444449A.:;@44444
5 4444B44444
44444444
44444&4&&:,1.4.;4941-<=.4>44444
44444444.4C4.&1.:;@44444
3 444444444C4.&A.:;@44444
4444B44444
4444
8 444444$74&:,1.4.;4941-<=.4>44444
? 44444444$7494C4.94$7:;@44444
444444449&&:.;@44444
5 44444444.49@44444
4444B44444
B444
4
4
其中的 write 和 readFields 分别实现了把对象序列化和反序列化的功能,是 Writable 接口定义的两个方法。下图给出了庞大的
org.apache.hadoop.io 中对象的关系。
4
4
4
4
4
4
这里,我把 -D7 标为红色,是因为相对于其他对象,它有不同的地位。当我们讨论 (& 的 %0 时,我们会
提到 %0 上交换的信息,必须是 6 的基本类型, . 和 7 接口的实现类,以及元素为以上类型的数组。
-D7 对象保存了一个可以在 %0 上传输的对象和对象的类型信息。这样,我们就有了一个万能的,可以用于客户
端服务器间传输的 7 对象。例如,我们要把上面例子中的对象作为 %0 请求,需要根据 $7 创建一个
-D7,-D7 往流里会写如下信息
对象类名长度,对象类名,对象自己的串行化结果
这样,到了对端,-D7 可以根据对象类名创建对应的对象,并解串行。应该注意到,-D7 依赖于 WritableFactories,那
存储了 7 子类对应的工厂。我们需要把 MyWritable 的工厂,保存在 WritableFactories 中(通过
7setFactory)。
Hadoop
源代码分析(四) compress 分析预留
为 org.apache.hadoop.io.compress 等的分析预留位置
Hadoop
源代码分析(五) RPC 框架
介绍完 & 以后,我们开始来分析 &。%0 采用客户机服务器模式。请求程序
就是一个客户机,而服务提供程序就是一个服务器。当我们讨论 (, 的,通信可能发生在:
.EE& 之间,其中 EE& 是服务器
.,E& 之间,其中 ,E& 是服务器
,E&EE& 之间,其中 EE& 是服务器
,E&,E& 之间,其中某一个 ,E& 是服务器,另一个是客户端
如果我们考虑 (& 的 $%& 以后,这些系统间的通信就更复杂了。为了解决这些客户机服务器之间的通信,
(& 引入了一个 %0 框架。该 %0 框架利用的 6 的反射能力,避免了某些 %0 解决方案中需要根据某种接口语言
(如 -%"' 的 1,A)生成存根和框架的问题。但是,该 %0 框架要求调用的参数和返回结果必须是 6 的基本类型,
. 和 7 接口的实现类,以及元素为以上类型的数组。同时,接口方法应该只抛出 1-<=. 异常。(参考自
2.3?D838)
既然是 %0,当然就有客户端和服务器,当然,& 也就有了类 . 和类 。但是类
是一个抽象类,类 %0 封装了 ,利用反射,把某个对象的方法开放出来,变成 %0 中的服务器。
下图是 & 的类图。
?
Hadoop
源代码分析(六) RPC-Client
既然是 %0,自然就有客户端和服务器,当然,& 也就有了类 . 和类 。在这里我们来仔
细考察 &.。下面的图包含了 &. 中的关键类和关键方法。
由于 . 可能和多个 通信,典型的一次 (, 读,需要和 EE& 打交道,也需要和某个某些 ,E& 通
信。这就意味着某一个 . 需要维护多个连接。同时,为了减少不必要的连接,现在 . 的做法是拿 ...1&
(图中最右侧)来做为 ... 的 1,。...1& 包括一个 1. /'&&(10 地址F端口号或主机名F端口
号)对象和一个用户信息对象。这就是说,同一个用户到同一个 1. /'&& 的通信将共享同一个连接。
剩余63页未读,继续阅读
资源评论
- Choc3222013-10-24很好的资料,关于HDFS的讲解的
t890211
- 粉丝: 3
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功