HDFS文件的读写流程

news/2024/5/20 4:51:34 标签: hdfs, hadoop, 大数据

Hadoop

HDFS的读写文件流程

HDFS写文件流程

  1. 客户端通过Distributed FileSystem模块向NameNode请求上传文件(hadoop fs -put 文件名 文件路径 )

    1. 判断该客户端是否有写入权限
    2. NameNode检查目标文件是否已存在,父目录是否存在。
  2. NameNode返回是否可以上传(不满足上述直接报错)。

  3. 客户端请求第一个 Block上传到哪几个DataNode服务器上。

    1. 根据副本放置策略,负载均衡,机架感知以及网络拓扑图获取.

      副本放置策略:

      ​ 第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢,CPU不太忙的节点上;
      ​ 第二副本:放置在于第一个副本不同的机架节点上;
      ​ 第三副本:与第二个副本相同机架的不同节点上;
      ​ 如果还有更多的副本,则随机放在节点中。

  4. NameNode返回3个DataNode节点,假设分别为dn1、dn2、dn3。

  5. 数据逻辑切块

    物理切块:真实的切分,将200M切分为128M+72M。两个块会分别存储
    逻辑切块:可以理解为切分前的准备,每个块128M,计算出需要切分成几个块(切块规划)

  6. 客户端通过FSDataOutputStream模块请求dn1上传数据(与dn1请求链接),dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

  7. dn1、dn2、dn3逐级应答客户端。

  8. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet(默认64k)为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

    此时开始物理切片

  9. 当一个Block传输完成之后,上传通道关闭,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)

  10. 所有数据上传成功后,会向客户端返回上传结果,客户端向NameNode返回信息,告知数据上传成功。

  11. 上传失败的处理

    1. 文件上传过程中如果有一个节点的块上传失败,那么hdfs会立即进行一次重试,如果重试还是失败,则会将失败的节点从pipeline中剔除,并将失败的节点报告给namenode
    2. hdfs可以忍受的极限是至少有一个节点上传成功,如果3个节点都失败,则会重新向namenode申请3个节点,重新构建数据通道,最终是保证至少有一份上传成功,其他的副本会在集群空闲的时候进行异步复制

HDFS读文件流程

  1. 客户端向Namenode请求下载文件(hadoop fs -get 文件 )

  2. Namenode接受到客户端的请求

    1. 判断该客户是否有写入的权限
    2. 判断该文件是否存在
  3. client(客户端)根据Namenode返回Datanode队列,并行的从这些Datanode中读取block块的数据

    1. 就近原则返回DataNode
  4. 上述block块内容读取完毕后,会继续访问Namenode剩余部分或者全部的block块的地址,然后并行读取,(以packet为单位来做校验),直至所有的block读取完成

    第一个块下载成功之后会生成一个 crc文件,和上传时候的.meta文件进行完整度校验

    校验内容:起始偏移量和末尾偏移量之间的内容
    校验通过则认为第一个块下载成功

  5. 按照block的信息(编号等),将这些block块组合成一个完整文件,至此HDFS读数据完成

  6. 下载出现异常

    1. 数据块的某一个节点读取不到数据的时候会向namenode进行汇报,namenode就会标记这个节点可能是问题节点(以后下载时,就会将这个 问题节点返回的优先度下降),接着客户端继续读取这个块的其他节点
    2. 块下载失败会有3次尝试重新下载的机会,如果块过多的,NameNode会分批次返回块信息

补充:HDFS文件块大小

HDFS块的大小是指在HDFS中存储一个文件时,将文件分成多少个块,并且每个块的大小是多少。在HDFS中,块的大小通常是64MB或128MB。这个大小是可以配置的,但需要注意的是,块的大小不应该设置得太小,因为块的数量会增加,而且设置太小,会增加寻址时间,程序一直在找块的开始位置.但是,块的大小也不应该设置得太大,因为这会增加数据丢失的风险,如果一个块出现故障,整个块都需要重新传输,这会导致数据恢复的时间变长,而且从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率。

  1. HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数( hdfs-site.xml文件中的dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。

  2. 如果在系统运行过程中修改了dfs.blocksize属性的值,那么这个修改只对新文件起作用,对于已经存在的文件不会产生影响。

  3. 块大小的计算方式

    1. 如果寻址时间约为10ms,即查找到目标block的时间为10ms。
    2. 寻址时间为传输时间的1%时,则为最佳状态,因此,传输时间=10ms/0.01=1000ms=1s
    3. 而目前磁盘的传输速率普遍为100MB/s。,所以block大小=1s*100MB/s=100MB

http://www.niftyadmin.cn/n/4997914.html

相关文章

python如何求两list的公共区域

如何求两list的公共区域 对于列表(List),要求它们的公共区域,你可以使用列表推导式和集合交集的方法来计算。具体步骤如下: list1 [1, 2, 3, 4, 5] list2 [3, 4, 5, 6, 7]# 使用列表推导式获取列表的交集 common_e…

vim 替换命令 “:s“

vim 替换命令 ":s" 1. 替换光标所在行的第一个匹配串2. 替换光标所在行全部匹配项3. 替换两行之间每行的第一个匹配项4. 替换两行之间的全部匹配项5. 替换整个文件中的每个匹配串6. 查找整个文件中的每个匹配串并询问是否替换 1. 替换光标所在行的第一个匹配串 命令…

Volatile 关键字提供的可见性

/*** 类说明:演示Volatile的提供的可见性*/ public class VolatileCase {// 说明:当ready没有volatile修饰时,执行结果是PrintThread线程一直处于被挂起状态,子线程感知不到主线程中的变量// 当ready被volatile修饰时,…

一、了解[mysql]索引底层结构和算法

目录 一、索引1.索引的本质2.mysql的索引结构 二、存储引擎1.MyISAM2.InnoDB3.为什么建议InnoDB表要建立主键并且推荐int类型自增?4.innodb的主键索引和非主键索引(二级索引)区别5.联合索引 一、索引 1.索引的本质 索引:帮助mysql高效获取数…

go语言基础操作--二

a : 10str : "mike"//匿名函数,没有函数名字 形成一个闭包,函数定义,还没有调用f1 : func() { //:自动推到类型fmt.Println("a ", a)fmt.Println("str ", str)}f1()//给一个函数类型起别名 这个写法不推荐type FuncType …

QT 设置应用程序图标

1.下载xx.ico图标:ico网址 2.在线PNG转换ICO:png在线转换ico 3.添加图标资源 1)新建文件路径 2)添加图片资源 3)在 .pro文件里面添加图片 4)将xx.ico放到工程目录,编译完可以看到xx.exe的图标…

CDH6.3.2集成Kerberos

CDH6.3.2集成Kerberos 一.参考doc CDH enable kerberos: Kerberos Security Artifacts Overview | 6.3.x | Cloudera Documentation CDH disable kerberos:https://www.sameerahmad.net/blog/disable-kerberos-on-CDH; https://community.cloudera.com/t5/Support-Questions…

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念:规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件;线性规划即以线性函数为目标函数&a…