Haddoop大数据教程笔记_04_HDFS的核心工作原理

目录

HDFS的核心工作原理及读写数据流程

1.hdfs整体运行机制

hdfs:分布式文件系统

hdfs跟普通的单机文件系统有区别:

hdfs的工作机制:

2.namenode元数据管理要点

什么是元数据?

元数据由谁负责管理?

Namenode主要维护两个文件,一个是fsimage,一个是editlog。

secondarynamenode的checkpoint操作

上述过程叫做:checkpoint操作

具体步骤如下:

secondary namenode启动位置的配置:

3.hdfs写入数据流程

4.hdfs读取数据流程


HDFS的核心工作原理及读写数据流程

1.hdfs整体运行机制

hdfs:分布式文件系统

hdfs有着文件系统共同的特征:

1)有目录结构,顶层目录是:  /

2)系统中存放的就是文件

3)系统可以提供对文件的:创建、删除、修改、查看、移动等功能

hdfs跟普通的单机文件系统有区别:

1)单机文件系统中存放的文件,是在一台机器的操作系统中

2)hdfs的文件系统会横跨N多的机器

3)单机文件系统中存放的文件,是在一台机器的磁盘上

4)hdfs文件系统中存放的文件,是落在n多机器的本地单机文件系统中(hdfs是一个基于linux本地文件系统之上的文件系统)

hdfs的工作机制:

                1)客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<准确来说:切块的行为是由客户端决定的>

2)一旦文件被切块存储,那么,hdfs中就必须有一个机制,来记录用户的每一个文件的切块信息,及每一块的具体存储机器(负责记录块信息的角色是:name node)

3)为了保证数据的安全性,hdfs可以将每一个文件块在集群中存放多个副本(到底存几个副本,是由当时存入该文件的客户端指定的)

综述:一个hdfs系统,由一台运行了namenode的服务器,和N台运行了datanode的服务器组成!

2.namenode元数据管理要点

什么是元数据?

hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>)

元数据由谁负责管理?

namenode

namenode把元数据记录在哪里?

namenode的实时的完整的元数据存储在内存中;

namenode还会在磁盘中(dfs.namenode.name.dir)存储内存元数据在某个时间点上的镜像文件;

namenode会把引起元数据变化的客户端操作记录在edits日志文件中;

Namenode主要维护两个文件,一个是fsimage,一个是editlog。

fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。

editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。

简单来说,NameNode维护了文件与数据块的映射表-以及数据块与数据节点的映射表,什么意思呢?就是一个文件,它切分成了几个数据块,以及这些数据块分别存储在哪些datanode上,namenode一清二楚。

Fsimage就是在某一时刻,整个hdfs 的快照,就是这个时刻hdfs上所有的文件块和目录,分别的状态,位于哪些个datanode,各自的权限,各自的副本个数。

然后客户端对hdfs所有的更新操作,比如说移动数据,或者删除数据,都会记录在editlog中。

为了避免editlog不断增大,secondary namenode会周期性合并fsimage和edits成新的fsimage,新的操作记录会写入新的editlog中,这个周期可以自己设置(editlog到达一定大小或者定时)。

secondarynamenode的checkpoint操作

secondarynamenode会定期从namenode上下载fsimage镜像和新生成的edits日志,然后加载fsimage镜像到内存中,然后顺序解析edits文件,对内存中的元数据对象进行修改(整合)。整合完成后,将内存元数据序列化成一个新的fsimage,并将这个fsimage镜像文件上传给namenode

上述过程叫做:checkpoint操作

提示:secondary namenode每次做checkpoint操作时,都需要从namenode上下载上次的fsimage镜像文件吗?

第一次checkpoint需要下载,以后就不用下载了,因为自己的机器上就已经有了。

具体步骤如下:

第一步:将hdfs更新记录写入一个新的文件——edits.new。

第二步:将fsimage和editlog通过http协议发送至secondary namenode。 第三步:将fsimage与editlog合并,生成一个新的文件——fsimage.ckpt。这步之所以要在secondary namenode中进行,是因为比较耗时,如果在namenode中进行,或导致整个系统卡顿。

第四步:将生成的fsimage.ckpt通过http协议发送至namenode。

第五步:重命名fsimage.ckpt为fsimage,edits.new为edits。

这样的话,fsimage与editlog合并的过程就完成了。所以如果namenode宕机,其实secondary namenode还保存这一份不久前的fsimage,还能挽回一些损失吧。

另外,一旦有datanode挂掉了(宕机或者是网络阻塞),namenode能很快感知到,并且将宕机的节点上的数据块转移至其余空闲节点。这点是因为hdfs中心跳机制(heartbeat)。 心跳机制默认3s中一次,datanode会向namenode发送一次一跳,告知namenode当前节点上存放的数据文件是什么。如果namenode中记录的是该datanode存放了文件A的两个数据块和文件B的一个数据块,但是心跳中只有文件A的一个数据块信息,namenode就会知道该datanode数据块损坏了,会把损坏的数据块在别的datanode上补充。

secondary namenode启动位置的配置:

         /root/apps/hadoop-2.10.0/etc/hadoop/hdfs-site.xml
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>0.0.0.0:50090</value>
  </property>

把默认值改成你想要的机器主机名即可。如:

  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hdp-01:50090</value>
  </property>

secondarynamenode保存元数据文件的目录配置:

        /root/apps/hadoop-2.10.0/etc/hadoop/hdfs-site.xml
<property> 
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file://${hadoop.tmp.dir}/dfs/namesecondary</value> 
</property>

改成自己想要的路径即可:/root/dfs/namesecondary

  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/root/dfs/namesecondary</value>
  </property>

3.hdfs写入数据流程

       1)客户端访问NameNode,NameNode检查路径和权限,如果路径中有与要上传的文件重名的文件就不能上传了,不能覆盖,如果没有才创建,创建名为file.copying的临时文件;

  2)NameNode触发副本放置策略,如果客户端在集群内的某一台机器,那么副本第一块放置在该服务器上,然后再另外挑两台服务器;如果在集群外,namenode会根据策略先找一个机架选出一个datanode,然后再从另外的机架选出另外两个datanode,然后namenode会将选出的三个datanode按距离组建一个顺序,然后将顺序返回给客户端;

  3)客户端会根据返回的三个节点和第一个节点建立一个socket连接(只会和第一个节点建立),第一个节点又会和第二个节点建立socket连接,由第二个节点又会和第三个节点建立一个socket连接,这种连接的方式叫Pipeline;

  4)客户端会将block切分成package(默认是64kB),以流式在pipeline中传输

好处:

   (1)速度快:时间线重叠(其实流式也是一种变异的并行);

   (2)客户端简单:副本的概念是透明的;

  5)由DataNode完成接收block块后,block的metadata(MD5校验用)通过一个心跳将信息汇报给NameNode;

  6)如果再pipeline传输中,任意节点失败,上游节点直接连接失败节点的下游节点继续传输,最终在第5步汇报后,NameNode会发现副本数不足,一定会出发DataNode复制更多副本,客户端Client副本透明;

  7)client一直重复以上操作,逐一将block块上传,同时DataNode汇报block的位置信息,时间线重叠;

  8)最终,如果NameNode收到了DataNode汇报的所有块的信息,将文件的.copying去掉,文件可用。

4.hdfs读取数据流程

 1)客户端和NameNode建立连接,获取文件block的位置信息(fileBlockLocations)

 2)客户端根据自己想要获取的数据位置挑选需要连接的DataNode(如果全文下载,从0开始;如果是从某一位置开始,客户端需要给出)

需要用inputstream.seek(long)//从什么位置开始读取,和哪个DataNode开始连接获取block;

 3)距离的概念:只有文件系统在读流程中附加距离优先的概念,计算层才能够被动实现计算向数据移动,距离有以下三种:

  (1)本地,最近的距离;

  (2)同机架,次之的距离;

  (3)other(数据中心),最远的距离;

 4)客户端下载完成block后会验证DataNode中的MD5,保证块数据的完整性。

后续分享:<mapreducehe/YARN>

发布了10 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Snowing_inhope/article/details/105577545