HDFS分布式文件系统小结

Posted by 甘家城 on 2021-03-11 Viewed times

HDFS概念

HDFS定义

HDFS是Hadoop的一个分布式文件系统,全称叫Hadoop Distributed File System。

HDFS特点

高容错性

HDFS 可以稳定运行在商用硬件集群上,有冗余副本,心跳机制,安全模式等功能
支持元数据快照,将失效的集群回滚到之前一个正常的时间点上。

大数据集存储

一个磁盘无法放下的 GB 或 TB 的文件,HDFS将它分成小块(block)存储。

一致性模型(write-once-read-many

HDFS 通常是一次写入,多次读取,不支持随机写操作,可以在文件末尾追加。

适合于分布式计算

一般的计算需要将数据输入到程序中,网络传输大文件比较慢。
HDFS则是提供接口将计算先放到每块数据中执行,最后再将结果合并。

与Hadoop关系

Hadoop是一个分布式系统基础架构,其中核心组件有HDFS,MapReduce,YARN。

HDFS架构

架构图

image.png

主从结构

由一个Namenode和一定数目的Datanodes组成。


Namenode是一个中心服务,

  • 负责管理文件系统的Namespace;
  • 数据块到具体Datanode节点的映射和数据块到文件的映射;
  • 负责执行文件系统的Namespace操作,比如打开、关闭、重命名文件或目录;


集群中的Datanode一般是一个节点一个

  • 负责管理它所在节点上数据的存储;
  • 负责处理文件系统客户端的读写请求;
  • 在Namenode调度下进行数据块的创建、删除和复制;
  • 周期性的上报心跳信号和块状态报告到Namenode;

HDFS数据存储

image.png

分块存储

一个大文件存储到HDFS上,会被分成多个Block。目前HDFS分块默认为128M,支持修改。
如果文件大小没有到达块的最小空间,该文件只会占据自己本身空间大小。

备份机制

HDFS默认备份3份,存储在不同的Datanode节点中。
每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。

机架感知

image.png
为了防止当整个机架失效时数据的丢失,Datanode一般会分布在不同的机架上。
另外可以在读取数据的时候计算最近的副本的距离,尽量使用同一个机架上的Block。


首先通过管理员手动配置机器与机架的关系,一般是维护一个map,将脚本文件配置在配置文件中。

FsImage 和 EditLog

  • EditLog:保存元数据更改记录,一个文件只记录一段时间的信息。
  • FsImage:保存文件系统目录树以及文件和 block 的对应关系,理解为元数据镜像文件,某个时刻整个 HDFS 系统文件信息的快照;

只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大

  • SecondaryNameNode:定期合并NameNode的edit logs到fsimage文件中

image.png

  1. 触发检查点(定期/定多少事务记录)
  2. 触发 checkpoint,NameNode 停止向 edits 中写新的记录,另外生成一个 edits.new 文件,将新的事务记录在此文件中
  3. SecondaryNameNode 通过 HTTP 请求,从 NameNode 下载 fsimage 和 edits 文件,合并生成 fsimage.chkpoint 文件;
  4. SecondaryNameNode 再将新生成的 fsimage.chkpoint 上传到 NameNode 并重命名为 fsimage,直接覆盖旧的 fsimage,实际上中间的过程还有一些 MD5 完整性校验,检查文件上传下载后是否完整;
  5. 将 edits.new 文件重命名为 edits 文件,旧的 edits 文件已经合并到 fsimage;

HDFS文件读写


运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。

HDFS中的block、packet、chunk

block

文件上传前需要分块,这个块就是block,一般为128MB,当然你可以去改,不顾不推荐。因为块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。

packet

packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。

chunk

chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。(即64*1024 / 512)

读数据过程

image

写数据过程

image

参考资料

Hadoop官方文档V3.3版本

大数据之 HDFS 图文详解

分布式文件系统架构对比

分布式存储glusterfs

机架感知概念及配置实现

TFS的原理与使用

Hadoop数据完整性与CheckSum校验原理

HDFS读写流程

CRUSH算法的原理与实现

Hadoop个人分享

附件

文件系统简介

文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式。
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。

通用属性

数据是以文件的形式存在,提供 Open、Read、Write、Seek、Close 等API 进行访问;
文件以树形目录进行组织,提供原子的重命名(Rename)操作改变文件或者目录的位置

单机文件系统

windows:FAT/FAT32/NTFS,linux:EXT2/EXT3/EXT4/XFS/BtrFS,mac:APFS 

单机文件系统挑战

  • 共享:无法同时为分布在多个机器中的应用提供访问,于是有了 NFS 协议,可以将单机文件系统通过网络的方式同时提供给多个机器访问。
  • 容量:无法提供足够空间来存储数据,数据只好分散在多个隔离的单机文件系统里。
  • 性能:无法满足某些应用需要非常高的读写性能要求,应用只好做逻辑拆分同时读写多个文件系统。
  • 可靠性:受限于单个机器的可靠性,机器故障可能导致数据丢失。
  • 可用性:受限于单个操作系统的可用性,故障或者重启等运维操作会导致不可用。

开源分布式架构对比

分布式文件系统 开发语言 使用场景 优点 缺点
HDFS JAVA 大文件存储,大数据分析
1. 经典
1. 大数据场景有优势
1. 用户数量大
1. 资料丰富
1. 高吞吐

1. 不通用,并不提供完整的POSIX语义
1. 小文件性能较差
1. 只支持追加写
1. 不能低延迟
GlusterFS C 大文件存储场景
1. 老牌分布式文件系统
1. 应用众多
1. 云存储和流媒体
1. 没有元数据服务器的设计,无单点故障

1. 扩容、缩容时影响的服务器较多
1. 小文件性能较差
CephFS C++ 单机群大中小文件
1. crush算法比较有特点
1. ceph架构支持块存储,对象存储,文件存储

1. 不够成熟稳定,问题较多
1. 读写效率不高
MooseFS C 单机群大中小文件
1. 通过fuse支持了标准的posix,实现通用的文件系统

1. 社区不活跃
1. Master Server本身的性能瓶颈
TFS C++ 主要设计用于小于1MB的小文件
1. 解决分布式文件系统小文件的问题

1. 文档不全
1. 使用较为困难

为什么要设置Block为128M

  1. 如果块设置过大
    • 从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
    • mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
  2. 如果块设置过小
    • 存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
    • 文件块过小,寻址时间增大,导致程序一直在找block的开始位置。
  1. HDFS中平均寻址时间大概为10ms;
  2. 经过前人的大量测试发现,寻址时间为传输时间的1%时,为最佳状态;
        所以最佳传输时间为10ms/0.01=1000ms=1s
  3. 目前磁盘的传输速率普遍为100MB/s;

网络拓扑机器之间的距离

image.png
D1,R1 都是交换机,最底层是 datanode。则 H1 的
rackid=/D1/R1/H1,H1 的 parent 是 R1,R1 的是 D1。这些 rackid
信息可以通过 topology.script.file.name 配置。有了这些 rackid 信息
就可以计算出任意两台 datanode 之间的距离。


1.distance(/D1/R1/H1,/D1/R1/H1)=0  相同的 datanode
2.distance(/D1/R1/H1,/D1/R1/H2)=2  同一 rack 下的不同 datanode
3.distance(/D1/R1/H1,/D1/R1/H4)=4  同一 IDC(互联网数据中心

hadoop2.x架构图

image.png


版权声明:本文为原创文章,转载请注明出处和作者,不得用于商业用途,请遵守 CC BY-NC-SA 4.0协议。

支付宝打赏 微信打赏

赞赏一下