hadoop面试题(一)

1.简述MapReduce整个流程

map阶段

主要分为五个阶段read阶段、map阶段、collect阶段、spill阶段、combine阶段。
1.read阶段:程序内的Inputformat(默认是TextInputFormat)来读取外部数据,它会调用RecoderReader里面的read方法来读取数据,返回k,v键值对。k就是偏移量,v就是文件一行的内容
2.map阶段:将解析出的key/value交给用户写的map()函数处理,并产生一系列新的key/value
3.collect阶段:在map函数中,当数据处理结束后,一般会调用OutPutCollector.collect()输出结果。在该函数内部,会将新生成的key/value分区,并写入一个环形缓冲区
4.spill阶段:溢写阶段,当环形缓冲区达到80%时,mapreduce就会将数据写到本地磁盘上,生成一个临时文件。并且在写入磁盘之前,要对数据进行快速排序,必要时进行压缩、合并等操作
5:combine阶段:当所有数据处理结束后,MapTask对所以临时文件j进行一次合并,最终形成一个大文件,相当于提前进行了局部聚合,类似于reduce操作

reduce阶段

主要分为四个阶段copy阶段、merge阶段、sort阶段、spill阶段、reduce阶段。
(1)copy阶段:reduceTask从各个mapTask拉取数据,数据量小直接放到内存,数据量大写到磁盘
(2)merge阶段:在copy数据的同时,reduceTask会对内存和磁盘上的数据进行合并,防止小文件过多
(3)sort阶段:reduce函数是按照key进行聚集的,在mapTask上已经进行了局部的排序,reduceTask只需要对数据再进行一次全局归并排序即可
(4)reduce阶段:将reduce()函数计算的结果写入HDFS或者其他文件系统

2.简述HDFS的读写流程

HDFS写数据流程

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已经存在?返回是否可以上传文件
(2)客户端请求第一个block该传输到哪些DataNode节点上
(3)NameNode根据配置文件中指定的备份数量以及副本放置策略进行文件分配,返回可用的DataNode的地址
(4)客户端请求DataNode节点,传输数据,DataNode会和其他DataNode形成pipline,整个piplinej建立完成后逐级返回客户端
(5)客户端发送block,以packet为单位(默认64k),A收到就回传给B,B传给C;A每传一个packet会放入一个应答队列等待响应
(6)数据被分割成一个个packet数据包在pipline上依次传输,在pipline反方向,逐个发送ack,最终由第一个DataNode向客户端发送ack
(7)当一个block传输结束后,客户端再次请求NameNode上传第二个block

HDFS读数据流程

(1)客户端请求NameNode读取数据,NameNode检查文件位置,确认请求block所在位置
(2)namenode返回block列表,对于每个block,namenode都会返回含有该block副本的DataNode地址
(3)客户端和DataNode建立连接,读取数据(就近原则),如果客户端本身就是DataNode,那么将从本地直接获取数据
(4)读取完每一次block都会进行check sum验证。如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
(5)当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表。

3.Shuffle过程

在这里插入图片描述注意理解

  • 一个分片对应一个Map任务,每个Map任务里面会根据分片中的记录执行多次mapper函数。
  • 一个分区对应一个Reduce任务,每个Reduce任务中根据分区的键来执行多次reducer函数

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。

Map端:

  • collect:每个map任务维护着一个环形缓冲区。当map输出数据时,先写到内存的环形缓冲区中,当环形缓冲区到达一定阈值时,开始溢出成spill文件。

  • spill:在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。

  • combine:如果有combiner,排序后进行一次合并,使结果紧凑,然后写入磁盘。当最后一个spill文件写完之后,将多个spill文件合并到一个已经分区并排序的大文件中。

Reduce端:

  • copy: reduce通过http方式从map端拉取数据,reduce有少量的复制线程,并行的从map端复制数据到reduce端。如果map输出比较少,则直接复制到内存中,如果其大小超过一定阈值,则复制到磁盘上。
  • merge:在远程拷贝数据的同时,ReduceTask 启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
  • sort:ReduceTask 对所有数据进行一次归并排序。

4.NameNode 和 Secondary NameNode工作机制

在这里插入图片描述1. 第一阶段NameNode启动:
(1)第一次启动NameNode,创建Fsimage和Edits文件。如果不是第一次启动,则直接加载镜像文件和编辑日志到内存。
(2)客户端对元数据进行增删改查请求
(3)NameNode记录操作日志,更新滚动日志
(4)NameNode在内存中对数据进行修改
2.Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要checkpoint,返回结果
(2)Secondary NameNode请求执行checkpoint
(3)NameNode滚动正在写的Edits日志
(4)将滚动前的镜像文件和编辑日志拷贝到Secondary NameNode
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。

NN和2NN工作机制详解:
Fsimage:NameNode内存中元数据序列化后形成的文件。
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。

NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,
然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求,
这些请求的操作首先会被记录到edits.inprogress中
(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),
如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。
然后,NameNode会在内存中执行元数据的增删改的操作。
由于Edits中记录的操作会越来越多,Edits文件会越来越大,
导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并
(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,
最终形成新的Fsimage)。
SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
SecondaryNameNode首先会询问NameNode是否需要CheckPoint
(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。
直接带回NameNode是否检查结果。
SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,
滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,
其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,
然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,
然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。
NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,
因为合并过的Edits中的元数据信息已经被记录在Fsimage中。

5.DataNode工作机制

在这里插入图片描述
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器。

6.DataNode怎样保证数据完整性

1)当DataNode读取Block的时候,它会计算CheckSum。
2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
3)Client读取其他DataNode上的Block。
4)DataNode在其文件创建后周期验证CheckSum,如图所示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TigRer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值