块:一个磁盘有它的块的大小,代表着它能够读写的最小数据量.文件系统通过处理大小为一个磁盘快大小的整数倍的数据块来运行这个磁盘.HDFS的块比磁盘的大.目的是为了减少寻址开销,通过让一个块足够大,从磁盘转移数据的时间就能远远大于定位这个块开始端的时间.因此,传送一个由多个块组成的文件的时间就取决于磁盘传输速率.

  Hadoop分布式文件系统,以流的数据访问模式来存储超大文件.运行于商用硬件集群上,是管理网络中多台计算机存储的文件系统.

  HDFS不适用于要求时间低延迟数据访问的应用,存储大量的小文件.多用户写入任意修个文件

  HDFS数据块:HDFS上的文件被划分为块大小的多个分块.作为独立的存储但愿,成为数据块.默认为64MB.

  HDFS的三个节点

    Namenode:HDFS的守护进程.用来管理文件系统的命名空间.负责记录文件是如何分割成数据块的,以及这些数据库分别被存储到那些数据节点上.它的主要功能是对内存及IO进行集中管理

    Datanode:文件系统的工作节点.根据需要存储和检索数据块,并且定期向Namenode发送它们所存储的块的列表

    Secondary Namenode:辅助后台程序,与Namenode进行通信,以便定期向namenide发送它们所存储的块的列表

  HDFS Federation

    通过添加namenode实现他们的扩展,其中每个name node管理文件系统命名空间中的一部分.每个name node维护一个命名空间券,包括命名空间的源数据和该命名空间下的文件的所有数据块的数据块池.

  HDFS HA

    在高可用中,配置了一堆活动——备用(active-standby)namenode.当活动namenode失效,备用namenode就会接管它的任务并开始服务与来子客户端的请求.不会有明显中断.

    框架的实现包括:namenode之间通过高可用的共享存储实现编辑日志的共享;datanode同时向两个namenode发送数据块处理报告;客户端使用特定的机制来处理namenode的失效问题,这一机制对用户来说是透明的.

    故障转移控制器:管理者将活动namenode转移给备用namenode的转换过程基于zookeeper并由此确保有且仅有一个活动namenode,每一个namenode运行着一个轻量级的故障控制器,其工作是监督宿主namenode是否失效,并在失效时进行切换.

  

  HDFS读文件过程

    1.客户端调用FileSystem对象的open()方法在分布式文件系统中打开要读的文件

    2.分布式文件系统通过RPC来调用namenode,确定文件起始块的位置

    3.分布式文件系统的DistrubtedFileSystem类返回一个支持文件定位的输入流FSDataInputStream对象.FSDataInputStream封装DFSInputStream

对象.客户端对这个输入流调用read()方法

    4.DFSInputStream连接距离最近的datanode.反复调用read链接.寻找下一个块的最佳data node

    5.到达块的末端时,DSInputStream关闭与该datanode的连接,寻找下一块的最佳data node

    6.客户端完成读取,对FSDataInputStream调用close()方法关闭连接

    在读取时,若客户端在数据节点通信时遇到错误,那么它就会去尝试对这个块来说最近的下一块,他会记住那个故障的数据节点以保证不会再对之后的块进行徒劳无益的尝试.客户端也会确认从数据节点发过来的数据的检验和.若发现一个损坏的块,就试图从别的数据节点中读取一个块的副本之前报告给名称节点

    

  HDFS文件写入过程

    1.客户端童工DistributedFileSystem对象调用create()函数来创建文件

    2.分布式文件系统对name node创建一个RPC调用,在文件系统的命名空间新建一个文件,创建失败会返回一个IOException异常

    3.Name node对新建文件进行检查无误后,分布式文件系统返回给客户端一个FSDataInputStream对象.FSDataInputStream对象封装一个DFSOutputStream对象负责处理name node和data node之间的通信,客户端开始写入数据

    4.FSDataOutputStream将数据分成一个一个数据包,写入内部队列“数据队列”.DataStreamer负责将数据包一次流式传输带由一组name node构成的管线中

    5.DFSOutputStream维护着确认队列来等待data node收到确认回执.收到管道中所有data node确认后,数据包从确认队列删除

    6.客户端完成对数据的写入,对数据流调用close()方法

    7.name node确认完成

    若在数据写入期间,数据节点发生故障,此时管线被关闭,确认队列中的任何包会被添加回数据队列前面.当前块的块在正常工作的数据节点中被赋予一个新的身份并联系name node.故障节点会从管线中删除并且余下块的数据会被写入管线中的两个好的数据节点.名称节点注意到块副本不在时,会在另一个节点上安排创建一个副本.

 

  HDFS一致性    

    HDFS在保证在写数据时数据的一致性和持久性,提供了两个方法hsync()和hflush().hflush()保存flush的数据被新的reader读到.但不保证被data node持久化.hsync()与hflush()一样.但hsync()保证数据被data node持久化

  

  DISTCP

    distcp能从Hadoop的文件系统并行复制大量数据.一般用于两个HDFS集群中传输数据.默认情况下.distcp会跳过目标环境已经有的文件.但可以通过-overwrite选择进行覆盖,也可用-update选项来选择更新那些修改过的文件.

    distcp是作为一个MapReduce作业执行的.复制工作由集群中并行运行的map来完成.这里并没有reducer.每个文件都由一个单一的map进行复制,并且distcp通过将文件分成大致相等的文件来为每个map数量大致相同的数据

  

  HDFS集群有两个节点,以管理者——工作者的模式运行.即一个名称节点(管理者)和多个数据节点(工作者).名称节点管理文件系统的命名空间,维护着这个文件系统树以及这个树內所有的文件和索引目录.这些信息以两种形式将文件永久保存在本地磁盘上.命名空间镜像和编辑日志.名称节点也记录每个文件的每个块所在的数据节点.但它不永久保存块的位置.数据节点是文件系统的工作者,它们存储并提供定位块的服务,并且定时向名称节点发送它们存储块的列表

  为保障名称节点,Hadoop提供了两种机制:复制那些组成文件系统元数据持久化的文件.Hadoop可以通过配置名称节点在多个文件系统上写入其持久化状态,这些写操作是起同步性和原子性的.一般是在本地磁盘上写入的同时,写入一个远程的NFS挂载;运行一个二级名称节点,主要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大