【大数据入门笔记系列】第三节 Hdfs读、写数据处理流程

  • Hdfs简介
  • 写数据处理流程
  • 读数据处理流程
  • 后记
  • 跳转

Hdfs简介

一般而言,Hdfs是由一个NameNode节点和若干个DataNode节点组成(非高可用,高可用还有一个SecondNameNode)。

  • NameNode:管理分布式文件系统的元数据,这些元数据是一些诸如描述文件的存储路径以及block具体在哪些DataNode上的具体位置等;
  • DataNode:DataNode节点用来保存文件数据块(block),它只负责接受存储、查询发送文件,不负责文件的切块;
  • 文件切割:文件的切割默认是以128M为标准(该数值可通过参数设定),小于该标准的文件不切割,超过该标准的文件会被切成若干个block块;一个文件切割出来的多个block在存储时,每个block的存储地址都由NameNode决定,当一个block存储完毕后,下一个block要重新向NameNode申请存储地址;这些被切割出来的block块会根据replication(复制因子)复制出多个副本,且副本存放在不同的DataNode上;
  • 汇报机制:DataNode会定时向NameNode汇报自身的block信息,NameNode会负责保存这些DataNode汇报上来的元数据,并保存文件的副本数量,一旦副本数量不满足复制因子规定的数目,则NameNode会指定一台DataNode(没有改副本的节点)从有该副本的DataNode上拷贝(一个副本ID在一台DataNode上有且仅有一份);
  • 容错机制:如果存在DataNode宕机,那么当集群中的DataNode出发定时向NameNode汇报时,NameNode就会得知哪些机器宕机了,统计完副本分布情况之后,NameNode就知道哪些副本少了,于是NameNode就负责寻找一个没有这个副本节点从有这个副本的DataNode上拷贝一份(一个副本ID在一台DataNode上有且仅有一份);
  • 客户端请求方式:Hdfs的内部工作机制对客户端保持透明,客户端请求访问Hdfs都是通过NameNode申请实现的。

写数据处理流程

假设有一台NameNode和4台DataNode(非HA),我们的文件上传客户端可以在任何地方,前提是客户端能够与NameNode、DataNode连接。

一个大文件现在客户端进行分割,然后向NameNode请求上传block到指定文件夹,比如如下上传命令:

hadoop dfs -put 9F83F0668.mp4 /test/9F83F0668/

NameNode首先会看上传目标文件夹,然后它会去查询内部元数据该路径存在不存在,跟据查询结果会存在以下几种情况:

  • 路径“/test/9F83F0668/”不存在
    创建路径“/test/9F83F0668/”,符合文件上传条件。
  • 路径“/test/9F83F0668/”存在,该路径下存在文件“9F83F0668.mp4”
    返回文件已存在,不符合文件上传条件(此举是为了方式覆盖文件)。
  • 路径“/test/9F83F0668/”存在,该路径下不存在文件“9F83F0668.mp4”
    符合文件上传条件。

如果符合文件上传条件,就意味着我们的客户端可以向Hdfs上传文件,这个时候客户端还不知往哪儿传送数据,客户端通过rpc请求上传一个block,NameNode分配三台DataNode(假设我们的复制因子为3)。

这里交代一下NameNode分配存储节点DataNode的机制:

  • 第一台DataNode
    第一台DataNode的分配规则是考虑节点的存储空间以及与NameNode的距离,优先选择存储空间大且离NameNode近的节点(因为第一台DataNode要实时向NameNode汇报,所以第一台择优分配);
  • 第二台DataNode
    第二台DataNode的分配规则是优先选择存储空间大且离NameNode远的节点(处于安全考虑);
  • 第三台DataNode
    第三台DataNode的选择标准与第一台DataNode一致,优先选择存储空间大且离NameNode近的节点;
    当客户端拿到了存储对象(即NameNode传递过来的信息),解析一下就明白了上传地址在哪儿,于是它便尝试与DataNode1建立流(通道),执行以下流程:

    1. 客户端首先向DataNode1发送请求建立block传输通道channel,同时告诉DataNode1客户端还要发送block至DataNode2、DataNode3处;
    2. DataNode1接到DataNode1的请求,知道还要向DataNode2、DataNode3传输数据,DataNode1向DataNode2发送请求建立channel,并告诉DataNode2还要向DataNode3传输block;
    3. DataNode2接到DataNode1的请求后,知道还要向DataNode3传输block,于是向DataNode3发送建立channel请求;
      4)DataNode3接到DataNode2的请求之后,知道自己是最后一个,没有其他要存储的节点了,于是返回应答给DataNode2,表示DataNode2与DataNode3之间的通道建立;
      5)同理DataNode2返回应答给DataNode1,表示DataNode1与DataNode2之间的通道建立;
      6)DataNode1再返回应答给客户端,至此整个文件传输通道建立完成,开始写数据。

客户端与DataNode1之间建立的连接管道名为pipeline,值得注意的是这个大小为“128M”的block块在往DataNode1上写的时候不是一次性传输的,而是又分成一个个packet数据包进行传输(默认64K),DataNode1每收到一个64k大小的packet包都要先验证其正确性,如果没有传输错误那就写到自己的文件目录下,在校验packet正确性和本地的过程之间还存在一个缓冲区,这个缓冲区向DataNode1自身的文件系统写校验正确的packet,同时向DataNode2发送该packet,DataNode2上面发生的事情和DataNode1上一样(也校验、进入缓冲区),DataNode3同理(校验、进入缓冲区,不发送了直接写入)。
宏观上看,客户端向DataNode1、DataNode2、DataNode3传输block的过程几乎是同步的,只会有一两个packet的差别。

  • 那么传输过程如果校验失败了怎么办?
    每一个节点收到前驱传来的packet包之后,都会向它的前驱应答,前驱再向前驱应答,以此类推,如果packet在DataNode1就失败了,那么客户端会重新向NameNode申请该block的存储地址(NameNode的小本本也会记下这几台性能不是很可靠的机器,下次不优先分配),如果packet在DataNode2或者DataNode3上失败,但是DataNode1传输成功这也不打紧,因为有NameNode的存在,NameNode会异步地从DataNode1上复制出错的packet到相应失败的节点上(NameNode依旧会在小本本上记下这些不可靠的机器,下次不优先分配)。
    等到一整个block传输成功以后,下一个block的传输过程一样是先请求NameNode分配存储地址(重新分配的地址可能是一样的,但是上一个block传输建立的pipeline不能够复用,必须重新请求建立),如此往复完成整个大文件“9F83F0668.mp4”的存储,整个过程会被NameNode记录下来,记录的数据就称为元数据。

    注意:DataNode在校验packet的传输正确性的时候并不是以64k为单位校验一次,而是以一个chunk(512byte)为单位校验一次。

读数据处理流程

假设有一台NameNode和4台DataNode(非HA),我们的读取数据客户端可以在任何地方,前提是客户端能够与NameNode、DataNode连接。

客户端向Hdfs发送请求下载路径“/test/9F83F0668/”下的9F83F0668.mp4,保存到本地的“/home/jack_roy/”路径下,命令如下:

hadoop dfs -get /test/9F83F0668/9F83F0668.mp4 /home/jack_roy/

==假设在Hdfs上9F83F0668.mp4的副分布在DataNode1、DataNode2、DataNode3、DataNode1上,我们的下载请求连接这四个节点,==现客户端向Hdfs读数据(下载文件)流程如下:

  • 首先,客户端先去找NameNode,向NameNode发送rpc请求,请求下载“/test/9F83F0668/9F83F0668.mp4 ”;
  • NameNode内维护的有一块元数据区域,该区域记录了以前存储在整个分布式文件系统里的文件的相关元数据信息,NameNode找到“/test/9F83F0668/9F83F0668.mp4 ”分成了哪几个block块、各个block块在相应节点上的存储路径等元数据信息;
  • NameNode将元数据信息发送给客户端,客户端得知自己要下载的文件的第一个block块在哪些DatNode上,寻找条件最优的节点(对于“hadoop dfs -put ”命令来说,就是选择与客户端距离最近的节点,比如block在本地有,则优先从本地取该block)请求建立channel(管道),这里我们假设第一个block块的最优下载节点是DataNode1;
  • DataNode1收到请求以后,找到自己文本区域下存储的block块,然后初始化一个FileinputStream来读取该block块,同时它也相应客户端建立管道(NioSocket通信);
  • DataNode1在做好准备后,开始向管道输入流,该输入流通过SocketOutpuStream(端口输出流)实现;
  • 客户端通过端口输入流SocketInpuStream接受,再由FileOutputStream写入到本地建立的文件目录中,来存储该block块(本地文件夹若不存在,则在NioSocket建立成功时建立);
  • 待第一块block传输完成之后,再去寻找第二块block的最优存储节点,过程同理;
  • 剩余的block块传输过程同理,直至将“/test/9F83F0668/9F83F0668.mp4 ”完全下载至本地。


注意:以上传输过程依旧是以packet(64K)为单位传输,客户端本地缓存,然后写入目标文件。

后记

对Hdfs读、写数据处理流程的理解交代完了,后面再交代NameNode的元数据机制,个人理解恐有失偏颇,欢迎留言指正。

跳转

目录

【大数据入门笔记系列】第三节 Hdfs读、写数据处理流程相关推荐

  1. 【大数据入门笔记系列】第六节 分布式计算框架MapReduce的工作流程

    [大数据入门笔记系列]第六节 分布式计算框架MapReduce的工作流程 前言 MapReduce分布式运算 MapReduceApplication MapTask ReduceTask split ...

  2. 【大数据入门笔记系列】第一节 大数据常用组件

    [大数据入门笔记系列]第一节 大数据常用组件 大数据释义 大数据组件 跳转 大数据释义 近些年来,坊间一直流传着这样的言论:"大数据时代,人人都在裸奔".对于外行人来说,对于&qu ...

  3. 大数据入门基础系列之初步认识大数据生态系统圈(博主推荐)

    不多说,直接上干货! 之前在微信公众平台里写过 大数据入门基础系列之初步认识hadoop生态系统圈 http://mp.weixin.qq.com/s/KE09U5AbFnEdwht44FGrOA 大 ...

  4. 大数据入门教程系列之Hive内置函数及自定义函数

    本篇文章主要介绍Hive内置函数以及自定义UDF函数和UDFT函数,自定义UDF函数通过一个国际转换中文的例子说明. 操作步骤: ①.准备数据和环境 ②.演示Hive内置函数 ③.自定义UDF函数编写 ...

  5. 大数据入门笔记(三)

    为什么80%的码农都做不了架构师?>>>    HDFS( Hadoop Distributed File System) hadoop分布式文件系统 总的设计思想: 分而治之 -- ...

  6. 《黑马程序员2023新版黑马程序员大数据入门到实战教程,大数据开发必会的Hadoop、Hive,云平台实战项目》学习笔记总目录

    本文是对<黑马程序员新版大数据入门到实战教程>所有知识点的笔记进行总结分类. 学习视频:黑马程序员新版大数据 学习时总结的学习笔记以及思维导图会在后续更新,请敬请期待. 前言:配置三台虚拟 ...

  7. 大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门到熟练操作)

    系列博客 1.大数据技术之Hadoop完全分布式集群搭建+Centos7配置连通外网和主机 2.大数据技术之Hadoop编译源码 3.大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门 ...

  8. 大数据入门-五分钟读懂HDFS

    目录 大数据入门系列文章 一.概念 二.架构及组件概念 三.读写流程 四.大白话 五.其他 大数据入门系列文章 最近在收集整理大数据入门文章,各位盆友关注点赞不迷路,每天都要开心鸭! 大数据入门系列文 ...

  9. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略

    大数据处理当中,数据储存始终是一个重要的环节,从现阶段的市场现状来说,以Hadoop为首的大数据技术框架,仍然占据主流地位,而Hadoop的HDFS,在数据存储方面,仍然得到重用.今天的大数据入门分享 ...

最新文章

  1. 不知道发这些有啥用!多分享些技术噻...
  2. arduino项目_quot;Arduino智能车项目quot;实战班开班!
  3. html 纯css 树形结构,纯css实现树形结构方法教程
  4. mysql null的作用_MySQL中对于NULL值的理解和使用教程
  5. 浙江省计算机网络技术比赛,[2018年最新整理]0509浙江省三级计算机网络技术历年真题(含答桉).doc...
  6. PHP运行环境之IIS FastCGI 进程意外退出解决办法
  7. 参考信息 - 云原生(Cloud Native)
  8. 可用性高达五个9!支付系统高可用架构设计实战
  9. OpenCV的DNN模块
  10. [Bzoj2049][Sdoi2008]Cave 洞穴勘测
  11. Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you‘re try
  12. 表单美化+html+css
  13. Windows Server 2019系统Windows defender误删文件的解决办法
  14. android手机邮件Exchange账户的设置
  15. IIS 无法启动:发生意外错误0x8ffe2740 的原因
  16. 计算机考试音乐怎么粘贴,用手机或电脑怎样剪切和接音乐?
  17. 12306候补购票功能怎么用?抢票软件依旧能抢到票
  18. java毕业设计KTV点歌系统mybatis+源码+调试部署+系统+数据库+lw
  19. macOS 10.13 安装允许任何来源没了怎么开启
  20. Altium Designer学习

热门文章

  1. 08级学生毕业论文辅导
  2. 解决Visual C++ Redistributable for Visual Studio 2015的安装问题
  3. 广播泛洪_这三种类型的报文,交换机会进行泛洪:广播、组播、未知单播
  4. syn泛洪 过滤_开启路由器的TCP拦截?防止SYN泛洪攻击
  5. 旅行摄影必备调色预设,简直就是神仙款啊
  6. 电脑e盘不见了怎么恢复?6个步骤找回e盘
  7. 三相电路线电压(电流)与相电压(电流)的关系
  8. 四国军棋界面开发(2) 让棋子动起来
  9. rk3288 设置imx6ull的lcd控制器的寄存器
  10. 葛底斯堡演说 只出现一次单词