Hadoop知识点(三)-HDFS进程

HDFS进程

  • 1.NameNode #名称节点 nn
  • 2.DataNode #数据节点 dn
  • 3.Secondary NameNode #第二名称节点 snn
  • 4.HDFS写流程
  • 5.HDFS读流程
  • 6.HDFS副本策略

Hadoop知识点(三)-HDFS进程_第1张图片

HDFS有3个组件,有3个进程来维护
是一种主从架构:主节点负责管理,从节点负责做事情,这种称为主从架构,大数据的很多组件都是主从架构、
HDFS有3个角色的进程:
1>NameNode #名称节点 nn
2>SecondaryNameNode #第二名称节点 snn
3>DataNode #数据节点 dn

1.NameNode #名称节点 nn

  1. 文件名称
  2. 文件的目录结构
  3. 文件的属性(权限,创建时间副本数等)
    hdfs dfs -ls dir
    如:hdfs dfs -ls /wordcount/input/
    以上3个都是可以用上面的命令可以看到
    4.一个文件被对应切割哪些数据块–即包含副本数的块,其中数据块对应分布在哪些节点上
    blockmap #块映射 是动态的映射
    nn节点是不会持久化存储映射关系,是通过集群的启动和运行时,dn定期发送blockport给nn,然后nn在内存中动态维护这种关系。
    NameNode作用:
    管理文件系统的命名空间,其实就是维护文件系统树的文件和文件夹,这些形式是以两种文件来永久保存在本地磁盘,一个是镜像文件 fsimage和标记日志 exitlog

2.DataNode #数据节点 dn

datanode
存储数据块和数据块的校验和
作用:
a.每隔3s发送心跳给nn,反馈,证明自己是存活的
dfs.heartbeat.interval 3s

b.每隔一定的时间发生一次blockport
dfs.blockport.intervalMsec 2160000ms=6H
dfs.datanode.directoryscan.interval 21600s=6H 6小时

备注:HDFS Block损坏恢复最佳实践

其实HDFS有一个自动修复的功能,但是很慢,可以说手动修复,但是不能100%的修复,
当数据块丢失,自动修复
参考:https://ruozedata.github.io/2019/06/06/%E7%94%9F%E4%BA%A7HDFS%20Block%E6%8D%9F%E5%9D%8F%E6%81%A2%E5%A4%8D%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5(%E5%90%AB%E6%80%9D%E8%80%83%E9%A2%98)/

目前自己还没有应用到,以后可以看看。

3.Secondary NameNode #第二名称节点 snn

a.fsimage editlog 定期拿过来合并,备份,推送
dfs.namenode.checkpoint.period 3600s
dfs.namenode.chekpoint.txns 1000000

为了解决单点故障,nn只有一个对外的,后来增加了snn,1小时的备份,虽然能够减轻单点故障带来的丢失风险,
但是在生产商还是不允许使用snn,这个是为什么?

在生产上,不用snn,是启动另外一个nn进程(实时备份,实时准备替换nn)叫做HDFS HA

4.HDFS写流程

Hadoop知识点(三)-HDFS进程_第2张图片

步骤1.client调用FileSystem.create(filePath)方法获取输出流(FSDataOutputStream)
步骤2.FileSystem调用nn的create方法去和nn进行【RPC】通信,nn去核对这个路径的文件是否存在,是否有权限创建这个文件。
加入都OK,就先创建一个新的文件,但是这个还未写数据,是不关联任何的block,nn根据上传文件大小,根据块大小和副本数参数,计算要上传多少块和块存储在dn的位置,之后将这些信息反馈给client。
步骤3.client调用FSDataOutputStream.write方法。
步骤4.FSDataOutputStream调用NN的addBlock方法请求第一个块要存储在哪些DN上(配置副本数为3)。 如果管道(pipeline)没有建立,则根据位置信息建立pipeline。
步骤5.第一个块的第一个副本写在第一个dn节点-->第二个副本写在第二个dn节点-->第三个副本写在第三个dn节点。
步骤6.当第三个副本写完,就返回一个ack packet确定包给DN2阶段,当DN2收到ack package确定包加上自己也写完了,就返回一个ack package。逆方向通过pipeline回传给客户端(DN3→DN2→DN1→CN)。客户端根据校验结果判断。
步骤7.当所有的块全部写完,client调用FSDataStreamOutput.close方法,关闭输出流,再次调用FileSystem.complete方法,告诉NN文件写成功。

5.HDFS读流程

Hadoop知识点(三)-HDFS进程_第3张图片

步骤1.client调用FileSystem.open方法
步骤2.与NN进行RPC通信,返回部分或者全部的block列表,也即是返回【FSDataInputStream】对象。
步骤3.Client调用的read方法,去与第一个块的最近的DN进行读取,读取完成后,会check,如OK,就关闭与DN通信
如读取失败,会记录DN+Block信息,下次就不会从这个节点读取,name就会从第二额个阶段读取。
然后去和第二个块的DN进行读取,以此类推
假如当block列表全部兑取完成,文件还没读取结束,就调用FileSystem从NN获取下一批次的block列表。
步骤4.Client调用FSDataInputStream对象,调用close方法, 关闭输入流。

6.HDFS副本策略

伪分布式 1台dn  副本数参数必然是设置1
dn挂了,肯定不能写入

生产分布式 3台dn  副本数参数必然是设置3
dn挂了,肯定不能写入

生产分布式 >3台dn  副本数参数必然是设置3
dn挂了,能写入

存活的alive dn节点数>=副本数 就能写成功

案例:
假如有机架rack1 rack2
第一个副本
放置在上传的DN节点:
假如是在非DN阶段,就随机挑选一个磁盘不太慢,CPU不太忙的阶段

第二个副本
放置在与第一个副本不同的机架上的某一个DN节点。

第三个副本
与第二个副本相同机架的不同节点上
如果副本数设置更多,就随机放。

你可能感兴趣的:(Hadoop,hadoop)