Hadoop三大框架之HDFS
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
一、概述
HDFS产生的背景及定义
HDFS产生背景
随着数据量越来越大在一个操作系统存不下所有的数据那么就分配到更多的操作系统管理的磁盘中但是不方便管理和维护需要一种系统来管理多台机器上的文件这就是分布式文件管理系统。HDFS是分布式文件管理系统中的一种。
HDFS定义
HDFS(Hadoop Distributed File System)是一个文件系统用于存储文件通过目录树来定位为文件。它是分布式的由很多服务器联合起来实现其功能集群中的服务器有各自的角色。
使用场景:适合一次写入、多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
HDFS优缺点
优点
高容错性
数据自动保存多个副本。通过增加副本的形式提高容错性。
某一个副本丢失以后可以自动恢复。
适合处理大数据
数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
文件规模:能够处理百万规模以上的文件数量数量相当之大。
可构建在廉价机器上通过多副本机制提高可靠性
缺点
不适合低延时数据访问比如无法处理毫秒级的存储数据。
无法高效的对大量小文件进行存储
存储大量小文件会占用NameNode大量的内存来存储文件目录和块信息而NameNode的内存是有限的。
小文件存储的寻址时间会超过读取时间违反HDFS的设计目标
不支持并发写入、文件随即修改
一个文件只能有一个写不允许多个线程同时写
仅支持数据追加(append)不支持文件的随即修改
HDFS组成架构
Namenode(nn)
就是master是一个主管者、管理者。
管理HDFS的名称空间
配置副本策略
管理数据块block映射信息
Datanode
就是slave。namenode下达命令datanode执行实际的操作。
存储实际的数据块
执行数据块的读/写操作
Client
就是客户端。客户端是一个抽象的概念无论是命令行还是通过API还是web界面来操作都是客户端。
文件切分。文件上传HDFS的时候client将文件切分成一个个Block然后进行上传
与NameNode交互获取文件的位置信息
与DataNode交互读取或写入数据
Client提供一些命令来管理HDFS比如NameNode格式化
Client可以通过一些命令来访问HDFS比如对HDFS增删改查操作
Secondary NameNode
并非NameNode的热备。当NameNode挂掉的时候并不能马上替换NameNode并提供服务。
辅助NameNode分担其工作量比如定期合并Fsimage和Edits并推送给NameNode
在紧急情况下可辅助回复NameNode
HDFS文件块大小
HDFS中的文件在物理上是分块存储 (Block)块的大小可以通过配置参数( dfs.blocksize)来规定默认大小在Hadoop2.x/3.x版本中是128M。
寻址时间为传输时间的1%时则为最佳状态。因此传输时间=10ms/0.01=1000ms=1s。而目前磁盘的传输速率普遍为100MB/s。
思考:为什么块的大小不能设置太小也不能设置太大?
(1) HDFS的块设置太小会增加寻址时间程序一直在找块的开始位置
(2) 如果块设置的太大从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时会非常慢。
总结: HDFS块的大小设置主要取决于磁盘传输速率
二、HDFS的读写流程
HDFS写数据流程
在HDFS 写数据的过程中NameNode 会选择离待上传数最近距离的 DataNode 接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
写数据流程:
1客户端通过Distributed FileSystem模块向NameNode请求上传文件NameNode检查目标文件是否已存在父目录是否存在。
2NameNode返回是否可以上传。
3客户端请求第一个 Block上传到哪几个DataNode服务器上。
4NameNode返回3个DataNode节点分别为dn1、dn2、dn3。
5客户端通过FSDataOutputStream模块请求dn1上传数据dn1收到请求会继续调用dn2然后dn2调用dn3将这个通信管道建立完成。
6dn1、dn2、dn3逐级应答客户端。
7客户端开始往dn1上传第一个Block先从磁盘读取数据放到一个本地内存缓存以Packet为单位dn1收到一个Packet就会传给dn2dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8当一个Block传输完成之后客户端再次请求NameNode上传第二个Block的服务器。重复执行3-7步。
HDFS读数据流程
读取数据流程:
1客户端通过DistributedFileSystem向NameNode请求下载文件NameNode通过查询元数据找到文件块所在的DataNode地址。
2挑选一台DataNode就近原则然后随机服务器请求读取数据。
3DataNode开始传输数据给客户端从磁盘里面读取数据输入流以Packet为单位来做校验。
4客户端以Packet为单位接收先在本地缓存然后写入目标文件。
三、NN和2NN
硬盘和内存就像阴阳两极的对立硬盘可靠但慢内存快但不可靠。
开机启动:
将硬盘里的 edits_inprogress_001编辑日志和 fsimage镜像文件加载进内存。
客户端client发出操作请求:
1.新建一份空白的 edits_inprogress_002用作后续的编辑日志写入。
2.将内存里的 edits_inprogress_001 改名为 edits_001用作数据备份。
3.将操作请求内容写入 edits_inprogerss_002。
CheckPoint触发:定时时间到/edits中的数据满了
1.拷贝 edits_001 和 fsimage 到 2NN。
2.加载 edits_001 和 fsimage 到内存合并生成结果命名为 fsimage.chkpoint。
3.拷贝 fsimage.chkpoint 到 NN。
4.将NN里的 fsimage.chkpoint 重命名为 fsimage 覆盖掉原来的 fsimage。
NameNode被格式化之后将在/opt/module/hadoop-3.1.3/data/tmp/dfs/name/current目录中产生如下文件:
fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
1 Fsimage文件:HDFS文件系统元数据的一个 永久性的检查点。其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
2 Edits文件:存放HDFS文件系统的所有更新操作的路径文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
3 seen_txid文件:保存的是一个数字就是最后一个edits 的数字
4 每次NameNode启动的时候都会将Fsimage文件读入内存加载Edits里面的更新操作保证内存中的元数据信息是最新的、同步的可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。
四、Datanode工作原理
工作机制:
1一个数据块在DataNode上以文件形式存储在磁盘上包括两个文件一个是数据本身一个是元数据包括数据块的长度块数据的校验和以及时间戳。
2DataNode启动后向NameNode注册通过后周期性1小时的向NameNode上报所有的块信息。
3心跳是每3秒一次心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳则认为该节点不可用。
4集群运行中可以安全加入和退出一些机器。
五、HDFS重点
HDFS文件块大小
HDFS的shell操作
HDFS的读写流程