写点什么

HDFS 是如何设计架构的?

发布于: 2021 年 01 月 27 日
HDFS是如何设计架构的?

前言

Hadoop 到目前为止发展已经有 10 余年,版本经过无数次的更新迭代,目前业内大家把 Hadoop 大的版本分为 Hadoop1.0、Hadoop2.0、Hadoop3.0 三个版本。

一、Hadoop 简介

Hadoop 版本刚出来的时候是为了解决两个间题:一是海量数据如何存储的问题,一个是海量数据如何计算的问题。 Hadoop 的核心设计就是 HDFS 和 Mapreduce.HDFS解决了海量数据如何存储的问题, Mapreduce 解决了海量数据如何计算的问题。

HDFS 的全称: Hadoop Distributed File System。

二、分布式文件系统

HDFS 其实就可以理解为一个分布式文件系统,可以看如图 1 所示有 4 个服务器是不是都有他自己的文件系统都可以进行存储数据,假设每个服务器的存储空间存储 10G 的数据。假设数据量很小的时候存储 10G 的数据还是 ok 的当数据量大于服务器的存储空间时是不是单个服务器就没法存储了。 我们是不是可以在服务器中部署一个Hadoop这样就能构建出一个集群(超级大电脑)。这样就存储 4*10=40G的数据量,这样我们面向用户时是不是只有一台超级大的电脑相当于一个分布式文件系统。

HDFS 是一个主从的架构、主节点只有一个 NemeNode。从节点有多个 DataNode。


三、HDFS 架构

假设我们这里有 5 台服务器每台服务器都部署上 Hadoop,我们随便选择一台服务器部署上NameNode剩下服务器部署上DataNode

客户端上传文件时假设文件大小为129MHDFS 默认切分的大小为128M这时就会产生出 2 个blkNameNode 去通知 DataNode 上传文件(这里有一定的策略),我们就假设就将这几个文件分别存储在 4 个服务器上。为什们要进行分别存储在,假设 DataNode 服务器有一天突然挂掉了我们是不是还可通过 DataNode4 或 2 和 3 进行读取数据,这样是不是就防止数据丢失。


NameNode

  1. 管理元数据信息(文件目录树):文件与 Block 块,Block 块与 DataNode 主机关系

  2. NameNode 为快速响应用户操作,所以把元数据信息加载到内存里


DataNode

  1. 存储数据,把上传的数据划分固定大小文件块(Block)在Hadoop2.73之前是64M之后改为了128M

  2. 为了保证数据安全,每个文件默认都是三个副本


SecondaryNamenode

         周期性的到 NameNode 节点拉取 Edtis 和 fsimage 文件,将这两个文件加入到内存进行 然后将这两个文件加入到内存中进行合并产生新的 fsimage 发送给 NameNode。


四、HDFS 写入数据流程

  1. 客户端会带着文件路径向 NameNode 发送写入请求通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件,返回是否可以上传;

  2. Client 请求第一个 block 该传输到哪些 DataNode 服务器上;

  3. NameNode 根据副本数量和副本放置策略进行节点分配,返回 DataNode 节点,如:A,B,C

  4. Client 请求 A 节点建立 pipeline 管道,A 收到请求会继续调用 B,然后 B 调用 C,将整个 pipeline 管道建立完成后,逐级返回消息到 Client;

  5. Client 收到 A 返回的消息之后开始往 A 上传第一个 block 块,block 块被切分成 64K 的 packet 包不断的在 pepiline 管道里传递,从 A 到 B,B 到 C 进行复制存储

  6. 当一个 block 块 传输完成之后,Client 再次请求 NameNode 上传第二个 block 块的存储节点,不断往复存储

  7. 当所有 block 块传输完成之后,Client 调用 FSDataOutputSteam 的 close 方法关闭输出流,最后调用 FileSystem 的 complete 方法告知 NameNode 数据写入成功


五、HDFS 读取数据流程

  1. 客户端会先带着读取路径向 NameNode 发送读取请求,通过 RPC 与 NameNode 建立通讯,NameNode 检查目标文件,来确定请求文件 block 块的位置信息

  2. NameNode 会视情况返回文件的部分或者全部 block 块列表,对于每个 block 块,NameNode 都会返回含有该 block 副本的 DataNode 地址

  3. 这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;

  4. Client 选取排序靠前的 DataNode 调用 FSDataInputSteam 的 read 方法来读取 block 块数据,如果客户端本身就是 DataNode,那么将从本地直接获取 block 块数据

  5. 当读完一批的 block 块后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表,继续读取

  6. 所有 block 块读取完成后,Client 调用 FSDataInputStream.close()方法,关闭输入流,并将读取来所有的 block 块合并成一个完整的最终文件


六、HDFS 缺陷

注意: 早期版本

  1. 单点问题

  2. 内存受限


总结

上述给大家讲解了简单的 HDFS 架构,我在最后面留了一个小问题,我会在下期通过画图的方式给大家讲解,我在这里为大家提供大数据的资料需要的朋友可以去下面 GitHub 去下载,信自己,努力和汗水总会能得到回报的。我是大数据老哥,我们下期见~~~

>资源获取 获取 Flink 面试题,Spark 面试题,程序员必备软件,hive 面试题,Hadoop 面试题,Docker 面试题,简历模板等资源请去

>GitHub 自行下载 https://github.com/lhh2002/Framework-Of-BigData

>Gitee 自行下载 https://gitee.com/liheyhey/dashboard/projects


用户头像

微信搜公众号【大数据老哥】 2021.01.03 加入

微信搜索公众号【大数据老哥】 自己GitHub【https://github.com/lhh2002】 欢迎来star

评论

发布
暂无评论
HDFS是如何设计架构的?