Hadoop学习10:数据流(hadoop3.1.3)

Hadoop学习10:数据流(hadoop3.1.3),第1张

Hadoop学习10:数据流(hadoop3.1.3)

    • 1 写数据流程
      • 1.1 写数据流程图解
    • 2 节点距离计算
      • 2.1 实例图
      • 2.2 原理与实例
    • 3 副本存储节点
      • 3.1 集群示例图
      • 3.2 实例概述
    • 4 读数据流程图解

1 写数据流程 1.1 写数据流程图解

  1. 在客户端上通过创建DistributedFileSystem对象进行 *** 作数据
 uri = URI.create("hdfs://192.168.153.131:8020");
 conf = new Configuration();
 user = "cxj";
// fs为DistributedFileSystem对象
 fs = FileSystem.get(uri, conf, user);
  1. 在数据上传前,向NameNode请求上传文件/user/atguigu/ss.avi(假定上传200M的该内容)
 FileInputStream fis = new FileInputStream(new File("C:\Users\cxj\Desktop\ss.avi"));

 FSDataOutputStream fos = fs.create(new Path("/user/atguigu/ss.avi"));

// 数据拷贝到HDFS存储
 IOUtils.copyBytes(fis, fos ,conf);
 IOUtils.closeStream(fis);
 IOUtils.closeStream(fos);

  1. NameNode响应可以上传文件

  2. 请求上传第一个Block (0-128M),请返回DataNode

  3. 返回dn1,dn2, dn3节点(假设只有三个DataNode的节点), 表示采用这三个节点存储数据

  4. 客户端可以通过FSDataOutputStream将输入的FileInputStream流转换成对应的HDFS相关的输出流,然后再进行资源的拷贝

  5. 客户端会查找传输距离最短的服务器。并请求建立数据传输通道,并且客户端只负责请求离他距离最近的节点(数据传输的距离),后续的就由节点负责,例如上述中dns1负责dns2,dns2负责dns3

  6. 假设这里是dns1离客户端的传输距离最短,那么客户端只负责将数据传输到dns1,然后dns1负责后续的数据传递,如上图dns1将数据传递给dns2,再然后是dns2传递到dns3,从客户端到dns3`三个节点的信息传递的逻辑组成一个通道

  7. 信息的传递不是将整一个128M的信息完全传递(这里假设第一个数据块是128M),而是分数据包进行传递,数据包大小一般是64kb(数据包包括实际传输的数据以及数据的检验和),数据包传输到节点之前是存在DataQuene中,也就是数据队列中,当进行数据传输时,由DataStream从DataQuene进行取出数据包,然后传递给第一个节点,当数据包传递到具体的节点的时候,就会被存储到缓冲区之中,然后等待缓冲区满了再写进磁盘中

  8. 数据包被DataStream从DataQuene拿出数据包后就放到ACKQuene,当数据传输完成,节点会通过数据通道进行数据的应答,应答后的数据包经验证从ACKQuene中删除

  9. 没有应答的数据包会重新从ACKQuene回到DataQuene,并且建立新的通信通道,从而防止数据包传递过程中的丢包以及节点连接断开的情况

  10. 数据传输完成进行应答。重复上述过程,一直到整个数据块传输完成

数据传输过程中,如果存在某个节点不可用,那么最终数据的存储的副本数,就会比设置的要少,这个少的副本将会在后续由NameNode进行补全,所以至少有一个节点完成传输,那么就可以产生同样数量的副本

  1. 下一个数据块继续从4开始
2 节点距离计算

之类就是解决上文中,例如由客户端寻找最近距离的节点的问题。也就是如何衡量机器与机器之间的距离

2.1 实例图

2.2 原理与实例

说明:图上每一个颜色块可以看做一个节点,上方的颜色块可以看做是下方的父节点,那么层次关系就是:橙色块→集群d1蓝色快、集群d2绿色快→黄色快机架、蓝色块机架该结构就是一个局部的小型网络的拓扑结构图

计算规则:距离计算规则是表示两个机器到共同汇合点一个量的和,例子如下

  1. Distance(/d1/r1/n0, /d1/r1/n0)=0 (同一节点上的进程)

    表示从d1集群上r1机架的n0机器到d1集群上r1机架的n0机器,因为同一个机器,那么距离就是0

  2. Distance(/d1/r1/n1, /d1/r1/n2)=2 (同一机架上的不同节点)

    表示从d1集群上r1机架的n1机器到d1集群上r1机架的n2机器的距离是2

    同一个机架,但是不同的机器,那么汇合点就是相当于父节点的d1,二者都找到d1,就能回去对方的信息,从n0到d1距离是1,n2也同样,那么和就是2,所以距离就是2

  3. Distance(/d1/r2/n0, /d1/r3/n2)=4 (同一数据中心不同机架上的节点)

    表示从d1集群上r2机架的n0机器到d1集群上r3机架的n2机器
    的距离是4

    因为不同机架也不同机器节点,二者汇合在集群d1上,那么机架r2上机器n0首先是找到r2距离是1,然后再由r2找到d1,距离也是1,总距离就是2,对于d3上的n2也是同样的,总距离是2,那么二者距离之和就是4

4.Distance(/d1/r2/n1, /d2/r4/n1)=6 (不同数据中心的节点)

表示从d1集群上r2机架的n0机器到d2集群上r4机架的n1机器的距离是6

二者不同集群,那么汇合点就是最顶层的橙色节点,那么集群d1的机架r2的n1节点找到橙色节点距离就是3,对于r4的n1也是3,那么总距离就是6

3 副本存储节点 3.1 集群示例图

3.2 实例概述

假设设置的副本数是3,例如咋hdfs-site.xml中设置dfs.replication为3或者不设置默认就是3,那么三个副本存储的策略如下

  1. 如果当前进行客户端 *** 作的节点同时也是一个DataNode那么第一个副本在Client所处的节点上。如果客户端在集群外,随机选择一个DataNode进行存储
  2. 第二个副本随机选择一个远程的机架,然后随机选择一个节点。例如第一个副本存储在机架r1上的n0,那么第二个副本就可以选择r2或者r3
  3. 第三个副本在第二个副本所在机架的随机节点

以上是hadoop3.1.3的副本选择策略,对于hadoop2.7.6,第一个节点选择策略是一样的,第二个副本是在第一个节点同一机架的上随机的一个节点,第三个副本就是不同于前两个副本的一个机架上的一个随机节点

这么选择是兼容距离以及容错率的,要是都放一个机架,虽然距离近了,但是容错率低,一个机架坏了,就会所有副本都失效,所以需要分机架存放,然后兼容距离产生上述的同一支架放置以及客户端相关性的防止策略

4 读数据流程图解

  1. 在客户端上通过创建DistributedFileSystem对象进行 *** 作数据
 uri = URI.create("hdfs://192.168.153.131:8020");
 conf = new Configuration();
 user = "cxj";
// fs为DistributedFileSystem对象
 fs = FileSystem.get(uri, conf, user);
  1. HDFS客户端在读取前进行询问NameNode相关的元信息,NameNode存储的相关的HDFS目录信息以及相关的文件的元数据,在客户端询问后就进行返回相关的信息
 FileInputStream fis = new FileInputStream(new File("C:\Users\cxj\Desktop\ss.avi"));

 FSDataOutputStream fos = fs.create(new Path("/user/atguigu/ss.avi"));

// 拷贝下载
 IOUtils.copyBytes(fis, fos ,conf);
 IOUtils.closeStream(fis);
 IOUtils.closeStream(fos);
  1. 客户端根据返回的相关块信息去寻找需要的块,他会寻找存储了该块的最近的节点,进行请求数据块,然后节点进行应答并返回块信息

对于设置的副本数小于总的DataNode的节点数,会按上文的副本分配策略进行分配,客户端的所有数据块可能存储在不同的节点上

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5653501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存