Hadoop之HDFS——分布式文件系统

本文深入解析HDFS(Hadoop分布式文件系统)的主从结构、设计目标、文件存储方式及运行流程,阐述其如何通过冗余机制、机架感知等功能实现高可用性和数据安全性。

HDFS的体系结构

HDFS采用主从(Master/Slave)结构模型,将节点分为两类,包括一个处于运行状态的NameNode和若干DataNode。

  • NameNode服务器负责管理和维护HDFS的目录系统并且控制文件的读写操作。
  • 多个DataNode服务器负责存储数据。下图中只展示出了3个DataNode,实际大型集群可以有成千上万个结点。

在这里插入图片描述

HDFS的设计前提与目标

  • 硬件故障时常态而非异常
    • HDFS是设计运行在低成本的硬件之上,硬件股将是常态而非异常,所以HDFS被设计成具有高度容错的能力,能试试监测错误并自动恢复,是一个核心目标。
  • Streaming流式数据存储
    • 运行在HDFS之上的应用会通过Streaming存取数据集。HDFS的只要设计是批处理,而非实时互动处理,所以优点是可以提高大量数据的存取能力,但牺牲了响应时间。
  • 大数据集
    • 集群可以扩充至数百个节点来存储大数据集。HDFS提供了cluster集群结构来存储大数据文件。
  • 简单一致性模型
    • HDFS的模式是一次写入多次读取。一个文件被创建后就不会再修改。这样设计的优点是:可以提高存储大数据的能力,并简化一致性问题。
  • 移动“计算”比移动“数据”成本更低
    • 挡在集群中存储大量数据时,要办一数据必须耗费大量时间成本。因此如果我们有计算数据的需求时,计算功能在接近数据的服务器中运行,而不是搬移数据。

HDFS文件存储架构

HDFS允许用户以文件形式存储数据,文件被分成若干数据块,而且这些数据块存放在一组DataNode上。HDFS对文件的存储有以下要点:
在这里插入图片描述

  • 文件分割
    • 当用户以HDFS命令要求存储文件时,系统会将文件切割成多个区块(Block),每个区块大小为64MB,如上图中文件被切分为A,B,C共3个区块。
  • 区块副本策略
    • 一个文件区块默认会被复制成3份,你也可以在Hadoop配置中设置文件区块要创建几个副本。
    • 文件区块损坏时,NameNode会自动寻找位于其他DataNode上的副本来恢复数据,维持3份的副本策略。
  • 机架感知
    • 上图中有Rack1,Rack2,Rack3共3个机架,每个机架都有4个DataNode服务器。
    • HDFS具备机架感知功能,如上图所示,以Block C为例,第一副本位于Rack1机架上某结点;第二份位于Rack1机架上另一节点,最后一份位于不同机架Rack3上的不同节点。
    • 这样设计的好处是防止数据遗失,有任何节点或机架出现故障可以保证回复数据,提高数据安全性。

  NameNode是整个HDFS的核心,它通过维护一些数据结构来记录每一个文件被分割成多少块、这些块可以从哪些DataNode中获取,以及各个DataNode的状态等重要信息。NameNode执行文件系统的命名空间操作,如打开、关闭、重命名或目录等,也负责数据块到具体DataNode的映射。
  DataNode负责处理文件系统客户端的文件读写操作,并在NameNode的统一调度下进行数据块的创建、删除和复制操作。

HDFS的运行机制

  • 可靠性保障
    • 冗余机制——数据备份
    • 故障检测——DataNode(心跳包、块报告、数据完整性监测);NameNode(日志和镜像)
  • 读文件流程
    • 客户端调用DistributedFileSystem对象的open()方法
    • DistributedFileSystem通过RPC联系namenode,得到所有数据块信息,对每个数据块,namenode返回存有该块副本的datanode地址,并且这些datanode根据他们与客户端的距离进行排序
    • DistributedFileSystem类返回一个FSDataInputStream对象给客户端并读取数据
    • 客户端对该对象调用read()方法读取数据
    • FSDataInputStream连接距离最近的datanode读取数据,数据读取完毕时FSDataInputStream会关闭与该datanode的连接,然后寻找下一个块的datanode
    • FSDataInputStream可能并行读取多个datanode,当客户端完成读取时,对FSDataInputStream调用close()方法
    • FSDataInputStream从datanode读取数据时如果遇到错误,会尝试从该块的另外一个最近的datanode读取数据,并记住故障datanode保证以后不会继续从该节点读取其他块
    • 每个读取的块通过校验和确认以保证数据完整
    • 如果FSDataInputStream发现一个损坏的块,则在从其他datanode读取块之前通知namenode
  • 写文件流程
    • 客户端调用DistributedFileSystem对象的create()方法创建文件
    • DistributedFileSystem通过RPC联系namenode,namenode执行各种检查确保待建立的文件不存在,且客户端拥有创建该文件的权限
    • 如果检查通过,namenode为新文件创建一条记录,否则抛出一个IOException异常
    • DistributedFileSystem给客户端返回一个FSDataOutputStream对象进行写数据
    • FSDataOutputStream将待写入数据分成数据包并写入内部队列dataqueue
    • DataStreamer处理dataqueue,根据datanode列表要求namenode分配适合的新块来存储数据备份
    • namenode分配的数据备份datanode(通常3个)形成一个管线,DataStreamer将数据包传输给管线中的第一个节点,然后该节点存储完之后发送给第二个节点,以此类推
    • FSDataOutputStream维护一个确认队列ackqueue,当收到管线中所有datanode的确认后,该数据包从确认队列中删除
    • 如果datanode发生故障,则关闭管线,将确认队列中的数据包添加回数据队列的最前端,将故障的数据块和datanode信息返回给namenode以便该datanode恢复后删除错误数据块,从管线中删除错误节点,并把剩余数据块写入正常datanode
    • 如果复本数量不足,则namenode根据datanode分配新的datanode并创建新的复本,该datanode被加入管线继续正常存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值