首页 > 代码库 > HDFS的各个组件的交互方式
HDFS的各个组件的交互方式
接触Hdoop将近一年,昨日偶发阅读其源码之雅兴,宛如少女姨妈突至,势不可遏。读一个开源框架的源码,个人习惯一般是先熟悉其整体结构,不拘泥于个别类。
一个设计优秀的框架,往往每个包都有其职责,旨在完成某个特定的功能。因此将每个包或其相关的包 抽出来,单独打包成一个 jar文件,就能被第三方系统应用。
譬如Hadoop 的设计者 不屑 Sun 自己的一套序列化和反序列化实现 之余,另起炉灶,自己开发了一套 高效的(但扩展性不好,只限于在java系统中)序列化和反系列化工具,
位于 org.apache.hadoop.io 、org.apache.hadoop.io.serializer 包中。我们自己在开发网络通信,RPC,或者分布式系统时可以借鉴和引用。
好像跑题了 (⊙o⊙)。
昨天概览了一下 hadoop的 HDFS系统。理清了其基本原理和各个组件的交互方式。上图:
Step1 :客户端请求HDFS系统的某个资源(比如文件)S。
Step2: NameNode 向客户端返回 组成S的块信息和在DataNode上的位置。
其中块信息抽象为 : org.apache.hadoop.hdfs.protocol.Block
由三个元素组成 blKid(块Id),len(块大小),产生时间(generationStamp)组成。
块位置抽象为 :org.apache.hadoop.fs.BlockLocation
主要由DataNode所在主机的ip及端口信息组成。
以上通过Hadoop自带的 RPC通信方式交互。
Step3、Step4: 客户端获得组成文件的块 所在的位置信息后,与DataNode 建立TCP 通信,将获得的字节流拼接成文件。
由于每个块位置信息记录了与之关联的块在整个文件中的偏移量(参见上面BlockLocation 的构造函数中的Offset成员变量)和长度(len),所以可以块的有序拼接。
以上是TCP/IP通信。
另外DataNode 会有一个后台线程,定时向NameNode 发送每个块的最新状态及信息,通过RPC通信。
详情咱们下次再聊。
HDFS的各个组件的交互方式