首页 > 代码库 > 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的各个组件的交互方式