HDFS是啥玩意儿?有啥特点?读写流程介绍一下

HDFS全称Hadoop Distributed File System,看名字就知道是Hadoop生态的一个组件,它是一个分布式文件系统。
它的出现解决了独立机器存储大数据集的压力,它将数据集进行切分,存储在若干台计算机上。

HDFS 的特点与应用场景

  • 适合存储大文件

HDFS 支持 GB 级别甚至 TB 级别的文件,它会把大文件切分成若干个块存储在不同的节点上,在进行大文件读写时采用并行的方式提高数据的吞吐量。

  • 容错性高

HDFS有多副本机制,它会自动保存副本到不同的节点。即使有一台节点宕机了也不会丢失数据。

  • 适用于流式的数据访问

HDFS 适用于批量数据的处理,不适合交互式处理。它设计的目标是通过流式的数据访问保证高吞吐量,不适合对低延迟用户响应的应用。

  • 适用于读多写少场景

HDFS 中的文件支持一次写入、多次读取,写入操作是以追加的方式(append)添加在文件末尾,不支持对文件的任意位置进行修改。

HDFS的相关概念

  • 数据块(Block)

和磁盘的数据块概念相似,磁盘中的块是数据读写的最小单位,而HDFS中文件被切分成多个块,作为独立的存储单元,但是比磁盘的块大得多,默认为128MB,且小于一个块大小的文件不会占据整个块的空间。
需要说明的一点是,数据块不能设置太小,否则在查找的过程中会造成寻址时间长,导致效率慢;另一方面,数据块太小会造成很多小文件,进而造成元数据也更多,占用内存就更多。

  • NameNode和DataNode

HDFS中由NameNode和DataNode组成Master-Slave模式(主从模式)运行,NameNode负责管理文件系统的命名空间和文件元数据,记录了每个文件中各个块所在的数据节点信息,而DataNode则是HDFS中的工作节点,负责存储数据和读写操作。简单理解就是NameNode是主管,DataNode是负责干活的工人。

  • Secondary NameNode

若NameNode故障,文件系统上的文件将会丢失,因此对NameNode实现容错很重要,Hadoop中提供了两种容错机制,一种是备份那些组成文件系统元数据持久状态的文件;另一种就是用Secondary NameNode.
需要注意的是,Secondary NameNode运行在独立的计算机上,它只是一个辅助而不是一个备用,它不能被用于NameNode。它用于定期合并编辑日志和命名空间镜像,防止编辑日志过大,在NameNode发生故障时启用。

  • 块缓存

DataNode进行读写操作,一般是从磁盘读取,但对于读取频繁的文件,可以被缓存在DataNode的内存中,以提高读操作的性能。

HDFS 架构

图片说明

Namenode管理元数据;Datanode存储Block;Block有多个副本存在不同的节点;节点可以放在不同的机架(Rack);客户端通过与Namenode与Datanode交互读取数据(具体的读写流程后面讲)

机架感知和副本机制

通常,大型Hadoop集群会分布在很多机架上。
一般为了提高效率,希望不同节点之间的通信尽量发生在同一个机架之内,而不是跨机架。
另外为了提高容错能力,尽可能把数据块的副本放到多个机架上。
机架感知并不是自动感知的,而是需要管理者告知集群实现的。
以一个三副本为例,HDFS机架感知和副本机制大概如图所示
图片说明

读写流程

读操作

  • 简要流程:
    1、客户端向NameNode发起读数据请求;
    2、NameNode响应请求并告诉客户端要读的文件的数据块位置;
    3、客户端就近到对应DataNode取数,当数据读取到达末端,关闭与这个DataNode的连接,并查找下一个数据块,直到文件数据全部读完;
    4、最后关闭输出流。
    读流程

  • 详细流程:
    1、客户端通过调用 FileSystem 对象的 open() 方法来打开希望读取的文件,对于 HDFS 来说,这个对象是分布式文件系统的一个实例;
    2、DistributedFileSystem 通过RPC 调用 NameNode 以确定文件起始块的位置,由于存在多个副本,因此Namenode会返回同一个Block的多个文件的位置,然后根据集群拓扑结构排序,就近取;
    3、前两步会返回一个 FSDataInputStream 对象,该对象会被封装成 DFSInputStream 对象,DFSInputStream 可以方便的管理 datanode 和 namenode 数据流,客户端对这个输入流调用 read() 方法;
    4、存储着文件起始块的 DataNode 地址的 DFSInputStream 随即连接距离最近的 DataNode,通过对数据流反复调用 read() 方法,可以将数据从 DataNode 传输到客户端;
    5、到达块的末端时,DFSInputStream 会关闭与该 DataNode 的连接,然后寻找下一个块的最佳 DataNode,这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流;
    6、一旦客户端完成读取,就对 FSDataInputStream 调用 close() 方法关闭文件读取。

    写操作

  • 简单流程:
    1、客户端发起写数据请求;
    2、NameNode响应请求,然后做一些检查,比如查看文件是否存在,达标则创建文件;
    3、客户端将文件切分成若干个块,然后上传,先把第一个块传到Datanode1,然后Datanode1再传给Datanode2,以此类推,传完为止;
    4、成功后DataNode会返回一个确认队列给客户端,客户端进行效验,然后客户端上传下一个数据块到DataNode,直到所有数据块写入完成;
    5、当所有数据块全部写入成功后,客户端会向NameNode发送一个反馈并关闭数据流。
    写流程

  • 详细流程:
    1、客户端通过调用 DistributedFileSystem 的 create() 方法创建新文件;
    2、DistributedFileSystem 通过 RPC 调用 NameNode 去创建一个没有 Blocks 关联的新文件,创建前 NameNode 会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode 会为创建新文件记录一条记录,否则就会抛出 IO 异常;
    3、前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode 和 Datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue);
    4、DataStreamer 会去处理接受 Data Queue,它先问询 NameNode 这个新的 Block 最适合存储在哪几个 DataNode 里,比如重复数是 3,那么就找到 3 个最适合的 DataNode,把他们排成一个 pipeline。DataStreamer 把 Packet 按队列输出到管道的第一个 Datanode 中,第一个 DataNode 又把 Packet 输出到第二个 DataNode 中,以此类推;
    5、DFSOutputStream 还有一个队列叫 Ack Quene,也是由 Packet 组成,等待 DataNode 的收到响应,当 Pipeline 中的所有 DataNode 都表示已经收到的时候,这时 Akc Quene 才会把对应的 Packet 包移除掉;
    6、客户端完成写数据后调用 close() 方法关闭写入流;
    7、DataStreamer 把剩余的包都刷到 Pipeline 里然后等待 Ack 信息,收到最后一个 Ack 后,通知 NameNode 把文件标示为已完成。

总结

本文简单讲了 HDFS 的特点与应用场景、相关概念、架构、副本机制和机架感知以及读写流程。如果觉得有帮到你或者有所收获,麻烦动动小手点个赞。

#大数据开发工程师面经##大数据开发##技术栈#
大数据从入门到放弃 文章被收录于专栏

写点大数据相关的内容,一起交流进步

全部评论
介绍的很全面的,了解啦
点赞 回复 分享
发布于 2022-08-29 13:11 河南

相关推荐

03-18 00:45
门头沟学院 Java
半夜翻来覆去睡不着想着瞎聊聊(大家看看乐子也算缓解缓解压力 )bg二本软工 考研下岸没实习靠着烂毕设和github偷学项目备战春招只有ssob直骗和付费上班愿意要我(be like:2000+前端)已经放弃入行代码,想着老家躺平了。1.上了个不错高中结果整天谈恋爱啥的考了个烂大学,吃不了复读的苦直接上了,来了遇到一群好兄弟整天打游戏结果人有钱的有钱,有关系的有关系,我呢...(苦笑)2.peer pressure/这一年整天看着原来高中同学、身边朋友、同学都各奔前程整的哥们整天焦虑内耗,效率极低,空耗时间。3.学技术没有恒心,没有职业规划,刚接触完java cpp后什么都不好好深入,又瞎学个rust,没整明白又想转前端,vue没学完又看上了node.js......而且大学期间给游戏搭私服、拿ai画图配音音乐、看晋书热情都比学技术高,最终学的乱七八糟什么都不精通。4.考研也其实学的囫囵吞枣,给自己要求目标院校一降再降最后报了个应该很简单的学校然后最后一段时间觉得稳了心有怠惰一志愿差十几分进面。//这一段时间整的人很自闭,和家人,朋友都接触少了 而且感觉很对不起支持自己的家人,帮助我的朋友。//去年表弟报高考志愿没劝住他学计算机(主要是哪时候没意识就业已经这样了) 他上了个普本计算机,想着怎么点一下他尽早订好目标,好好学相关技术早点实习,但转念一想他现在还是大一还是先不说了。说到这里我想起来我也有个表哥之前让我早定方向,没事可以去刷刷牛客leetcode,现在看来我那时候也听不进去,他会听得进去嘛?我觉得不好说。//不入代码的话不知道信息化、技术支持运营之类的哪种好,如果有别的可以推荐没找到就回老家摇奶茶,卖零食去了,或许可以考虑一下乡镇职位?这大学四年过的乱七八糟也得有个结束,完了也不知道未来会前往哪里,现在才懂文学文艺作品里的毕业季迷茫。我总是常常后知后觉。
点赞 评论 收藏
分享
讲解你都学了哪些?巴拉巴拉写数仓,springboot 写个http接口微服务了解吗?--不了解面试官说:我的理解是  巴拉巴拉虽然我也不干这个spark和flink的区别:spark批,flink实时,spark stream 微批flink实时是一条一条的嘛?他会不会很慢?  --讲了是,但是他有window 巴拉巴拉不知道讲的对不对flume  +sqoop是干什么用的;--flume 数据日志采集等等  sqoop不知道你比较熟悉什么架构,--spark,flink讲一讲flink是怎么运行的--想了一下不知道, 面试官讲就其实spark,flink就是在客户端怎么样和集群怎么样计算怎么样   (架构还是得更加了解)flink env中都有什么?--集群配置,什么名字来着、并行度  讲的不全dophinshedule了解吗?他的底层实现了解吗?你这个项目是什么网上做的吗?开源的吗哪里学的?讲一讲java基础:微服务了解吗 ?你知道java有哪些集合吗?--set  --hashset有什么区别?还有吗?面试官讲其实hashset 就是底层是hashmap实现的  巴拉巴拉  set其实是java的一个基础类bala什么时候用hashset 什么时候用hashmap--hashset通常指针对于处理去重操作,hashma用于需要存储数据时,并且hashset对比list他的查找插入时间复杂度是o(1)hashset 存放一个已有数据的时候会怎么办?--我说不会放进去 ,面试官问只是不会放进去吗?代码:链表反转  本来想让我写集合相关的,看我集合不熟就改这个了。--注意面向对象的代码书写细节反问:你们做什么业务?--主要就是flume-sqoop一些数据日志采集  一些简单的etl   包括dophinshedule一些流式管理;还有一些仓库维护;对我有什么建议吗?--实习面试侧重于一些基础一些的面试,不会问太多项目,校招侧重于具体的框架,最好能够重点了解某一个框架能够阅读源码,对于基础的语言需要重点了解不一定非得是java,但是肯定需要了解,技术栈不一定要宽,要深。#牛客AI配图神器#没问hive kafka这个我也不会总结:要注重基础语言知识和深挖某一框架,加强基础语言代码了解
查看17道真题和解析
点赞 评论 收藏
分享
03-03 11:21
云南大学 Java
点赞 评论 收藏
分享
评论
6
9
分享

创作者周榜

更多
牛客网
牛客企业服务