目录
1.为什么需要分布式存储?
2. HDFS的基础架构
3. HDFS存储原理
4. NameNode是如何管理Block块的
5. HDFS数据的读写流程
1.为什么需要分布式存储?
数据量太大,单机存储能力有上限,需要靠数量来解决问题
数量的提升带来的是网络传输、磁盘读写、 CPU 、内存等各方面的综合提升。 分布式组合在一起可以达到 1+1>2 的效果
大数据体系中,分布式的调度主要有2类架构模式:
去中心化模式
•中心化模式
去中心化模式,没有明确的中心。
众多服务器之间基于特定规则进行同步协调。
大数据框架,大多数的基础架构上,都是符合:中心化模式的。
即:有一个中心节点(服务器)来统筹其它服务器的工作,统一指挥,统一调派,避免混乱。
这种模式,也被称之为:一主多从模式,简称主从模式(Master And Slaves)
主从模式(中心化模式)在现实生活中同样很常见:
公司企业管理
组织管理
行政管理
等等
Hadoop框架,就是一个典型的主从模式(中心化模式)架构的技术框架。
总结:
1. 分布式系统常见的组织形式?
去中心化模式:没有明确中心,大家协调工作
中心化模式:有明确的中心,基于中心节点分配工作
2. 什么是主从模式?
主从模式(Master-Slaves)就是中心化模式,表示有一个主节点来作为管理者,管理协调下属一批从节点工作。
3. Hadoop是哪种模式?
主从模式(中心化模式)的架构
2. HDFS的基础架构
HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一
全称是: Hadoop Distributed File System ( Hadoop 分布式文件系统)
是 Hadoop 技术栈内提供的分布式数据存储解决方案
可以在多台服务器上构建存储集群,存储海量的数据
HDFS的基础架构:
NameNode:
HDFS 系统的主角色,是一个独立的进程
负责管理 HDFS 整个文件系统
负责管理 DataNode
SecondaryNameNode:
NameNode 的辅助,是一个独立进程
主要帮助 NameNode 完成元数据整理工作(打杂)
DataNode:
HDFS 系统的从角色,是一个独立进程
主要负责数据的存储,即存入数据和取出数据
3. HDFS存储原理
4. NameNode是如何管理Block块的
edits文件
在hdfs中,文件是被划分了一堆堆的block块,那如果文件很大、以及文件很多,Hadoop是如何记录和整理文件和block块的关系呢?
答案就在于NameNode
NameNode基于一批edits和一个fsimage文件的配合
完成整个文件系统的管理和维护
edits记录每一次HDFS的操作
逐渐变得越来越大
问题在于,当用户想要查看某文件内容
如:/tmp/data/test.txt
就需要在全部的edits中搜索
(还需要按顺序从头到尾,避免后期改名或删除)
效率非常低
需要合并edits文件,得到最终的结果
fsimage文件
NameNode元数据管理维护
NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。
1. 每次对HDFS的操作,均被edits文件记录
2. edits达到大小上线后,开启新的edits记录
3. 定期进行edits的合并操作
如当前没有 fsimage 文件, 将全部 edits 合并为第一个 fsimage
如当前已存在 fsimage 文件,将全部 edits 和已存在的 fsimage 进行合并,形成新的 fsimage
5. 重复123流程
元数据合并控制参数
对于元数据的合并,是一个定时过程,基于:
dfs.namenode.checkpoint.period,默认 3600 (秒)即 1 小时
dfs.namenode.checkpoint.txns,默认 1000000 ,即 100W 次事务
只要有一个达到条件就执行。
检查是否达到条件,默认60秒检查一次,基于:
dfs.namenode.checkpoint.check.period,默认 60 (秒),来决定
SecondaryNameNode的作用
对于元数据的合并,还记得HDFS集群有一个辅助角色:SecondaryNameNode吗?
没错,合并元数据的事情就是它干的
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage)
然后合并完成后提供给NameNode使用。
1. NameNode基于
edits 记录每次操作
fsimage ,记录某一个时间节点前的当前文件系统全部文件的状态和信息
维护整个文件系统元数据
2. edits文件会被合并到fsimage中,这个合并由:
SecondaryNameNode来操作
3. fsimage记录的内容是:
5. HDFS数据的读写流程
1. 客户端向NameNode发起请求
2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
3. 客户端向指定的DataNode发送数据包
4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
5. 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
6. 写入完成客户端通知NameNode,NameNode做元数据记录工作
读:
关键信息点:
NameNode 不负责数据写入 ,只负责元数据记录和权限审批
客户端直接 向 1 台 DataNode 写数据, 这个DataNode一般是 离客户端最近 (网络距离) 的那一个
数据块副本的复制工作, 由 DataNode 之间自行完成 (构建一个 PipLine ,按顺序复制分发,如图 1 给 2, 2 给 3 和 4 )
写:
关键点:
1、数据同样不通过NameNode提供
2、NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的
这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取
1、客户端向NameNode申请读取某文件
2、 NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
3、客户端拿到block列表后自行寻找DataNode读取即可
1、对于客户端读取HDFS数据的流程中,一定要知道
不论读、还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯
不然对NameNode压力太大
2、写入和读取的流程,简单来说就是:
NameNode 做授权判断(是否能写、是否能读)
客户端直连 DataNode 进行写入(由 DataNode 自己完成副本复制)、客户端直连 DataNode 进行 block 读取
写入,客户端会被分配找离自己最近的 DataNode 写数据
读取,客户端拿到的 block 列表,会是网络距离最近的一份
3、网络距离
最近的距离就是在同一台机器
其次就是同一个局域网(交换机)
再其次就是跨越交换机
再其次就是跨越数据中心
HDFS内置网络距离计算算法,可以通过IP地址、路由表来推断网络距离