妙趣横生大数据-期中作业

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/#/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容