HDFS是如何设计架构的?

前言

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

1、Hadoop 简介

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

2、分布式文件系统

7bc5bfc8816bdf44a2d79e88a9411dfd.jpg         HDFS其实就能够理解为一个分布式文件系统,能够看如图1所示有4个服务器是否是都有他本身的文件系统均可以进行存储数据,假设每一个服务器的存储空间存储10G的数据。假设数据量很小的时候存储10G的数据仍是ok的当数据量大于服务器的存储空间时是否是单个服务器就无法存储了。 咱们是否是能够在服务器中部署一个Hadoop这样就能构建出一个集群(超级大电脑)。这样就存储 4*10=40G的数据量,这样咱们面向用户时是否是只有一台超级大的电脑至关于一个分布式文件系统。         程序员

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

3、HDFS 架构

5377cf36d3ec985c5415fbe9b741f5d1.jpg         假设咱们这里有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。架构

4、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数据写入成功

5、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块合并成一个完整的最终文件

6、HDFS缺陷

340406b1e75682c811e965d19d2e61e0.jpg注意:早期版本app

  1. 单点问题
  2. 内存受限

总结

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

资源获取 获取Flink面试题,Spark面试题,程序员必备软件,hive面试题,Hadoop面试题,Docker面试题,简历模板等资源请去 GitHub自行下载 https://github.com/lhh2002/Framework-Of-BigData Gitee 自行下载  https://gitee.com/li_hey_hey/dashboard/projects

-End-


0704c89c49897915f37dd486e039e124.jpg

企业是如何选择技术栈来作离线数仓


506927a34492bffe4dc1cdfcb0bbd6d6.jpg

原来Canal也能够作HA?


e070c8223445af477313a8e9be732065.jpg

Hive的调优你都知道那些?


82c21f1d782c034896de47ba5cc917cb.jpg

万字带你深刻阿里开源的Canal工做原理


扫码关注

068aff5676eca48a0385523f10e818c7.jpg大数据老哥但愿这篇文章能够帮到你~
欢迎你们点个在看,分享至朋友圈
你我都成为光发热之人,在看在看在看~(疯狂暗示!)

相关文章
相关标签/搜索