没有合适的资源?快使用搜索试试~ 我知道了~
这个是word版的,要的自己下,看mapreduce,HDFS都有介绍
资源详情
资源评论
资源推荐
Hadoop
源代码分析(一)
关键字分布式云计算
的核心竞争技术是它的计算平台。 的大牛们用了下面 篇文章,介绍了它们的计算设施。
:
:
:
:
:
很快,! 上就出现了一个类似的解决方案,目前它们都属于 ! 的 " 项目,对应的分别是:
##$%&
##$"'
##$"
##$"
目前,基于类似思想的 () 项目还很多,如 * 用于用户分析的 "。
"' 作为一个分布式文件系统,是所有这些项目的基础。分析好 "',有利于了解其他系统。由于 " 的 "' 和
是同一个项目,我们就把他们放在一块,进行分析。
下图是 整个项目的顶层包图和他们的依赖关系。" 包之间的依赖关系比较复杂,原因是 "' 提供了一
个分布式文件系统,该系统提供 !+,,可以屏蔽本地文件系统和分布式文件系统,甚至象 !-). 这样的在线存储系统。
这就造成了分布式文件系统的实现,或者是分布式文件系统的底层的实现,依赖于某些貌似高层的功能。功能的相互引用,造
成了蜘蛛网型的依赖关系。一个典型的例子就是包 ),) 用于读取系统配置,它依赖于 ,主要是读取配置文件的时候,
需要使用文件系统,而部分的文件系统的功能,在包 中被抽象了。
" 的关键部分集中于图中蓝色部分,这也是我们考察的重点。
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
源代码分析(三)
由于 " 的 和 "' 都有通信的需求,需要对通信的对象进行序列化。" 并没有采用 / 的序列
化,而是引入了它自己的系统。
中定义了大量的可序列化对象,他们都实现了 0 接口。实现了 0 接口的一个典型例
子如下:
代码
!
"
# $%&'()$*'+,!
- $*%(
. $/ %!(
0 1
2
3%&*()$*'+,!
4*%(
!4/ %(
1
"
# !%&*()$*'+,!
- $4$%(
. $3%(
0 $
2 1
1
其中的 1 和 分别实现了把对象序列化和反序列化的功能,是 0 接口定义的两个方法。下图给出了庞
大的 中对象的关系。
这里,我把 (20 标为红色,是因为相对于其他对象,它有不同的地位。当我们讨论 " 的 + 时,我们会
提到 + 上交换的信息,必须是 / 的基本类型,) 和 0 接口的实现类,以及元素为以上类型的数组。
(20 对象保存了一个可以在 + 上传输的对象和对象的类型信息。这样,我们就有了一个万能的,可以用于客户
端服务器间传输的 0 对象。例如,我们要把上面例子中的对象作为 + 请求,需要根据 0 创建一个
(20,(20 往流里会写如下信息
对象类名长度,对象类名,对象自己的串行化结果
这样,到了对端,(20 可以根据对象类名创建对应的对象,并解串行。应该注意到,(20 依赖于
0,那存储了 0 子类对应的工厂。我们需要把 0 的工厂,保存在 0 中
(通过 0setFactory)。
Hadoop
源代码分析(五)
介绍完 以后,我们开始来分析 。+ 采用客户机服务器模式。请求程序
就是一个客户机,而服务提供程序就是一个服务器。当我们讨论 "' 的,通信可能发生在:
5677 之间,其中 77 是服务器
56&7 之间,其中 &7 是服务器
&7677 之间,其中 77 是服务器
&76&7 之间,其中某一个 &7 是服务器,另一个是客户端
如果我们考虑 " 的 以后,这些系统间的通信就更复杂了。为了解决这些客户机服务器之间的通信,
" 引入了一个 + 框架。该 + 框架利用的 / 的反射能力,避免了某些 + 解决方案中需要根据某种接口语言
(如 (! 的 ,'3)生成存根和框架的问题。但是,该 + 框架要求调用的参数和返回结果必须是 / 的基本类型,
) 和 0 接口的实现类,以及元素为以上类型的数组。同时,接口方法应该只抛出 ,(45) 异常。(参考自
-)6.78269.:9)
既然是 +,当然就有客户端和服务器,当然, 也就有了类 ) 和类 。但是类
是一个抽象类,类 + 封装了 ,利用反射,把某个对象的方法开放出来,变成 + 中的服务器。
下图是 的类图。
Hadoop
源代码分析(六)
既然是 +,自然就有客户端和服务器,当然, 也就有了类 ) 和类 。在这里我们来仔
细考察 )。下面的图包含了 ) 中的关键类和关键方法。
由于 ) 可能和多个 通信,典型的一次 "' 读,需要和 ;; 打交道,也需要和某个某些 '; 通
信。这就意味着某一个 ) 需要维护多个连接。同时,为了减少不必要的连接,现在 ) 的做法是拿 ))),
(图中最右侧)来做为 ))) 的 ,'。))), 包括一个 ,)*! (,+ 地址<端口号或主机名<端口
号)对象和一个用户信息对象。这就是说,同一个用户到同一个 ,)*! 的通信将共享同一个连接。
连接被封装在类 )))) 中,所有的 + 调用,都是通过 ))),进行通信。一个 + 调用,自然有输入
参数,输出参数和可能的异常,同时,为了区分在同一个 ))) 上的不同调用,每个调用都有唯一的 。调用是否结
束也需要一个标记,所有的这些都体现在对象 ) 中。))) 对象通过一个 " 表,维护在这个连接上的所
有 :
代码
8)9* :5;4$8)9* :5;%(
一个 + 调用通过 ,把请求加到 ))) 里。为了能够在这个框架上传输 / 的基本类型,) 和
0 接口的实现类,以及元素为以上类型的数组,我们一般把 需要的参数打包成为 (20 对象。
)))) 会通过 * 连接服务器,连接成功后回校验客户端服务器的版本号
())))1" =>方法),校验成功后就可以通过 0 对象来进行请求的发送应答了。注意,每个
)))) 会起一个线程,不断去读取 *,并将收到的结果解包,找出对应的 ,设置 并通知结果已经
获取。
使用 (2 的 1 和 ),把 + 上的异步消息交互转成同步调用。
还有一点需要注意,一个 ) 会有多个 )))),这是一个很自然的结果。
Hadoop
源代码分析(七)
聊完了 ) 聊 ,按惯例,先把类图贴出来。
剩余63页未读,继续阅读
WWWFA
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0