hadoop面试常见问题及相关总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YQlakers/article/details/75645505

1.       Map任务将其输出写入本地磁盘,而非HDFS,为什么?

答:因为map的输出是中间结果:该中间结果由reduce任务处理后才产生最终的结果。

而且一旦作业完成,map的输出结果就可以删除。因此如果把它存储在HDFS中并实现备份,难免有小题大做。

2.       为什么最佳分片大小应该和块(block)大小相同(hadoop2.x默认是128Mb,hadoop1.x是64Mb)?

答:因为它是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,因此分片中的部分数据需要数据通过网络传输到map任务节点。与本地数据运行整个map任务相比,这种方法显然效率更低。

3.       Combiner的作用是什么?

答:Combiner属于优化方案,把map的输出结果进行合并之后作为reduce的输入,减少map和reduce任务之间的数据传输,不管调用combiner多少次,reducer的输出结果都是一样的。

4.       为什么HDFS不适合存储小文件?

答:由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件的总数受限于namenode的内存容量,根据经验,每个文件、目录和数据块的存储信息大约占150个字节。所以大量的小文件会占用大量的namenode的内存空间,因此HDFS不适合存储大量的小文件。

5.       为什么HDFS中的块如此之大的好处和坏处?

答:首先是好处:HDFS中的块比磁盘中的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个有多个块组成的文件的时间取决于磁盘传输速率。

         坏处:如果块(block)的大小过于大之后,有可能会造成在读取相关数据的时候队某个块同时产生大量的IO请求,导致阻塞。

6.       Hadoop为namenode容错提供的两套机制?

答:第一种机制备份那些组成文件系统元数据持久状态的文件。Hadoop可以通过配置使namenode在多个文件系统上保存数据的持久状态。这些写操作是实时同步的,是原子操作。一般的配置时,将持久的状态写入本地磁盘的同时,写入一个远程挂在的网络文件系统(NFS)。

         第二种可行的方法就是运行一个辅助的namenode,但它不能被用作namenode,这个辅助的namenode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。这个辅助的namenode一般在另外一台单独的物理计算机上运行,因为它需要占用大量的CPU时间与namenode相同容量的内存来执行合并操作。它会保存合并后的命名空间镜像的副本,并在namenode发生故障时启用。但是,辅助namenode保存的状态总是滞后于主节点,所以在主节点全部失效的时候,难免会丢失部分数据。在这个时候一般情况是,把存储在NFS上的namenode元数据复制到辅助namenode并作为新的主namenode运行。

7.       HDFS副本存放策略?

答:Hadoop默认的布局策略是在运行客户端的节点上放置第一个副本(如果客户端运行在集群之外,就随机选择一个节点,不过系统会避免挑选那些存储太满或太忙的节点)。第二个副本放在与第一个不同且随机另外选择的机架中的节点上,第三个副本与第二副本放在同一机架上,且随机选择另外一个节点。其他副本放在集群中随机选择的节点上,不过系统会尽量避免在同一个机架上放太多副本。

8.       HDFS文件压缩的好处?

答:减少存储文件所需要的磁盘空间,并加速数据在网络和磁盘上的传输。

9.       应该使用哪种压缩格式?

答:使用容器格式,例如顺序文件、RCfile或者Avro数据文件,所有这些文件格式同时支持压缩和切分。通常最好与一种快速压缩工具联合使用,例如LZO,LZ4,或者Snappy

         使用支持切分的压缩格式,例如bzip2或者使用索引实现切分的压缩格式,例如LZO

         在应用中将文件切分成块,并使用任意一种压缩格式为每个数据块建立压缩文件(不论它是否支持切分)。这种情况下,需要合理选择数据块的大小,以确保压缩后数据块的大小近似于HDFS块的大小

对于大文件来说,不要使用不支持切分整个文件的压缩格式,因为会失去数据的本地特性,进而造成MapReduce应用效率低下。

10.    RPC序列化格式的4大理想属性?

答:紧凑---紧凑格式能充分利用网络带宽(数据中心最稀缺的资源)。

         快速---进程间通信新城了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是最基本的。

         可扩展---以可以透明地读取老格式的数据。

         支持互操作---以可以使用不同的语言读/写永久存储的数据。

11.    安装hadoop的步骤及相关需要配置的文件?

答:安装步骤

         一、            配置hosts文件

二、            建立hadoop运行帐号

三、            配置ssh免密码连入

四、            下载并解压hadoop安装包

五、            配置namenode,修改site文件(core-site.xml,hdfs-site.xml, mapred-site.xml)

六、            配置hadoop-env.sh文件(JDK)

七、            配置masters和slaves文件

八、            向各节点复制hadoop

九、            格式化namenode

十、            启动hadoop

十一、     用jps检验各后台进程是否成功启动

十二、     通过网站查看集群情况

主要修改配置文件为:core-site.xml, hdfs-site.xml,mapred-site.xml。

12.    Mapreduce程序性能调优的方法?

答:mapper的数量、reducer的数量、combiner、中间值的压缩(map输出压缩)、自定义序列、调整shuffle相关参数(调整环形缓冲区的大小、减少溢写的次数、io.sort.factor 合并文件时最多合并的流的数量等)、reduce端的性能调优、推测执行(默认是启用的),partition(分区)

13.    经典MapReduce中的失败?

答: 运行任务失败---map任务或者reduce任务中的代码异常、子进程JVM突然退出等。

         tasktracker失败---tasktracker崩溃或者运行过于缓慢或者运行失败次数过多等。

         Jobtracker失败---最为严重,它是一个单点故障问题,因此这种情况下作业必然是失败的。YARN进一步改善了这种情况,它的设计目标就是消除了单点失败的可能性。

14.    YARN中的失败?

答:任务运行失败--- map任务或者reduce任务中的代码异常、子进程JVM突然退出等。

Application master 运行失败

         Node manager 运行失败

         Resouragemanager运行失败

15.    Mapreduce中溢写和combiner发生在什么时候?

答案:首先每个map任务都有一个环形缓冲区用于存储任务输出,默认大小为100MB,此值可以通过io.sort.mb属性来调整。一旦缓冲内容达到阈值(io.sort.spill.percent,默认为0.8),一个后台线程便开始把内容溢写(spill)到磁盘。在溢写到磁盘过程中,map输出继续写到缓冲区,但如果在此期间缓冲区被填满,map会被阻塞直到写磁盘过程完成。在写磁盘之前,线程会根据数据最终要传的reducer把数据划分成相应的分区(partition)。在每个分区中,后台线程按键进行内排序,如果有一个combiner,它就在排序后的输出上运行。运行combiner之后的输出更为紧凑,因此减少写到磁盘的数据和传递给reducer的数据。

16.    Reducer怎么知道要从哪台机器上取得map输出呢?

答:map任务完成后,它们会通知其父 tasktracker状态已更新,然后tasktracker进而通知jobtracker。(在hadoop2中,任务直接通知其application master)。这些通知都是通过心跳机制传输。Reducer中的一个线程定期询问jobtracker以便获取map输出的位置,直到获得所有输出位置。

17.    什么是“推测执行”?

答:当一个作业由几百或几千个任务组成时,可能出现任务执行缓慢,当一个任务执行比平均执行速度慢的时候,启动另一个相同的任务作为备份(当所有的任务都已经启动之后),其中一个任务完成之后,任何正在运行的重复任务将被终止,默认情况下是启动的。这就是推测执行。

18.    Hadoop的skipping mode是什么?具体的运行机制是什么?

答:大型数据集经常有少数坏的数据,比如字段确实等,但是这些少数的坏的数据并不影响最终的结果,但是在运行mapreduce的时候却会出现异常和失败,为了解决这个问题,skipping mode来了,启动是skipping mode之后,任务将正在处理的记录报告给tasktracker。任务失败时,tasktracker重新运行该任务,跳过导致任务失败的记录。由于额外的网络浏量和记录错误以维护失败记录范围,所以只有在任务失败后两次之后才会使用skipping mode。

具体的运行机制:

a)               任务失败

b)               任务失败

c)               开启skipping mode。任务失败,但是失败记录有tasktracker记录保存。

d)               任然启用skipping mode。任务继续执行,但跳过上一次尝试中失败的坏记录。

在默认情况下,skipping mode是关闭的。每次任务尝试,skippingmode只能检测出一个坏记录,因此这种机制仅适合检测个别坏记录。为了给skipping mode足够多尝试次数来检测并跳过一个输入分片中的所有坏记录,需要增加最多任务尝试次数(通过mapred.map.max.attemps和 mapred.reduce.max.attemps进行设置)。

Hadoop检测出来的坏记录以序列化文件的形式保存在_logs/skip子目录下的作业输出目录中。

19.    如何选择reducer的个数?

答:对hadoop新手来说,单个reducer的默认配置很容易上手,真实的应用中,都把作业设置成一个较大的数字,否则由于所有的中间数据都会放到一个reducer中,作业处理十分低效。本地运行作业时,只支持0个或者1个reducer。

Reducer最优个数和集群中可用的任务槽数有关。总槽数由集群中的节点数和每个节点的任务槽数相乘得到。每个节点的任务槽数由mapred.tasktracker.reduce.tasks.maxmum属性值决定。

         一个常用的方法就是设置的reducer数比总槽数稍微少一点,给reducer任务留点余地。如果reduce任务很大,比较明智的是使用更多的reducer,使得任务粒度更小,从而使任务的失败不至于显著影响作业的执行情况。

20.    分片大小的计算公式?

答:max(minmumSize,min(maximumSize,blockSize))

在默认一般情况下:mimumSize<blockSize<maximumSize

但是可以通过对上面的参数进行修改来强制修改分片的大小。一般情况下分片的大小为块的大小。

21.    为什么说hadoop适合处理少量的大文件?

答:一个原因是FileInputFormat生成的分块是一个文件或该文件的一部分。如果该文件是小(意思是比hdfs的块小很多),,并且文件数量很多,那么每次map任务只处理很少的输入数据,(一个文件)就会有很多map任务,每次map任务都会造成额外的开销。比如1GB文件分割成16个64MB和100kB的10000个块,10000个文件每次都需要一个map操作,作业时间比一个文件上16个map操作慢几十甚至几百倍。

22.    什么方法可以避免文件切分?

答:第一:修改minmumSize的参数,使之大于文件的大小。第二:使用FileInputFormat具体子类,并且重载isSplitable()方法把返回值设为false。

23.    运行mapreduce的两种方法?

答:job.submit();   ToolRunner.run();

24.    如何用hadoop产生 一个全局排序的文件?

答:最简单的的方法就是使用给一个分区,但是该方法在处理大型文件的时候效率极低。另外还有一个方案,首先创建一系列排好序的文件;其次,串联这些文件;最后生成一个全局排序的文件。主要的思路是使用一个partitioner来描述输出的全局排序。其关键点是如何划分各个分区,一般在划分分区的时候我们会用到采样器。采样的核心思想是只查看一小部分键,获得键的近似分布,并由此构建分区。

25.    Mapreduce的工作机制?

答:当用户启动一个作业,hadoop会把由-files、-archives、-libjars等选项指定的文件复制到分布式文件系统(一般是HDFS)之中。接着,在任务运行之前,tasktracker将文件从分布式文件系统复制到本地磁盘(缓存),使任务能够访问文件。此时,这些文件就被视为“本地化”了。

26.    为什么hadoop不适合在非Unix平台上运行?

答:hadoop的主体是有java语言写成,能够在任意一个安装了JVM的平台上运行。但由于任然有部分代码(如控制脚本)需要在Unix环境下执行,因而hadoop并不适宜以最终产品的形态运行在非Unix平台上。

27.    早期的mapreduce内存模型和YARN在内存管理上的区别?

答:早期的mapreduce会设定固定的map槽数和reduce槽数,但是在YARN中,节点管理器(nodemanager)从一个内存池中分配内存,这意味着可同时运行的数量依赖于内存需求总量,而非槽的数量。YARN会随着计算过程的变化去调整map槽和reduce槽,因为在计算前期可能对map槽的需求很大,而在计算后期对reduce槽的需求更大,因此实现这样细粒度的去控制内存分配使得计算过程更加合理和高效。

28.    早期的hadoop创建检查点的过程?

1)      辅助namenode请求主namenode停止使用edits文件,暂时将新的写操作记录到一个新的文件中。

2)      辅助namenode从主namenode中获取fsimage和edits文件(采用HTTP GET)。

3)      辅助namenode将fsimage文件载入内存,逐一执行edits中的操作,创建新的fsimage文件。

4)      辅助namenode将新的fsimage文件发送回主namenode(采用HTTP POST)。

5)      主namenode用从辅助namenode接受的fsimage文件替换旧的fsimage文件。用步骤一产生的edits文件替换旧的edits文件。同时,还更新fstime文件来记录检查点执行的时间。

注意:检查点的触发条件受两个配置参数控制。通常情况下namenode每隔一个小时(由fs.checkpoint.period属性控制,以秒为单位)创建检查节点。此外,当编辑日志的大小达到了64MB(由fs.checkpoint.size属性设置,以字节为单位)时,即使未到达一个小时也会创建检查点。系统每隔5分钟检查一次编辑日志的大小。

29.    进入和离开安全模式的几种命令?

答:hadoop  dfsadmin  –safemode get;

         hadoop  dfsadmin –safemode wait;

         hadoop  dfsadmin –safemode  enter;

hadoop  dfsadmin  –safemode leave;

30.    在hadoop集群中添加新的节点和删除节点的步骤?

添加节点:

1)      将节点的网络地址添加到include文件中。

2)      运行以下指令:hadoop dfsadmin –refreshNodes

3)      运行以下命令,将经过审核的一些列datanode信息更新至namenode, hadoop mradmin –refreshNodes

4)      以新节点更新slaves文件。

5)      启动新的datanode和namenode。

6)      检查新的datanode是否出现在网页中。

删除节点:

1)      将待解除的节点添加到exclude文件中,不断更新include文件。

2)      执行命令:hadoop dfsadmin –refreshNodes。

3)      使用一组新的审核过的datanode来更新 namenode设置:hadoop mradmin –refreshNode

4)      转到网页界面查看待解除datanode的管理状态是否已经变为“正在解除”,因为此时datanode正在解除的过程中。这些datanode会把它们的快复制到其他的datanode上。

5)      当所有的datanode的状态变味“解除完毕”之后,表明所有的块已复制完成。关闭已经解除的节点。

6)      从include文件中移除这些节点,并运行命令:hadoop dfsadmin –refreshNodes;hadoop mradmin –refreshNodes.

7)      从slaves文件中移除节点。

        

展开阅读全文

没有更多推荐了,返回首页