Hadoop是什么?
分布式的基础架构、海量数据的分布式存储、分布式计算
分布式的本质:分而治之
架构:包含三个模块
HDFS MR YARN
HDFS是什么?
高可靠性的分布式文件存储系统。整体架构采用主从+主备设计模式。
主从+主备
NN和DN,NN是负责管理HDFS集群的元数据管理,同时处理客户端的请求;DN负责实际的数据存储,负责数据的读写
NN的备份机制,由于NN负责管理整个集群的元数据,一旦发生故障,会造成集群的不可用,实际生成HDFS至少两个NN,一个活跃另一个备份,一旦活跃的NN挂了,备份的NN切换保证集群的高可用。
HDFS的优缺点?
优点
高容错性:多副本
适合批处理/大规模处理:移动计算而不是移动存储
构建在廉价的机器
缺点
高延时访问
无法高效对小文件进行存储
不支持文件随机修改
HDFS的架构?
NameNode
管理元数据与命名空间、响应客户端的读写请求
存储:文件目录树,所有文件目录,文件的属性,每个块所在的DN的地址,都会由NN进行存储。
DataNode
存储block块
负责文件读取写入
与NN的交互:
心跳机制和块报告机制
心跳机制:每3秒与NN进行一次交互,使NN能够实时的掌握DN的是否在线,以及DN的资源使用情况。若10分钟没有进行心跳则认为该DN异常。
块报告机制:每6个小时与NN进行一次元数据的同步,保证NN存储最新的元数据。
Secondary NameNode
合并fsimage与editLog:为什么合并?避免重启时元数据恢复时间过长
辅助NN
Client
用户操作hdfs集群的入口
HDFS元数据包含什么?
命名空间:文件的目录树
元数据
文件或目录的名称,文件大小
块id与块地址:文件与块ID的映射、块ID与DN的映射
存放形式
fsimage:元数据镜像文件,存储某一时刻 HDFS 的完整目录结构
editlog:编辑日志,是元数据的 “操作日志”,记录fsimage生成后所有对 HDFS 的修改操作
为什么要分块?为什么分块为128MB?
为什么分块?
1.一个文件可能大于集群中的任意磁盘,引入块机制,能很好解决
2.适合数据备份,提高可靠性, Datanode 节点故障时,只需重新复制该节点上的块到其他节点。
3.提升并行处理效率
为什么分为128MB?
寻址时间与传输时间的平衡
HDFS 的设计目标是让寻址时间占传输时间的比例不超过 1%
当寻址时间为10ms的话,传输时间就是10ms✖️100 也就是1s
传统磁盘的传输效率就是100mb/s 所以我们设定块的大小是128mb
说一下HDFS的写流程?
1.客户端通过分布式文件系统向NN发送写文件请求
2.NN查看文件的路径是否已经存在,通过校验后可以上传
3.客户端请求第一个块的上传地址,哪几个DN
4.NN返回客户端三个DN节点路径,分别为DN1、DN2、DN3
5.客户端通过文件分布式系统建立数据传输管道,先与DN1建立TCP连接,DN1收到请求后与DN2建立TCP连接,再调用DN3,将通信管道建立成功
6.客户端向DN1上传第一个块,DN1收到包就会传给DN2,DN2传给DN3.每传一个包就会放入一个ack队列等待应答,应答方向是反着DN3到DN2到DN1
7.一个块上传完会进行下一个块的上传等所有块上传完成,DN会通知NN上传完毕,NN会元数据文件映射关系
8.最后关闭通道,上传完毕
说一下HDFS的读流程?
1.客户端通过分布式文件系统向NN发送读文件请求
2.NN返回DN的地址,客户端就近选择每一个块的DN节点读取数据
3.DN传输文件给客户端
4.客户端以包为单位进行接收,先放入缓冲区,最后写入目标文件
说一下HDFS写文件的容错机制?
client异常
Client写文件需要向NN申请租约,Client挂掉后租约会超时,HDFS会释放该租约和关闭文件、然后将这个块文件在不同DN上的存储变成一致状态
D2,D3异常
写入过程不会立即终止,而是将这个挂掉的节点摘除,只有两个块进行同步,然后块传输完毕后,NN会检测到这个块副本只有两个,会找个DN复制一份,保证三个副本。
如果挂掉的集群恢复怎么办?
当挂掉后会给块文件生成 一个新的时间戳,挂掉的文件恢复后,时间戳不统一就会被清除
所以说有时候副本数量会出现4个,然后再变为一个
D1异常
节点异常,写入失败,重置整个链路
NN异常
1.客户端与NN,通信过程中发生异常、立即终止通信,任务失败
2.客户端与DN,传输时NN异常,传输不影响继续执行,当传输完毕后,DN需要向NN通知传输完毕,但NN挂掉,这时候会出现异常,一般需要人工介入
什么是MR?
分而治之的思想、大任务分成小任务并行执行、map和reduce阶段
说一下MR的流程,说一下Shuffle流程?
1.数据分片:输入文件过大,MapReduce会对其进行切分,大文件会被切分成一个个的块,每一个块对应一个task
2.map函数:
从输入的数据解析出一个个 key / value 。
将这些key-value交给 Map ()函数处理,并产生一系列新的 key / value
3.Shuffle
map端Shuffle:map端的处理结果会暂存在一个内存环形缓冲区(默认100MB)达到80%进行溢写,把缓冲区的数据写入本地溢写文件
写入磁盘前,会对数据进行分区,将key的哈希值对reduce个数进行取余,余多少放在哪个分区
然后会对数据进行排序(快速排序),如果设置了combiner,会对排序后结果进行combine
最后map端输出完最后一个文件,会将溢写文件合并为一个文件,合并时进行排序(归并排序)和combine
reduce端Shuffle
reduce端拉取不同的map数据,首先保存在内存中,达到一定阈值,写入磁盘中
后台线程会将从不同map拉取过来的数据,采用归并排序合并成 一个大的有序文件,然后输出给reduce()
4.reduce
排序完的键值对调用reduce()方法,键相等的键值对调用一次reduce()方法,最后将输出的键值对写入到hdfs中
为什么要用缓冲区?环形?
等缓冲区写满进行一次写入磁盘,减少I/O
单向缓冲区不能并发读写,而双向缓冲区因为读写的效率不一致也不能做到很好的并发;而环形缓冲区,当达到百分之80阈值,并行读写
在缓冲区内进行一次按分区的排序,使用快排,那么之后对溢写文件的归并排序有很大的提升。
说一下Shuffle阶段的排序手段?为什么要排序?
排序好处:
减少reduce端排序压力、reduce拉取其分区的数据时减少扫描量、方便进行预聚合
快排和归并的比较
快排O(nlogn) 不稳定的排序 适合内存中排序
归并排序O(nlogn) 稳定的排序(合并时保留顺序 适合对有序文件的合并
说一下MR中map、reduce个数决定因素?
map个数
输入文件的个数
输入文件的总大小
集群设置的文件块大小
reduce个数
1.参数1 我们指定reduce个数
2.参数2: 每个reduce处理的数据量
3.参数3 最多启动的reduce个数
说一下Yarn的架构?
ResourceManager:全局的资源管理器,负责整个集群的资源管理分配
NodeManager:NM就是每个节点上的资源和任务管理器
ApplicationMaster:用户提交的每个任务都包含一个AM
监控任务运行、与RM协调获得资源、进一步的分配任务
Container节点上对于资源的抽象,封装了节点上多维资源,内存,磁盘,网络
说一下Yarn的执行流程?
1.客户端向yarn的RM提交AM应用程序
2.AM通过校验后,向其分配一个container,并在其中启动AM
3.AM向RM注册,然后向RM申请运行程序所需要的资源,随后监控整个任务的执行
4.AM在监控运行的实例时,不端与RM保持心跳,并通过RPC通信向RM申请资源
5.AM领取到资源会与NM通信,要求NM启动对应的container,并执行任务
6.NM会为AM要启动的任务设置好环境,下载好所需资源
7.拉起的任务通过心跳向AM汇报进度,NM监控container的运行状态向RM汇报
8.任务完成后,AM通知RM完成,RM通知NM聚集日志,清理临时文件等
说一下Yarn的任务调度器?
先进先出调度器:排成一个队列,先进先出队列,将资源优先给最头上的使用
容量调度器:会有专门的队列处理小任务,预先占用一定的集群资源,导致大任务的执行时间不如先进先出
公平调度器:相对公平的分配资源
说一下HDFS常用的命令?
hdfs dfs-ls、-get、-put、-rm、-find、-tail、-du -h
1015

被折叠的 条评论
为什么被折叠?



