写点什么

HDFS

用户头像
xujiangniao
关注
发布于: 2021 年 05 月 06 日
HDFS

入侵

数据处理的两大问题之一:存储


需求

  • 单数据大,单块磁盘难以存储

  • 读写速度要快

  • 数据的可用性


解决办法

pre-HDFS

RAID
  1. RAID0

  2. 数据从内存缓存写入磁盘时,根据磁盘数量分成 N 份,并发写入 N 块磁盘,读写速度都是一块磁盘的 N 倍

  3. 无备份,只要有一块磁盘损坏,数据完整性即倍破坏

  4. RAID1

  5. 数据写入磁盘时,同时写入两块硬盘

  6. 有备份,但 并发读写效率低

  7. RAID10

  8. 数据写入磁盘时,先根据磁盘数量,分成 2 份,同时写入两份硬盘

  9. 每份硬盘都做成了 RAID0,即每份数据被分成 N/2 分,同时写入,读取类似

  10. RAID3

  11. RAID 3 可以在数据写入磁盘的时候,将数据分成 N-1 份,并发写入 N-1 块磁盘,并在第 N 块磁盘记录校验数据,这样任何一块磁盘损坏(包括校验数据磁盘),都可以利用其他 N-1 块磁盘的数据修复。

  12. RAID5

  13. RAID 5 是使用更多的方案。RAID 5 和 RAID 3 很相似,但是校验数据不是写入第 N 块磁盘,而是螺旋式地写入所有磁盘中。这样校验数据的修改也被平均到所有磁盘上,避免 RAID 3 频繁写坏一块磁盘的情况

  14. RAID6

  15. RAID 6 和 RAID 5 类似,但是数据只写入 N-2 块磁盘,并螺旋式地在两块磁盘中写入校验信息(使用不同算法生成)。


RAID10 在生产环境中应用较多


  • 单数据大,单块磁盘难以存储 -> RAID 将单个数据分成多份

  • 读写速度要快 -> 多块磁盘同时读写数据

  • 数据的可用性 -> 同时写入两份,或存好校验数据,保证不丢数据,并迅速恢复

HDFS


namenode

  1. 文件系统元数据操作

  2. 通过 FSDirectory 管理整个文件系统元数据的目录树

  3. 数据块的管理

  4. 保存 NN 中的所有数据块的元数据,用于 block 管理,维护着 BlocksMap 和接受 DN 的块汇报

  5. 数据节点管理

  6. namenode 管理 datanode,包含了 decommission 和 activities 的节点,用于接收 dn 注册,心跳等.

  7. 租约管理

  8. 管理文件访问的租约

  9. 缓存管理

  10. 提供客户端和 slave 远程方法调用


每个 DataNode 周期性和唯一的 NameNode 通信,还时不时和 hdfs 客户端代码以及其他 datanode 通信。

 

datanode

datanode 维护一个重要的表:

  块=>字节流

这些存储在本地磁盘,DataNode 在启动时,还有启动后周期性报告给 NameNode,这个表的内容。

DataNodes 周期性请求 NameNode 询问命令操作,NameNode 不能直接连接 DataNode,NameNode 在 DataNode 调用时,简单返回值。

DataNodes 还维护一个开放的 socket 服务器,让客户端代码和其他 DataNode 通过它可以读写数据,这个服务器的 host/port 会汇报给 NameNode。


写文件流程:


客户端要向 HDFS 写数据,首先要跟 namenode 通信并确认可以写文件并获得接受文件 block 的 datanode,然后客户端按顺序将文件逐个 block 传递给 datanode,并由接收到 block 的 datanode 负责向其他 datanode 复制 block 的副本


  1. 客户端向 namenode 发送上传文件请求,namenode 对上传目录和文件进行检查,判断是否可上传,(有无对应的目录或文件,是否有权限相应的读写创建权限),并向客户端返回检查结果

  2. 客户端得到上传文件的允许后读取客户端配置,如果没有指定的配置则会读取默认配置,(例如副本数和块大小默认为 3 和 128M,副本由客户端决定)。向 namenode 请求上传一个数据块

  3. namenode 会根据客户端的配置来查询 datanode 信息,如果使用默认配置,那么会返回同一个机架的两个 datanode 和另一个机架的 datanode,这成为机架感知策略,使副本分布均匀,有利于组件失效时的负载均衡

  4. 客户端在开始传输数据块之前会把数据缓存在本地,当缓存大小超过了一个数据块的大小,客户端就会从 namenode 获取要上传的 datanode 列表。之后会在客户端和第一个 datanode 建立连接开始流式的传输数据,这个 datanode 会一小部分一小部分(4K)的接收数据然后写入本地仓库,同时会把这些数据传输到第二个 datanode,第二个 datanode 也同样一小部分一小部分的接收数据并写入本地仓库,同时传输给第三个 datanode,依次类推。

  5. 这样逐级调用和返回之后,待这个数据块传输完成客户端后告诉 namenode 数据块传输完成,这时候 namenode 才会更新元数据信息记录操作日志。

  6. 第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。


pro-HDFS


后无来者


发布于: 2021 年 05 月 06 日阅读数: 10
用户头像

xujiangniao

关注

还未添加个人签名 2018.11.09 加入

还未添加个人简介

评论

发布
暂无评论
HDFS