Hadoop是一个由Apache基金会所开发的分布式系统基础架构。其包含三大模块:HDFS、HDFSMapReduce、Yarn。HDFS分布式文件存储系统为数据提供了存储,MapReduce分布式计算系统则为数据提供了计算,Yarn布式集群资源管理系统提供资源管理与任务调度。

HDFS是 Hadoop 中存储数据的基石,存储着所有的数据,具有高可靠性,高容错性,高可扩展性,高吞吐量 等特征。HDFS采用 Master/Slave 架构存储数据,且支持 NameNode 的 HA。HDFS架构主要包含客户端client,NameNodeSecondaryNameNode 和 DataNode 四个重要组成部分。

HDFS的元数据可以分为两部分:

  • 文件系统的元数据:包括文件名、目录名、修改信息、block的信息、副本信息等。
  • datanodes的状态信息:比如节点状态、使用率等。

元数据更新:

  • 记录日志:任何写操作(如创建、删除文件)都会首先被记录到edits日志文件中,确保操作可追溯。
  • 更新内存:操作成功记录到edits后,NameNode会​​在内存中更新相应的元数据​​(如更新目录树)。
  • checkpoint合并:SecondaryNameNode​​(非HA架构)或​​Standby NameNode​​(HA架构)会定期从NameNode获取fsimageedits,将它们合并成一个新的fsimage.ckpt,以减少日志大小并创建新的恢复点。

数据读取写入:

  • 客户端请求:客户端向namenode发起元数据读取请求。
  • namenode响应:NameNode验证权限后,返回文件的元数据信息,包括文件由哪些数据块组成,以及每个数据块副本所在的DataNode地址列表。
  • 数据读取:客户端根据元数据信息,​​直接​​与距离最近或负载最低的DataNode建立连接,并行读取数据块。
  • 数据写入:客户端写入时不是同时向所有datanode写入,而是写入管道的第一个datanode,第一个datanode接收数据的同时将数据转发给第二个,同理转发到整条管道。最后一个节点写入数据后会发送一个ACK确认包沿反方向传到客户端,确认后关闭文件流。

写入实例:假设HDFS数据块大小为128MB,需写入1024GB的大文件

  1. 客户端向NN发起写入请求;
  2. NN进行授权与与元数据登记;
  3. 客户端将文件分成8192块;
  4. 为每个块创建一个管道;
  5. 管道内流水线传输与ACK确认;
  6. 所有数据写入完成后NN确认并提交元数据;
  7. 后续维护

数据同步:

  • 为了应对节点故障或集群扩容,维持设定的副本数量,DataNode之间会进行​​块复制​​操作。当namenode通过心跳信息发现有block的副本数低于设定值时,它会选择一个存有该block的健康dataNode,指令其将block复制到另一个新的dataNode上。

心跳信息等:

  • 心跳:DN会定时(几秒)向NN发送心跳信息,以标识自身状态。
  • 全量块报告:向NN汇报其存储的​​所有​​数据块的完整列表,是NN构建全局数据块映射关系的基础,DN启动时和几个小时周期汇报一次。
  • 增量块报告:block发生变动(新增、删除块)

数据完整性:

  • 当数据第一次引入时,计算校验和,经过一系列传输复制后,再次计算校验和,比较两次校验和的结果是否相同。

容错:

文件系统容错可以通过 NameNode 高可用、SecondaryNameNode 机制、数据块副本机制和心跳机制来实现。

高可用模式下会有一个状态为active的NN和若干个状态为standby的备用NN。备用NN会实时备份主NN的元数据信息,当主NN挂掉时,备用NN会迅速接管主NN的工作。

心跳机制,DN会定期向NN发送心跳信息,将自身节点的状态告知 NN;NN 会将 DN 需要执行的命令放入心跳信息的返回结果中,返回给 DN 执行。

当 DN 发生故障没有正常发送心跳信息时,NN 会检测block的副本数是否小于系统设置值,如果小于,则选择一个拥有健康副本的DN作为​​源节点​​,并选择一个或几个合适的目标DN来存放新副本,然后下达复制指令。复制完成后NN接收目标DN的成功报告,更新元数据。

block副本数有hdfs-site.xml文件的dfs.replication中定义

<property>
      <name>dfs.replication</name>
      <value>3</value>
</property>

当集群中的 DN 发生故障而失效,或者在集群中添加新的 DN 时,可能会导致数据分布不均匀。当某个 DN 上的空闲空间资源大于系统设置的临界值时,HDFS 就会从 其他的 DN 上将数据迁移过来。相对地,如果某个 DN 上的资源出现超负荷运载,HDFS 就会根据一定的规则寻找有空闲资源的 DN,将数据迁移过去。

回收站

HDFS的垃圾回收的默认配置属性为0,也就是说,如果不小心误删除了某文件,那么这个文件就不可恢复的,为了解决这个问题,就可以利用垃圾桶机制。

在core-site.xml文件中,这个参数表示文件删除后在回收站的保存时间,单位分钟。设置后重启hdfs即可生效。

<property>
    <name>fs.trash.interval</name>
    <value>360</value>
</property>

更多推荐