HDFS
分布式文件系统 ---- 存储
block
- 大文件切割成块(block),分散存储在集群中。
- 单一文件的 block 块大小一致,不同文件可以不一样。(最后一块128M没存满,还是128M)
- 为了安全----机制(副本机制)。
- 追加数据 ---- append (只在尾部追加数据)。
- 只支持一次写入多次读取,同一时刻只有一个写入者。
读写操作
写操作
- namenode(老板):
- 掌控全局,管理DN,以及元数据(描述数据的数据) ---- 内存中
- 接收客户端的读写服务(client<秘书> – 申请,能不能存文件)
- 收集datanode的信息
- 给 client 一些 DN 信息
- DataNode(员工):
- 存文件(block块),向NN汇报信息(存了哪些电影,以及自己是否还存活)
- 存储 block 元数据信息(NN存的是整个大文件的信息,DN存放的是每个 block 的)
- 接受 client 的请求
具体实现
- 大文件线性切割成 block 块: client 会优先计算一下大文件的块数 block(默认值128M) block数 = 大文件/128M
- client 会向 NN 汇报情况:
- 当前大文件的 block 数
- 当前大文件的属主
- 当前大文件的权限
- 当前大文件的上传时间
(重复如下操作,直到所有 block 存储完毕) - 切割一个 block 块
- 请求 block 的 id DN的地址
- NN 将一些负载不高的 DN 地址进行返回给 client
- client 拿到地址,找到这个 DN 进行上传,并进行备份
- DN 存储完毕后 向 DN 进行汇报
读操作
- client 会向 NN 请求 block 的位置信息,NN 掌握元数据
- NN 返回 block 的信息给 client
- client 拿到 block 的信息后之后去相应的读取 block 的数据 — 就近原则
备份机制
任务提交方式
- 集群内提交 直接提交到及群众
- 集群外提交
如何备份
- 如果是集群内提交:第一个 block 提交上传请求的服务器上
如果是集群外提交:第一个 block 提交到负载均衡不高的服务器上 - 第一个备份:与第一个 block 不同机架的随机一台服务器上
- 第二个备份:存放第一个备份的 block 相同机架但是不同的服务器上
- 更多的副本:随机存放
Pipeline(写操作+备份机制)
client 请求之后,NN 会返回一批 DN,client 会与这批 DN 之间形成 Pipeline 管道。
以 block 块形式存储,在 pipline中,会将 block 再次细分,分成一个个 ack packet, ack 在管道中进行流淌。DN 会从 管道中复制一份 ACK 进行存储
持久化存储
持久化原数据----相当于第二个老板来做-----SecondaryNameNode
namenode 元数据信息 存储在 内存中,需要进行持久化,来保障系统和数据的安全可靠。
持久化过程
namenode:
- edits:存放系统的操作信息
- fsimage:
secondarynamenode 会把 namenode 的 edits 和 fsimage 拉取一份在 secondarynamenode 中,然后将其合并做一次快照存储为 fsimage.ckpt, 然后将 fsimage.ckpt 拉回到 namenode 中。
从 SNN 拉回的信息,形成新的 fsimage,这次已经完成了相应的更新,有了更新前的所有数据。
当 SNN 进行合并的时候,新的系统操作会生成一个新的 edits(默认64M),新的 edits 和 新的 fsimage 满足一定条件后会继续执行上面的拉取和合并。
条件:
- 时间:超过 3600s
- 内存:edits 文件超过 64M
合并的过程中又有文件产生,并超过 64M:
- 可以改变 edits 的默认值 ---- 自己清楚会有很多的操作,有可能出现问题
- 系统会自动的,再次新建
当持久化结束之后,系统已经完成更新,之前的数据,在合并之后的文件中,那这些文件是持久化到磁盘中,在磁盘中进行存储,防止在内存中因系统故障丢失。
安全模式
电脑频繁的开关机,会默认进入安全模式。
- 持久化之后,之前的系统操作会进入到磁盘中。
- 持久化之前,系统关闭 ---- 他会读取你的系统日志。
- 当再次开机的时候,他会去读取 fsimage ,因为已经持久化到磁盘中,所以会去磁盘中将数据拉回到内存中(NN 数据在内存中生成、管理)。
- 恢复之前的状态
安全模式干什么:
- 恢复系统状态
- 检查 DN 的健康情况 ---- ND 没有挂掉 ---- 做备份 (数据存储时会有备份机制)
(如果 DN 又恢复了,当有新任务时,将新任务发放到此节点;若无新任务,它将原来上面的数据都丢失,它丢失的 block 会从备份机制的 block 存放到其他节点上,不变。