2023年2月27日
Q1.简述Hadoop小文件弊端:
在第三章介绍HDFS时,3.1.2章节已指出HDFS无法高效存储大量小文件。针对hadoop小文件弊端,我想从三个方面来回答:
1)定义:
指文件大小小于一个块的文件(HDFS默认是64MB);
2)弊端:
a.NameNode检索效率大大降低:HDFS使用NameNode来管理文件系统的元数据,并保存在内存当中,客户端通过检索元数据,可以快速获取文件实际存储位置。此时,如果小文件非常多,则NameNode要消耗很大的内存来保存元数据信息,客户端检索元数据的效率也大大降低,需要耗费较多时间才能获取文件的实际存储位置;
b.Map任务大幅增加,性价比低:Mapreduce处理大量小文件时,产生过多Map任务,线程管理开销大幅增加,性价比非常低;
c.严重影响HDFS性能:访问大量小文件时,需要频繁在不同DataNode之间跳转访问,性能影响较大。
3)解决方案:
将多个小文件进行合并,可以设置小文件阈值,超限值的小文件可以进行合并处理。如:利用Apache官方工具去合并HDFS上的小文件(Hadoop Archive)。
Q2.HDFS中DataNode挂掉如何处理?
1)正常情况下:
当客户端上传文件时,它与DataNode建立pipeline管道。一方面,客户端会向DataNode发送数据包,另一方面,DataNode在接收到数据包之后,会向客户端发送ack确认;
2)突然挂掉时:
客户端接收不到DataNode的ack确认,此时客户端会通知NameNode,NameNode检查该块的副本,并通知另一个DataNode复制副本,将挂掉的DataNode下线,不再让DataNode参与文件上传下载。
Q3.HDFS中NameNode挂掉如何处理?
1)方式一:
将SecondaryNameNode中数据拷贝到NameNode存储数据的目录,用于恢复NameNode目录;
2)方式二:
使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
Q4.HBase读写流程?
1)读流程:
a.Client客户端先访问zookeeper,获取meta表位于哪个Region Server;
b.访问meta表对应的Region Server服务器,根据请求的信息(namespace,table,rowkey),查询出目标表位于哪个Region Server中的哪个region。并将该表的region信息,以及meta表的位置信息缓存在客户端的缓存中,以便下次访问;
c.与目标表所在的Region Server进行通讯;
d.分别在Block Cache(读缓存),MemStore和Store File查询目标数据,并将查到的数据进行合并,此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型;
e.将从文件中查询到的数据块缓存到block cache;
f.将合并后的数据返回给客户端。
2)写流程:
a.客户端先访问zookeeper,获取Meta表位于那个region server;
b.访问Meta表对应的region server服务器,根据请求的信息(namespace:table/rowkey),在meta表中查询出目标数据位于哪个region server的哪个region中。并将该表的region信息以及meta表的位置信息缓存到客户端的meta cache,方便下次访问;
c.与目标数据的region server进行通讯;
d.将数据写入到WAL中;
e.将数据写入到对应的memstore中;
f.向客户端发送写入成功的信息;
g.等达到memstore的刷写时机后,将数据刷写到HFILE中。
Q5.MapReduce为什么一定要有Shuffle过程
1)Shuffle:
是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程;
2)针对不同的Map,有可能输出相同的Key,相同的Key必须发送到同一个Reduce端处理,因此需要Shuffle进行排序分区,减少跨节点数据传输的资源消耗。将数据完整的从map task端拉取数据到reduce task端,以减少磁盘IO对task的影响。
Q6.MapReduce中的三次排序
1)当map函数产生输出时,会首先写入内存的环形缓冲区,当达到设定的阀值,在刷写磁盘之前,后台线程会将缓冲区的数据划分成相应的分区。在每个分区中,后台线程按键进行内排序;
2)在Map任务完成之前,磁盘上存在多个已经分好区,并排好序的,大小和缓冲区一样的溢写文件,这时溢写文件将被合并成一个已分区且已排序的输出文件。由于溢写文件已经经过第一次排序,所有合并文件只需要再做一次排序即可使输出文件整体有序;
3)在reduce阶段,需要将多个Map任务的输出文件copy到ReduceTask中后合并,由于经过第二次排序,所以合并文件时只需再做一次排序即可使输出文件整体有序。
Q7.MapReduce为什么不能产生过多小文件
1)MapReduce小文件问题:
是指每个Map任务的启动需要消耗一定的时间,并且这个过程是非常消耗性能的,当小文件非常多的时候,就会切出大量InputSplit,而每个Split对应一个Map任务,这些任务的运行时间极短,但启动时间累加也是一个大数目。
2)可以考虑在数据处理时,就将小文件合并成大文件,再上传到HDFS做后续的分析。
Q8.实战
1)MRJob及MRStep是新接触的工具包,首先熟悉了这两个工具包的使用。参考了以下博文:
https://blog.csdn.net/qq_41474121/article/details/109119761
https://www.cnpython.com/tags/476019
2)明确需要解决的问题,主要需对以下四个子函数进行填空,用于计算用户访问过的每个位置的签到概率:
a.mapper(self,_,line):#填入mapper的具体步骤
b.combiner(self,key,values):#填入combiner的具体步骤
c.reducer_init(self):# 填入reducer_init的具体步骤
d.reducer(self,key,values):# 填入reducer的具体步骤
3)代码填空解答:
这块还需要再思考和实践,一时之间尚无头绪,未完待续...
学习资源引自datawhale开源学习课程~感恩!
https://github.com/datawhalechina/juicy-bigdata
https://datawhalechina.github.io/juicy-bigdata/#/