Hdfs架构,文件写流程

伪分布式的HDFS 的NN,DN,SNN都是部署在同一台机器上的。

HDFS的启动:./start-dfs.sh
HDFS查看内容 hdfs dfs -ls

1.block的概念

hdfs默认一个block(块)是134217728个字节(128M),数据被切分以块为单位存储在不同的机器上,

 举个例子
 每个瓶子容量128ML  1碗水260ML 需要3个瓶子
A 128ml
B 128ml
C 4ml

一般来说,生产环境的数据会有3个副本,也就是数据的每一个块会被复制3份存储起来,防止某些块数据丢失。

2.HDFS架构设计,主从结构

NN 主 名称节点
SNN 第二名称节点 --》NN(如果挂了)
DN 从 数据节点
在这里插入图片描述
(1)namenode
NN的功能是存储文件目录结构,文件属性名称等,还有文件对应哪些数据块,数据块对应分布到哪些datanode节点上。

需要注意的是,namenode不会持久化存储这种数据块的对应关系,,集群在启动和运行时会定期发送blockreport给namenode汇报存储情况,namenode就可以在内存中动态维护这种映射关系。

namenode会将存储的信息以两种文件形式去保存。
1.命名空间镜像文件 fsimage
2.编辑日志 editlog

(2)datanode

datanode存储数据块和块的校验和功能就是文件数据块的读写,块的校验和就是当一个完整的数据被切分分开存储后,使用时从不同存储地方读取出来的数据组合起来时,用来检测数据是否发生了丢失和损坏的。

和NN通信:
1.datanode会每隔3秒发送一个心跳包,通报存活情况
2.每隔10次心跳发送一个blockreport,汇报最新存储情况

(3)secondary namenode
snn是存储nn的fsimage和editlog的,他的作用是定期合并fsimage+editlog文件为新的fsimage,推送给NN,称为检查点,checkpoint

dfs.namenode.checkpoint.period: 3600 相当于1个小时更新一次

fsimage: 镜像文件 文件系统树 全量 7:00
editlog:操作日志 读写的操作记录 增量 7:00-8:00

如下图所示,假设当前是7.整,nn会把edit和fsimage读取到snn里,snn会把这两个文件整合为一个新的镜像文件返回给nn,这时的镜像文件相当于有了8.前所有的文件情况,edit保持持续更新。
在这里插入图片描述

3.副本的放置策略

在生产环境中,机器会被放到机架里

之前说过存储在datanode块里的数据会有3个副本。一般来说。

第一个副本:
假设我提交文件的所在机器就是datanode节点,
那么第一个块就存储在本节点上;
如果不是,就随机挑选一台磁盘不太慢的 cpu不太繁忙的节点上;(通过心跳判断)

第二个副本:
放置在于第一个副本的不同的机架的节点上

第三个副本:
与第二个副本相同的机架的不同的节点上
在这里插入图片描述

4.hdfs文件的写流程

在这里插入图片描述linux -> hdfs
假如输入一个命令: hdfs dfs -put xxx.log /user/hadoop/asd

1.Client(就是输命令啦)调filesystem.create(path,path就是上面指令后面的路径),与nn rpc通信,check path是否已经存在及有没有权限创建;
假如OK,就创建一个新文件,但是不关联任何的block,返回一个FSDataOutputStream对象;
假如不OK,就返回错误信息

2.Client调用FSDataOutputStream对象的write方法,
将第一个块写给DN1,当第一个块写完,DN1复制块到DN2,当第二个块写完,DN2复制块到DN3,当第三个块写完,DN3返回一个ack packet确认包给DN2,

当DN2收到DN3的ack,发送一个ack给DN1,当DN1收到DN2的ack,发送一个ack给FSDataOutputStream对象,标识第一个块3个副本全部写完;

然后余下的块依次这么写!

3.当文件写完成,Client调用FSDataOutputStream对象的close方法,关闭输出流,flush缓存区的数据包;

4.再调用filesystem.complete方法,告诉NN,我们写完了。

猜你喜欢

转载自blog.csdn.net/qq_36459386/article/details/83690832
今日推荐