Hadoop学习:深度剖析HDFS原理

物联网

  Client将FileA按64M分块。分成两块,block1和Block2;

  Client向nameNode发送写数据请求,如图蓝色虚线①------>

  NameNode节点,记录block信息。并返回可用的DataNode ( NameNode按什么规则返回DataNode? 参见第三单 hadoop机架感知 ),如粉色虚线②--------->

  Block1: host2,host1,host3

  Block2: host7,host8,host4

  client向DataNode发送block1;发送过程是以流式写入,流式写入过程如下:

  将64M的block1按64k的packet划分

  然后将第一个packet发送给host2

  host2接收完后,将第一个packet发送给host1,同时client想host2发送第二个packet

  host1接收完第一个packet后,发送给host3,同时接收host2发来的第二个packet

  以此类推,如图红线实线所示,直到将block1发送完毕

  host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示

  client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线

  发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示

  说明:

物联网

  小结:

  写入的过程,按hdsf默认设置, 1T文件,我们需要3T的存储 , 3T的网络流量

  在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去。读取时,要读其他节点去

  挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份

  hdfs读文件:

  读到文件示意图如下:

物联网

  客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象时分布文件系统的一个实例;

  DistributedFileSystem通过使用RPC来调用NameNode以确定文件起始块的位置,同一Block按照重复数会返回多个位置,这些位置按照 Hadoop集群拓扑结构排序,距离客户端近的排在前 面 ( 详见第三章 )

  前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流,客户端对这个输入流调用read()方法

  存储着文件起始块的DataNode地址的DFSInputStream随即连接距离最近的DataNode,通过对数据流反复调用read()方法,将数据从DataNode传输到客户端

  到达块的末端时,DFSInputStream会关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode,这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流

  一旦客户端完成读取,就对FSDataInputStream调用close()方法关闭文件读取

  block持续化结构:

  DataNode节点上一个Block持久化到磁盘上的物理存储结构,如下图所示:

物联网

 

  每个Block文件(如上图中blk_1084013198文件)都对应一个meta文件(如上图中blk_1084013198_10273532.meta文件), Block文件是一个一个Chunk的二进制数据 (每个Chunk的大小是512字节),而meta文件是与 每一个Chunk对应的Checksum数据 ,是序列化形式存储