Hadoop之HDFS
1.HDFS概述
-
HDFS(hadoop distributed file system)
一个分布式的文件系统,用于存储文件。适合一次写入,多次读出的场景。
-
优点:
-
高容错性:多个副本保证数据安全
-
适合处理大数据:存储规模大,PB级别。文件规模大,百万级。
-
部署要求低:可以运行在廉价服务器上
-
-
缺点:
- 不适合低延时数据访问。访问速度相对较慢
- 无法高效存储小文件。原因是小文件过多会使得NameNode存储过多元数据信息。NameNode运行在内存中,资源有限。同时过多小文件也会导致寻址时间过长,影响效率。
- 不支持并发写入和随机修改。只支持单个写入,不支持多线程写。仅支持数据append追加。不支持随机对数据进行修改。
-
2.HDFS组成架构
1.NameNode:
- 管理HDFS的命名空间
- 配置副本策略
- 管理数据块block的映射信息
- 处理客户端client的读写请求
2.DateNode
- 存储时机数据,即数据块block
- 执行数据块的读写操作
3.Client
- 切分要上传的数据块,再进行上传
- 于NameNode交互,获得文件位置信息进行读写操作
- 提供命令管理HDFS,实现格式化,增删改查等
4.Secondary NameNode
- 辅助NameNode,定期合并FSimage和Edits文件
- 紧急情况下,辅助恢复NameNode
3.HDFS块大小的设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UYiSwf1q-1626603946394)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715163345756.png)]
-
HDFS中,文件以块Block的方式存储。大小可以通过参数(dfs.blocksize)设置,在hadoop2.x和3.x中默认为128M,1.x版本中默认为64M。
-
块大小设置的理由:
如果block设置太大会导致磁盘传输时间过长,远大于在NameNode中的寻址时间。导致处理block过慢。
如果block设置太小,会增大NomeNode的压力,寻址时间过长。
-
因此,按照最佳比例,block设置应该最接近磁盘的传输速率为益。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-023uktef-1626603946396)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715163800893.png)]
4.HDFS的读写流程
1.HDFS的写数据流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egM7fsnS-1626603946396)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715164015663.png)]
-
客户端通过Distributed FileSystem向NameNode请求上传文件。
-
NameNode检查元数据信息,以及该客户端是否具有写权限。若有则返回数据流对象。
-
Client将数据切分为128M的block,请求写入的DateNode地址。
-
NameNode返回节点信息。Client和DataNode建立pipeline管道,通过流对象向DataNode写入以packet为单位的数据。DataNode再与第二个副本的DateNode建立pipeline连接,传输数据。以此类推,所有副本建立连接并传输packet数据。
(Packet默认为64KB,是client向DataNode传输的基本单位。同时每个packet包含一个chunk,默认为512B+4B的校验位,用作数据传输校验)
-
每个block传输完成后每个DateNode逐级返回ack应答。确认后继续下一个block写入。
-
待数据全部写完后关闭流对象。
2.节点距离的计算-网络拓扑
-
通过网络拓扑计算节点之间的距离,即机架感知,选择副本存储的节点。
-
第一个副本存储在client所处的节点上,如果client不在集群上则随机选择,
第二个副本存储在另一个机架上随机节点,第三个副本存储在第二个机架上随机节点。
3.HDFS读流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJuoDFDG-1626603946398)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715170617354.png)]
- Client通过Distributed FileSystem向NameNode申请读数据。
- NameNode检查client权限,符合则查询元数据获得数据实际四肢即DateNode地址并返回数据流对象。
- Client根据规则遵照最近节点读取数据。数据传输以packet为单位,同时每个packet包含一个chunk,默认为512B+4B的校验位,用作数据传输校验。
- Client接收数据后先缓存在内存中,然后再写入目标文件
- 关闭流对象
5.NameNode和SecondaryNameNode
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6yHAkYL-1626603946399)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715171908906.png)]
- 元数据由于访问效率要求高,数据存储在内存中。为了保证数据安全,在磁盘中建立了元数据备份FsImage。为了提高效率还建立了Edits文件追加最新操作信息。Secondary NameNode通过定期合并FsImage和Edits。保证数据安全。
- 合并时间默认为每1小时或操作数达到100万次时。
6.DataNode的工作机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p7tRVVzu-1626603946399)(C:\Users\Jzs\AppData\Roaming\Typora\typora-user-images\image-20210715171851465.png)]
- 一个block数据块在DataNode以文件的形式存储在磁盘上,包含两个文件。一个是数据本身,另一个是元数据(block长度,校验和,时间戳等)。
- DataNode启动后每向NameNode注册,通过后每6小时向NameNode上报block信息。
- 每三秒DateNode向NameNode返回一个心跳信息。返回结果是收到命令如复制数据到其他节点,删除block等。如果NameNode超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
- 集群在运行过程中可以安全加入或退出一些机器。
向NameNode返回一个心跳信息。返回结果是收到命令如复制数据到其他节点,删除block等。如果NameNode超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。 - 集群在运行过程中可以安全加入或退出一些机器。