大数据之Hadoop面试官的11个灵魂拷问!

2021-04-13 11:50:33 浏览数 (1)

久违了各位,好长时间没更新了,博主也是有点懒!!!

今天就给各位更新一些Hadoop高端面试题,也是博主这一年面试所遇到的问题,其中还包括一些大厂的面试真题! 注:喜欢的朋友们给个关注,一键三连一下吧! 谢谢

1、先说一下hadoop的组成结构把!

1.HDFS 管理者:namenode 工作者:DataNode 辅助管理者:secondaryNameNode 2.MapReduce 3.YARN 管理者:ResourceManage 工作者:NodeManage

2、常用的端口号有哪些?

dfs.namenode.http-address:50070 dfs.datanode.http-address:50075 SecondaryNameNode:50090 dfs.datanode.address:50010 fs.defaultFS:8020或者9000 yarn.resourcemanager.webapp.address:8088 历史服务器web访问端口:19888

3、HDFS读写流程说一下?

读流程

1、客户端会先带着读取路径向NameNode发送读取请求 2、NameNode接收到请求后,会先判断是否有权限,读取文件是否存在等等,如果都无误则将文件所在的DataNode的节点位置,发送给客户端部分或者全部的DataNode的节点位置 3、客户端得到文件块存储的位置后,会调用read()方法,去读取数据 4、在读取之前会先进行一个checksum的操作,去判断一下校验和是否正确,正确则读,不正确则去下一个存放该block块的DataNode节点上读取 5、读取完NameNode这次发送过来的所有的block块后,会再去询问是否还有block块,如果有则接着读取,如果没有则调用close方法,将读取到的文件合并成一个大文件

注:结合下图更容易通透了解读操作的流程

写流程

1.客户端会带着文件路径向NameNode发送写入请求 2.NameNode会去判断是否有权限,写入路径的父级目录是否存在,如都无误则发送可以写入的请求返回给客户端 3.客户端会将文件进行切分,然后上传block 4.NameNode会根据DataNode的存储空间还有机架感知原理等返回该block块将要存储的DataNode的位置 ABC 5.客户端会去ABC三个DataNode节点上建立pipeline A-B B-C然后C建立完成后会将结果返回给B B返回给A A返回给客户端 6.开始往A写入 依次进行流水线的复制 7.写入完后再去依次写入其他block块 8.都写入完成后会将写入完成的信息返回给NameNode 9.NameNode存储该文件的各个block块的元数据信息

注:结合下图更容易通透了解写操作的流程

4、你说你深刻理解MR的工作流程,你给我讲一下吧!

1.在客户端执行submit()方法之前,会先去获取一下待读取文件的信息 2.将job提交给yarn,这时候会带着三个信息过去(job.split(文件的切片信息),jar.job.xml) 3.yarn会根据文件的切片信息去计算将要启动的maptask的数量,然后去启动maptask 4.maptask会调用InPutFormat()方法区HDFS上面读取文件,InPutFormat()方法会再去调用RecordRead()方法,将数据以行首字母的偏移量为key,一行数据为value传给mapper()方法 5.mapper方法做一些逻辑处理后,将数据传到分区方法中,对数据进行一个分区标注后,发送到环形缓冲区中 6.环形缓冲区默认的大小是100M,达到80%的阈值将会溢写 7.在溢写之前会做一个排序的动作,排序的规则是按照key进行字典序排序,排序的手段是快排 8.溢写会产生出大量的溢写文件,会再次调用merge()方法,使用归并排序,默认10个溢写文件合并成一个大文件, 9.也可以对溢写文件做一次localReduce也就是combiner的操作,但前提是combiner的结果不能对最终的结果有影响 10.等待所有的maptask结束之后,会启动一定数量的reducetask 11.reducetask会发取拉取线程到map端拉取数据,拉取到的数据会先加载到内存中,内存不够会写到磁盘里,等待所有的数据拉取完毕,会将这些输出在进行一次归并排序 12.归并后的文件会再次进行一次分组的操作,然后将数据以组为单位发送到reduce()方法 13.reduce方法做一些逻辑判断后,最终调用OutputFormat()方法,Outputformat()会再去调用RecordWrite()方法将数据以KV的形式写出到HDFS上

5、MapReduce的Shuffle过程说一下!

Map方法之后Reduce方法之前这段处理过程叫「Shuffle」

1、Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区; 2、环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写; 3、溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段「快排」; 4、溢写产生大量溢写文件,需要对溢写文件进行「归并排序」; 5、对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。 6、每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。 7、拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。

5、Yarn默认的调度器了解多少?

1、FIFO Scheduler:先进先出调度器:优先提交的,优先执行,后面提交的等待【生产环境不会使用】 2、Capacity Scheduler:容量调度器:允许看创建多个任务对列,多个任务对列可以同时执行。但是一个队列内部还是先进先出。【Hadoop2.7.2默认的调度器】 3、Fair Scheduler:公平调度器:第一个程序在启动时可以占用其他队列的资源(100%占用),当其他队列有任务提交时,占用资源的队列需要将资源还给该任务。还资源的时候,效率比较慢。【CDH版本的yarn调度器默认】

6、Hadoop的基准测试你做过吗?

对HDFS读写性能和MR计算能力测试。 测试jar包在hadoop的share文件夹下。

7、碰见Hadoop宕机的问题你是怎么处理的?

1、 如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。 2、调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB) 3、 如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。 4、高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

8、碰见MR的数据倾斜你是怎么处理的?

1、提前在map进行combine,减少传输的数据量 2、数据倾斜的key 大量分布在不同的mapper 2.1「局部聚合加全局聚合」 二次mr,第一次将key随机散列到不同 reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。 这个方法进行两次mapreduce,性能稍差 2.2「增加Reducer,提升并行度」 (JobConf.setNumReduceTasks(int)) 2.3「实现自定义分区」 根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

9、mapreduce为什么分两部分,为什么不直接map或直接reduce?

是为了实现分布式计算,提高计算效率。 很多情况下都是需要对整个数据集进行计算操作,单单的分成每个单独的小部分虽然能提高计算效率,但是导致无法完成实际需求,是没有任何意义的, 所以添加一个reduce阶段,负责将分成多个部分计算的结果汇总进行处理,使得更加能满足一般需求。

10、小文件对HDFS的影响有哪些,你是怎么去处理小文件的?

1、HDFS小文件影响 影响NameNode的寿命,因为文件元数据存储在NameNode的内存中 影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务 2、数据输入小文件处理 2.1合并小文件:对小文件进行归档(Har)、自定义Inputformat将小文件存储成SequenceFile文件。 2.2 采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景 2.3对于大量小文件Job,可以开启JVM重用

11、你对Hadoop熟吗?

接下来还有很多大数据组件的灵魂拷问 准备好了吗?各位小伙伴们!!! 咱们下期再见!

0 人点赞