Hadoop分布式文件系统HDFS介绍
概念
HDFS是Hadoop Distribute File System 的简称,也就是Hadoop分布式文件系统。
设计理念
1、硬件错误是常态
错误检测并快速自动恢复是HDFS的最核心设计目标
2、存储超大文件
HDFS适合大量存储,总存储量可以达到的PB、EB级
HDFS适合大文件,单个文件一般在百MB级以上
文件数目适中
3、流式数据访问,最高效的访问模式是 一次写入、多次读取
HDFS适合用于处理批量,而不适合随机定位访问
HDFS存储的数据集作为hadoop的分析对象。在数据集生成后,长时间在此数据集上进行各种分析。每次分析都将设计该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。
4、简单的一致模型
HDFS的应用程序需要对文件实行一次性写、多次读的访问模式
不能修改已写入的数据
5、程序采用“数据就近”原则分配节点执行
移动计算比移动数据的代价要低
6、运行在普通廉价的服务器上
HDFS设计理念之一就是让它能运行在普通的硬件之上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用。
局限性
1、不适合低延迟数据访问
高吞吐量可能要求以高延迟作为代价
Hbase可以弥补不足
2、无法高效存储大量小文件
文件数量大小的限制由NameNode来决定
3、不支持多用户写入及任意修改文件
HDFS的基本存储单位块(Block)
传统的块存储介质中,块是读写的最小数据单位(扇区),传统文件系统基于存储块进行操作
HDFS也使用的块的概念,默认大小为64M
- 可针对每个文件配置,由客户端指定(hdfs-site.xml中配置dfs.block.size, 默认为64M)
- 每个块有一个自己的全局ID
HDFS将一个文件分为一个或数个块来存储
- 每个块是独立的存储单位
- 以块为单位在集群服务器上分配存储
如果实际数据没有达到块大小,则并不实际占用磁盘空间, 例如如果一个文件是500M,则它会被分为8个块:64*7+52
使用块存储的好处:
- 一个文件的大小可以大于网络中任意一个磁盘的容量
- 简化了存储子系统的设计,简化了存储管理,消除了对元数据的顾虑
- 块适合用于数据备份,提供了容错能力和可用性
HDFS体系架构
主要包括以下部分:
NameNode
- 管理文件系统的命名空间
- 记录每个文件数据块在各个Datanode上的位置和副本信息
- 协调客户端对文件的访问
- 记录命名空间内的改动或空间本身属性的改动
- Namenode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等
- 通过检查点(Checkpoint)更新影像文件,Secondary Namanode辅助完成处理
DataNode
- 负责所在物理节点的存储管理
- 一次写入,多次读取(不修改)
- 文件由数据块组成,典型的块大小是64MB
- 数据块尽量散布道各个节点
事务日志
映像文件
SecondaryNameNode
HDFS读写文件的流程
客户端要访问HDFS中的一个文件,首先从namenode获得组成这个文件的数据块位置列表,根据列表知道存储数据块的datanode,访问datanode获取数据,Namenode并不参与数据实际传输。
写入数据流程: 客户端首先在NameNode中创建文件, 然后将文件内容写到DataNode中, 完成后返回客户端, 客户端关闭NameNode中创建的文件。
HDFS的可靠性
冗余副本策略
- 可以在hdfs-site.xml中设置复制因子指定副本数量
- 所有数据块都有副本
- Datanode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表(blockreport)汇报给namenode
机架策略
- 集群一般放在不同机架上,机架间带宽要比机架内带宽要小
- HDFS的“机架感知(Rack-aware)”
- 默认在一个机架内存放两个副本, 在另外一个机架内再存放一个副本, 这样可以防止机架失效时丢失数据,也可以提高带宽利用率
心跳机制
- Namenode周期性从datanode接收心跳信号和块报告
- Namenode根据块报告验证元数据
- 没有按时发送心跳的datanode会被标记为宕机,不会再给它任何I/O请求
- 如果datanode失效造成副本数量下降,并且低于预先设置的阈值,namenode会检测出这些数据块,并在合适的时机进行重新复制
- 引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等
安全模式
- Namenode启动时会先经过一个“安全模式”阶段
- 安全模式阶段不会产生数据写
- 在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的
- 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
- 当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数
校验和
- HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查
- 在文件创立时,会计算每个数据块的校验和
- 校验和会作为单独一个隐藏文件保存在命名空间下
- 客户端获取文件时可以检查数据块对应的校验和是否和隐藏文件中的相同,从而发现数据块是否损坏
- 如果正在读取的数据块损坏,则可以继续读取其它副本
回收站
- 删除文件时,其实是放入回收站/trash
- 回收站里的文件可以快速恢复
- 可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块
- 默认回收站是关闭的,可以通过在core-site.xml中添加fs.trash.interval来打开并配置时间阀值,时间单位是分
元数据保护
- 映像文件和事务日志是Namenode的核心数据。可以配置为拥有多个副本
- 副本会降低Namenode的处理速度,但增加安全性
- Namenode依然是单点,如果发生故障要手工切换