添加URL
分享
小白初识HDFS必备知识 阿里工作群转发资料(中)

小白初识HDFS必备知识 阿里工作群转发资料(中)

书接上回,依然是 大厂分享的内部学习资料 ,必备知识,就像秋天的底裤一样,虽然不一定让人看,但是一定要穿,否则蛋疼的是自己。


HDFS权限

自己了解,网路上有很多相关的资料,面试不会问很多,多是由公司网管负责相关的工作,但是知道更好。


安全模式 和权限没什么关系。

1.启动NameNode,NameNode加载fsimage到内存,对内存数据执行edits log日志中的事务操作。

2.文件系统元数据内存镜像加载完毕,进行fsimage和edits log日志的合并,并创建新的fsimage文件和一个空的edits log日志文件。

3.NameNode等待DataNode上传block列表信息,直到副本数满足最小副本条件。

4.当满足了最小副本条件,再过30秒,NameNode就会退出安全模式。最小副本条件指整个文件系统中有99.9%的block达到了最小副本数(默认值是1,可设置)


在NameNode安全模式(safemode)

a、对文件系统元数据进行只读操作

b、当文件的所有block信息具备的情况下,对文件进行只读操作

c、不允许进行文件修改(写,删除或重命名文件)


接下来是硬菜,HDFS底层的一些原理。

HDFS写文件流程

来源于法国巴黎圣母院博物馆熄灭的火星——祭奠今天

1.调用客户端的对象DistributedFileSystem的create方法;

2.DistributedFileSystem会发起对namenode的一个RPC连接,请求创建一个文件,不包含关于block块的请求。namenode会执行各种各样的检查,确保要创建的文件不存在,并且客户端有创建文件的权限。如果检查通过,namenode会创建一个文件(在edits中 元数据)(返回 3 ),否则创建失败,客户端抛异常IOException。

3.DistributedFileSystem返回一个FSDataOutputStream对象给客户端用于写数据。FSDataOutputStream封装了一个DFSOutputStream对象负责客户端跟datanode以及namenode的通信。

4.FSDataOutputStream对象将数据切分为小的数据包(64kb),并写入到一个内部队列(“数据队列”)。DataStreamer会读取其中内容,并请求namenode返回一个datanode列表来存储当前block副本。列表中的datanode会形成管线,DataStreamer将数据包发送给管线中的第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个。。。

5.DFSOoutputStream维护着一个数据包的队列,这的数据包是需要写入到datanode中的,该队列称为确认队列。当一个数据包在管线中所有datanode中写入完成, 就从ack队列中移除该数据包 。。。

6.如果有多个block,则会反复从步骤4开始执行。

7.当客户端完成了数据的传输,调用数据流的close方法。该方法将数据队列中的剩余数据包写到datanode的管线并等待管线的确认

8.客户端收到管线中所有正常datanode的确认消息后,通知namenode文件写完了。

9.客户端完成数据的写入后,对数据流调用close方法。该操作将剩余的所有数据包写入datanode管线,并在联系到namenode且发送文件写入完成信号之前,等待确认。namenode已经知道文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。


如果在数据写入期间datanode发生故障,则执行以下操作

a、关闭管线,把确认队列中的所有包都添加回数据队列的最前端,以保证故障节点下游的datanode不会漏掉任何一个数据包。

b、为存储在另一正常datanode的当前数据块指定一个新的标志,并将该标志传送给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。

c、从管线中删除故障数据节点并且把余下的数据块写入管线中另外两个正常的datanode。namenode在检测到副本数量不足时,会在另一个节点上创建新的副本。

d、后续的数据块继续正常接受处理。


好了,来日方长,江湖再见

发布于 2019-04-16