七、八、九、HDFS体系机构,工作机制,DHFSAPI,读写流程

目录

七、hdfs的体系结构(重中之重)

4.1 整体的概述

4.2 fsimage和edit文件的查看

八、hdfs中的工作机制

1.1 开机启动流程(重点)

1.2 安全模式

1.3 心跳机制(重点)

1.4 检查点机制(重点)

1.5 网络拓扑以及机架感知

1.6 集群工作节点的动态上下线

九、hdfs的api

十、读写流程(重点)

3.1 读流程

3.2 写流程


七、hdfs的体系结构(重中之重)

4.1 整体的概述

<span style="background-color:#333333"><span style="color:#b8bfc6">1. hdfs是一个主从(master/slaves)架构, 由四个部分组成,分别是一个namenode充当管理节点,多个datanode是工作节点,一个secondarynamenode是辅助节点,还提供了客户端API接口
2. namnode的作用
3. datanode的作用
4. secodnarynamenode的作用
5. client的作用</span></span>

4.2 fsimage和edit文件的查看

<span style="background-color:#333333"><span style="color:#b8bfc6">重点在于理解元数据是什么    </span></span>

八、hdfs中的工作机制

1.1 开机启动流程(重点)

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#da924a">## 第一步:</span>
 加载name目录下最新的那个fsimage_xxx019文件,将里面存储的元数据(目录树结构)维护到内存中,但是还不是关机前的状态
<span style="color:#da924a">## 第二步:</span>
 将关机前的最后使用的edits_inprogress_xxxx0160进行重命名
 edits_0000000000000000160-0000000000000000169操作,然后生成一个最新的edits_inprogress_xxx170文件,并修改seen_txid里的值为170.
 将从xxx020~xxx169的这个范围内的所有的edit日志文件加载到内存中,重演里面的操作,从而维护成关机前的最新的目录树结构
​
<span style="color:#da924a">## 第三步</span>
  如果触发了检查点条件,namenode就会自己做一个检查点。将内存中的最新状态持久化成一个新的fsimage文件,删除之前保留的两份中的最旧那个。 也就是说namenode会保留最近两次的fsimage.
  
<span style="color:#da924a">## 安全模式:</span>
  从启动到结束,整个过程处于安全模式下。当namenode收到datanode的心跳反馈时,并且达到块数量的99.9%时,会退出安全模式。
  
  
注意:当集群第一次开机时,edit文件才生成,而且datanode上还没有块,因此不会出现安全模式。  </span></span>

扩展:为什么客户端的访问操作不直接存储到fsimage里

<span style="background-color:#333333"><span style="color:#b8bfc6">因为fsimage会随着时间会越来越大(相对而已,不是绝对的,因为有的时候会有删除操作)
直接将访问操作存入fsimage中,性能会非常差。
​
反而我们提供了edit文件,用于存储客户端的访问,edit文件最大是64M,当达到此值,会新生成一个edit文件来存储新的访问数据。</span></span>

1.2 安全模式

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#64ab8f">1</span>.安全模式下不能在hdfs上上传,删除,重命名,追加等操作。只能读取文件。(对于普通用户来说,是只读模式)
<span style="color:#64ab8f">2</span>.相关命令
    hdfs dfsadmin [-safemode <enter | leave | <span style="color:#f3b3f8">get</span> | wait>]
    hdfs dfsadmin <span style="color:#7575e4">-safemode</span> enter:   进入安全模式
    hdfs dfsadmin <span style="color:#7575e4">-safemode</span> leave:   离开安全模式
    hdfs dfsadmin <span style="color:#7575e4">-safemode</span> <span style="color:#f3b3f8">get</span>:     查看安全模式的状态
    hdfs dfsadmin <span style="color:#7575e4">-safemode</span> wait:   使安全模式处于等待状态</span></span>

1.3 心跳机制(重点)

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#64ab8f">1</span>. 概念: 集群在启动后,slave节点会向master节点进行周期性的汇报,汇报自己的健康状态以及其他信息,比如3秒一次,这种机制,我们称之为心跳机制(心跳反馈)
​
<span style="color:#64ab8f">2</span>. dfs的心跳机制:
   <span style="color:#7575e4">--</span>(1)namenode在启动的时候会先开IPC通信服务,等待datanode主动连接
   <span style="color:#7575e4">--</span>(2)datanode启动后,会主动连接IPC通信服务,并且每隔3秒连接一次,并携带自己的状态信息,如块的ID列表,主机名,磁盘剩余空间等。
   <span style="color:#7575e4">--</span> (3) namenode收到datanode的汇报信息后,在内存中维护信息,并下达其他的相关指令给datanode。
   
   
<span style="color:#64ab8f">3</span>. namenode什么时候认为datanode宕机了?
    两个参数和一个公式决定的:
    属性:dfs.namenode.heartbeat.recheck-interval 的默认值为5分钟  <span style="color:#da924a">#Recheck的时间单位为毫秒</span>
    属性:dfs.heartbeat.interval 的默认值时3秒   <span style="color:#da924a">#heartbeat的时间单位为秒 </span>
      
    计算公式:2*recheck<span style="color:#b8bfc6">+</span><span style="color:#64ab8f">10</span>*heartbeat
         
     通过上述公式可知: 默认情况下10分钟30秒后,如果没有接收到某一个datanode的心跳反馈,则认为该datanode宕机。之后就不会再给该datanode分配任务。
        
     
     
     
<span style="color:#64ab8f">4</span>. 扩展:
     大数据框架的master/slaves的这种主从架构,多数都是采用的心跳反馈机制。
     比如yarn
        zookeeper
        hbase</span></span>

1.4 检查点机制(重点)

<span style="background-color:#333333"><span style="color:#b8bfc6">##概念:
    namenode会产生fsimage和一堆edit文件,secondarynamenode会定期的帮助namenode吧fsiamge和edit文件合并,生成最新的fsimage,这种机制称之为检查点机制。
##定期:
	--属性1:
	dfs.namenode.checkpoint.period  :默认是3600s,也就是1小时
	--属性2:
	dfs.namenode.checkpoint.txns: 默认是100w次,指的是txid的值的变更
	--属性3:
	dfs.namenode.checkpoint.check.period: 默认是60s,表示60s一检查txid的值是什么
##检查点机制的流程:
    
    1. SecondaryNamenode请求Namenode停止使用正在编辑的edit日志文件,Namenode会创建新的editlog文件(小了吧),同时更新seed_txid文件。
    2. SecondaryNamenode通过HTTP协议获取Namenode上的fsimage和最近的没有合并过的所有editlog文件。
    3. SecondaryNamenode将fsimage读进内存当中,并逐步分析editlog文件里的数据,进行合并操作,然后写入新文件fsimage_x.ckpt文件中。
    4. SecondaryNamenode将新文件fsimage_x.ckpt通过HTTP协议发送回Namenode,secondarynamenode也会保留最近的两份
    5. Namenode再进行更名操作,并删除最旧的那一个,
</span></span>

1.5 网络拓扑以及机架感知

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#da924a">##1.网络拓扑就是用于计算服务器远近的</span>
    hdfs采用了两个服务器距离最近祖先的距离之和来表示带宽
​
    距离有这四种情况:  
    Distance(/d1/r1/n1, /d1/r1/n1)<span style="color:#b8bfc6">=</span><span style="color:#64ab8f">0</span>(同一节点上的进程)  
    Distance(/d1/r1/n1, /d1/r1/n2)<span style="color:#b8bfc6">=</span><span style="color:#64ab8f">2</span>(同一机架上的不同节点)        
    Distance(/d1/r1/n1, /d1/r2/n3)<span style="color:#b8bfc6">=</span><span style="color:#64ab8f">4</span>(同一数据中心不同机架上的节点)    
    Distance(/d1/r1/n1, /d2/r3/n4)<span style="color:#b8bfc6">=</span><span style="color:#64ab8f">6</span>(不同数据中心的节点)
​
    带宽依次递减。
<span style="color:#da924a">##2. 机架感知(重点)</span>
    使用机架感知,必须配置相关属性,以及多台机器,否则所有机器都会被注册到同一个机器上,名字为/default-rack.如果使用了机架感知策略,那么文件块的副本是如何存储的?
​
  <span style="color:#7575e4">--1</span>.hadoop2.8.2版本之前的版本机架感知策略(副本冗余策略)如下:
     (1)第一个副本,如果client在某一个datanode上,就存储在本地上,如果client不是datanode,就随机一个机架中的一个datanode进行存储
     (2)第二个副本, 存储位置是与第一个副本同一个机架不同datanode上
     (3)第三个副本,存储位置是不同机架上的任意一个datanode上
  <span style="color:#7575e4">--2</span>.hadoop2.8.2版本之后的版本机架感知策略(副本冗余策略)如下:
     (1)第一个副本,如果client在某一个datanode上,就存储在本地上,如果client不是datanode,就随机一个机架中的一个datanode进行存储
     (2)第二个副本, 存储位置是不同机架上的任意一个datanode上
     (3)第三个副本,存储位置是与第二个副本同一机架上的不同datanode上</span></span>

1.6 集群工作节点的动态上下线

1.6.1 动态上线

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#da924a"><!--1. 准备工作:--></span>
    准备一台配置了jdk和hadoop的新主机qianfeng04。如果克隆的话,别忘记删除${hadoop.tmp.dir}指定的目录和logs目录
​
​
<span style="color:#da924a"><!--第一步:修改dfs.hosts属性,指定文件include的全路径--></span>
​
<span style="color:#999977"><</span><span style="color:#7df46a">property</span><span style="color:#999977">></span>
    <span style="color:#999977"><</span><span style="color:#7df46a">name</span><span style="color:#999977">></span>dfs.hosts<span style="color:#999977"></</span><span style="color:#7df46a">name</span><span style="color:#999977">></span>
    <span style="color:#999977"><</span><span style="color:#7df46a">value</span><span style="color:#999977">></span>/usr/local/hadoop/etc/hadoop/include<span style="color:#999977"></</span><span style="color:#7df46a">value</span><span style="color:#999977">></span>
<span style="color:#999977"></</span><span style="color:#7df46a">property</span><span style="color:#999977">></span>
注意:include这个文件名,可以自定义。
​
<span style="color:#da924a"><!-- 第二步:将待上线的主机名(qianfeng04)添加到dfs.hosts指定的文件内:--></span>
[root@qianfeng01 hadoop]# vi /usr/local/hadoop/etc/hadoop/include
qianfeng01
qianfeng02
qianfeng03
qianfeng04   将要上线的主机名
​
注意:dfs.hosts指定的文件中必须存储所有的在线主机名
​
​
<span style="color:#da924a"><!-- 第三步:在namenode上刷新节点:--></span>
[root@qianfeng01 hadoop]# hadoop dfsadmin -refreshNodes。
通过hadoop dfsadmin -report 或者web界面,可以看到, 多了一个节点,但是此节点是dead状态
​
<span style="color:#da924a"><!-- 第四步:在要上线的节点上重启 datanode --></span>
[root@qianfeng01 hadoop]# hadoop-daemon.sh start datanode.
可以通过hadoop dfsadmin -report 或者web界面,可以看到, 节点已经上线。
​
<span style="color:#da924a"><!-- 第五步:最后修改slaves,添加上新主机名。以便集群重启时,带上此节点。 --></span>
[root@qianfeng01 hadoop]# vi slaves
qianfeng01
qianfeng02
qianfeng03
qianfeng04</span></span>

1.6.2 动态下线

<span style="background-color:#333333"><span style="color:#b8bfc6"><span style="color:#da924a">## 1. 添加属性</span>
<property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
<span style="color:#da924a">## 2. 创建相关文件,添加要下线的主机名</span>
[root@qianfeng01 hadoop]<span style="color:#da924a"># vi /usr/local/hadoop/etc/hadoop/exclude</span>
qianfeng01
​
<span style="color:#da924a">## 3. 刷新节点:  让namenode识别要下线的机器,并做迁徙工作,迁徙工作完成后,相应的datanode会转为已退役装</span>
[root@qianfeng01 hadoop]<span style="color:#da924a"># hdfs dfsadmin -refreshNodes</span>
​
<span style="color:#da924a">## 4. 使用命令或者是脚本关闭已退役的datanode</span>
[root@qianfeng01 hadoop]<span style="color:#da924a"># hadoop-daemon.sh stop datanode </span>
​
<span style="color:#da924a">## 5. 要将slaves文件中的相应的主机名移除,为避免下一次重启还去启动这个机器。</span>
​
​
注意:实际生产环境中,slaves文件,要同步到其他机器上。</span></span>

九、hdfs的api

<span style="background-color:#333333"><span style="color:#b8bfc6">api参考代码或者是文档
注意:获取文件状态信息的api是最重要的</span></span>

十、读写流程(重点)

3.1 读流程

<span style="background-color:#333333"><span style="color:#b8bfc6">1. 客户端获取DistributedFileSystem对象 ,调用open方法,准备读取一个文件
2. namenode收到读请求后,会校验是否有权限,读取文件路径是否存在等操作,如果通过检验,会返回一个输入流对象
   以及文件的所有块的所有副本的位置信息
3. 客户端准备调用输入流的read方法读取数据,先将第一个块的三个位置由近及原的排序,选择最近的副本开始循环调用read方法读取数据
4. 当块读完后,会断开与该datanode的连接,继续寻找下一个块的最佳读取位置读取数据,直到整个文件读取完毕。
5. 调用输入流的close方法关闭流,以及向namenode汇报读取流程结束。
​
​
注意: 如果读取过程中,出现机器宕机,会选择该块的两外两个副本的最佳位置,开始重新读取该块的数据,并标记宕机的那个机器节点,防止其他的读取操作再次来到该节点(做无用功)。读取过程中,也会进行校验和确认数据是否完整,如果不完整,也会选择其他的副本重新读取。</span></span>

3.2 写流程

<span style="background-color:#333333"><span style="color:#b8bfc6">1. 客户端获取DistributedFileSystem对象
2. 调用分布式文件系统对象的create方法,表示要创建文件路径
3. namenode会对客户端是否有权限,目录是否已经存在等进行校验,如果校验通过,则返回一个输出流对象,并返回第一个块的三个datanode的信息
4. 客户端先将三个datanode节点组成一个socket通信的pipeline。由近及远的顺序。
5. 客户端将本地数据读入内存,封装成多个chunk(512byte)和checksum(4byte),然后再将多个chunk和checksum封装成一个packet(64kb)。
6. 客户端调用输出流的write方法,将每一个packet写入管道的第一个节点的内存中,第一个节点再传入第二个节点内存,第二个节点再传入第三个节点内存。
    三个节点都要进行向客户端进行ack应答,表示存储成功。
7. 客户端会源源不断的向管道书写packet,当累计到一个块大小128M时,会断开该管道,重新向namenode申请下一个块的三个datanode信息。重复上述操作。直到文件的最后一个块完成写出。调用close方法关闭输出流。再与namenode进行通信,表示上传成功。namenode重新维护元数据。
​
​
​
​
​
细节:
    写流程涉及到两个队列和两个线程
          dataqueue--->dataStreamer
          dataqueue:用来存储客户端封装好的packet
          dataStreamer:将dataqueue中的每一个头元素packet拷贝pipeline中,并移除到ackqueue队列
          
          
          ackqueue---->responseStreamer
          
       ackqueue: 用来记录正在管道中的所有的packet
       responseStreamer:用来接收ack信息,如果三个节点都ack成功,就会将ackqueue中的该packet删除。</span></span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值