上一篇文章为大家总结了一些关于Hive的热门考点,得到了一些朋友的肯定与转发,菌菌就觉得花时间去做这些知识整合是非常有价值,有意义的一件事。本篇文章,让我们有幸一起来阅读一下,该怎么准备Hadoop的内容,才有机会在面试过程占据上风。
这是一个看着不起眼,实则“送命题”的典型。往往大家关于大数据的其他内容准备得非常充分,反倒问你什么是Hadoop却有点猝不及防,回答磕磕绊绊,给面试官的印象就很不好。另外,回答这个问题,一定要从事物本身上升到广义去介绍。面试官往往通过这个问题来判断你是否具有最基本的认知能力。
Hadoop是一个能够对大量数据进行分布式处理的软件框架。以一种可靠、高效、可伸缩的方式进行数据处理。主要包括三部分内容:Hdfs,MapReduce,Yarn
Hadoop在广义上指一个生态圈,泛指大数据技术相关的开源组件或产品,如HBase,Hive,Spark,Zookeeper,Kafka,flume…
被问到也不要惊讶,面试官往往通过你对于不同技术的差异描述,就能看出你是不是真的具有很强的学习能力。
Hadoop | Spark | |
---|---|---|
类型 | 基础平台,包含计算,存储,调度 | 分布式计算工具 |
场景 | 大规模数据集上的批处理 | 迭代计算,交互式计算,流计算 |
价格 | 对机器要求低,便宜 | 对内存有要求,相对较贵 |
编程范式 | MapReduce,API 较为底层,算法适应性差 | RDD组成DAG有向无环图,API较为顶层,方便使用 |
数据存储结构 | MapReduce中间计算结果存在HDFS磁盘上,延迟大 | RDD中间运算结果存在内存中,延迟小 |
运行方式 | Task以进程方式维护,任务启动慢 | Task以线程方式维护,任务启动快 |
这个完全就是基于个人的经验之谈的,如果平时没有细致研究过这些,这个问题一定是答不好的。
由于Hadoop的飞速发展,功能不断更新和完善,Hadoop的版本非常多,同时也显得杂乱。目前市面上,主流的是以下几个版本:
Apache 社区版本 完全开源,免费,是非商业版本。Apache社区的Hadoop版本分支较多,而且部分Hadoop存在Bug。在选择Hadoop、Hbase、Hive等时,需要考虑兼容性。同时,这个版本的Hadoop的部署对Hadoop开发人员或运维人员的技术要求比较高。
Cloudera 版本 开源,免费,有商业版和非商业版本,是在Apache社区版本的Hadoop基础上,选择相对稳定版本的Hadoop,进行开发和维护的Hadoop版本。由于此版本的Hadoop在开发过程中对其他的框架的集成进行了大量的兼容性测试,因此使用者不必考虑Hadoop、Hbase、Hive等在使用过程中版本的兼容性问题,大大节省了使用者在调试兼容性方面的时间成本。
Hortonworks 版本 的 Hadoop 开源、免费,有商业和非商业版本,其在 Apache 的基础上修改,对相关的组件或功能进行了二次开发,其中商业版本的功能是最强大,最齐全的。
所以基于以上特点进行选择,我们一般刚接触大数据用的就是CDH,在工作中大概率用 Apache 或者 Hortonworks。
一般能问出这种问题的面试官都是“狠人”,基本技术都不差,他们往往是更希望应聘者能在这些“细节”问题上脱颖而出。
Hadoop1.0由分布式存储系统HDFS和分布式计算框架MapReduce组成,其中HDFS由一个NameNode和多个DateNode组成,MapReduce由一个JobTracker和多个TaskTracker组成。在Hadoop1.0中容易导致单点故障,拓展性差,性能低,支持编程模型单一的问题。
Hadoop2.0即为克服Hadoop1.0中的不足,提出了以下关键特性:
同时,新版本的Hadoop对于HDFS做了两个非常重要的增强,分别是支持异构的存储层次和通过数据节点为存储在HDFS中的数据提供内存缓冲功能
相比于Hadoop2.0,Hadoop3.0 是直接基于 JDK1.8 发布的一个新版本,同时,Hadoop3.0引入了一些重要的功能和特性
限于篇幅原因,这还都只是部分特性,大家多注意菌哥标记颜色的部分,就足以应对面试了。
Hadoop常用的端口号总共就那么几个,大家选择好记的几个就OK了
这个问题实在基础,这里也简单概述下。
在正式搭建之前,我们需要准备以下6步:
准备工作
搭建工作:
这个问题非常基础,同时出现的频率也是异常的高,但是大家也不要被HDFS的读写流程吓到。相信看到这里的朋友,应该不是第一次背HDFS读写繁多的步骤了,菌哥在这里也不建议大家去背那些文字,这里贴上两张图,大家要学会做到心中有图,万般皆易。
MapReduce数据读取并写入HDFS流程实际上是有10步
其中最重要,也是最不好讲的就是 shuffle 阶段,当面试官着重要求你介绍 Shuffle 阶段时,可就不能像上边图上写的那样简单去介绍了。
你可以这么说:
1) Map方法之后Reduce方法之前这段处理过程叫Shuffle
2) Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3)每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。
讲到这里你可能已经口干舌燥,想缓一缓。 但面试官可能对你非常欣赏: 小伙几,看来你对MapReduce的Shuffle阶段掌握很透彻啊,那你跟我再介绍一下你是如何基于MapReduce做Hadoop的优化的,可以给你个提示,可以从压缩,小文件,集群优化层面去考虑哦~
可能你心里仿佛有一万只草泥马在奔腾,但是为了顺利拿下本轮面试,你还是不得不开始思考,如何回答比较好:
slowstart.completedmaps
参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间压缩,可以参考这张图
提示:如果面试过程问起,我们一般回答压缩方式为Snappy,特点速度快,缺点无法切分(可以回答在链式MR中,Reduce端输出使用bzip2压缩,以便后续的map任务对数据进行split)
这里一共也有两个版本,分别是详细版和简略版,具体使用哪个还是分不同的场合。正常情况下,将简略版的回答清楚了就很OK,详细版的最多做个内容的补充:
其中简略版对应的步骤分别如下:
关于Yarn的知识点考察实际上在面试中占的比重并的不多,像面试中常问的无非就Yarn的Job执行流程或者调度器的分类,答案往往也都差不多,以下回答做个参考:
1)Hadoop调度器主要分为三类:
前面刚回答完Hadoop基于压缩,小文件,IO的集群优化,现在又要回答参数优化,真的好烦啊(T▽T)如果你把自己放在实习生这个level,你 duck 不必研究这么多关于性能调优这块的内容,毕竟对于稍有工作经验的工程师来说,调优这块是非常重要的
我们常见的Hadoop参数调优有以下几种:
dfs.namenode.handler.count=20 * log2(Cluster Size)
比如集群规模为10台时,此参数设置为60
这个完全就是基于项目经验的面试题了,暂时回答不上来的朋友可以留意一下:
我们搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试。测试jar包在hadoop的share文件夹下。
相信被问到这里,一部分的小伙伴已经坚持不下去了
但言归正传,被问到了,我们总不能说俺不知道,洒家不会之类的吧٩(๑❛ᴗ❛๑)۶下面展示一种回答,给大家来个Demo。
如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)。
如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。
性能优化和数据倾斜,如果在面试前不好好准备,那就准备在面试时吃亏吧~其实掌握得多了,很多方法都有相通的地方。下面贴出一种靠谱的回答,大家可以借鉴下:
1)提前在map进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
如果导致数据倾斜的key 大量分布在不同的mapper的时候,这种方法就不是很有效了
2)数据倾斜的key 大量分布在不同的mapper
在这种情况,大致有如下几种方法:
第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer 中进行局部聚合,数量就会大大降低。
第二次mapreduce,去掉key的随机前缀,进行全局聚合。
思想:二次mr,第一次将key随机散列到不同 reducer 进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
这个方法进行两次mapreduce,性能稍差。
JobConf.setNumReduceTasks(int)
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer
为了能鼓励大家多学会总结,菌在这里贴上自己平时做的思维导图,需要的朋友,可以关注博主个人微信公众号【猿人菌】,后台回复“思维导图”即可获取。
很高兴能看到这里的朋友,有任何好的想法或者建议都可以在评论区留言,或者直接私信我也ok,后期会考虑出一些大数据面试的场景题,在最美的年华,做最好的自己,我是00后Alice,我们下一期见~~
一键三连,养成习惯~
文章持续更新,可以微信搜一搜「 猿人菌 」第一时间阅读,思维导图,大数据书籍,大数据高频面试题,海量一线大厂面经…期待您的关注!