hadoop相关面试题

4 篇文章 1 订阅
4 篇文章 0 订阅

hadoop相关面试题

1.hdfs写流程

1、client端向namenode请求写入文件;
2、namenode检查文件路径是否正确,client对此是否有对应权限等;如果检查通过通知client可以上传文件,否则返回一个io异常;
3、如果可以上传文件,client将源文件缓存到缓冲区,当缓冲区大于128mb或者文件缓冲完毕,向namenode发起上传第一个块的请求;
4、namenode接收到请求,根据网络拓扑位置选择3个距离client较近的datanode,并将相关信息封装为队列返回给client;
5、client将队首节点取出,然后将队列发送给第一个datanode节点,第一个节点接受到后取出下一个节点,并继续此操作;如果都能正常通过,则由最后一个datanode节点返回ack应答,然后最后第二个,,,,,,直到client接收到ack应答,说明通道建立完成;
6、将数据分成package包发送给第一个datanode;datanode接收到package后,一边将package数据存储到本地,一边继续将package发送给下一个节点;下一个节点继续此操作,到最后一个节点返回完成。
7、client将所有package发送完成后;继续向namenode请求发送第二个block块,继续3-6的操作;
8、如果整个文件都已经上传完成,client向namenode发送文件上传完成,namenode接管对该文件的管理。

2.hdfs读流程

1、client向namenode发送读取文件的请求;
2、namenode检查client读取文件是否合法,不合法返回io异常;如果文件已经读取完毕,返回给client文件读取完成标识;否则返回文件块信息,根据第一个文件块信息,按与client的距离封装成datanode队列返回给client;
4、client向队首的datanode请求数据该文件块;
5、datanode将文件块封装成一个个package包发送给client;
6、client接收datanode的package,如果接收完成;向namnode请求下一个文件块,继续3-6;
7、client获取到namenode返回的读取完成标识则标识文件读取成功,合并各个文件块,获得真正的文件。

3.hdfs的体系结构

Hadoop2.0体系架构发生较大改变(hadoop1.0体系缺陷较大,已基本淘汰),hdfs集群可选的体系架构主要有一下三种,
1、 完全集群模式
Hdfs主要实现了分布式数据存储,主要分为namenode和datanode两种节点;hdfs将一个大文件分块存储,一个块大小默认为128mb;
Namenode:主要负责文件元数据的存储和管理;记录每个文件划分的文件块、文件块对应存储在几台机器;根据datanode的心跳,实现集群数据的负载均衡和错误恢复等;
Datanode:负责文件的具体存储和读取操作;管理分配给自己的文件块;将自己的存活信息(心跳)发送给namenode;
常见的,还可以启用secondarynamenode辅助namenode合并fimagge和edits文件信息。
2、 HadoopHA
上述模式的namenode有单点故障,为了解决namenode出故障则集群失效的问题,我们可以为namenode配置备用节点,当主namenode节点失效时,自动切换到备用namenode继续工作(zookeeper);主namenode工作时,备用namenode拉取namenode的fimage和edits文件备份到自己的机器,实现hdfs的高可用。
3、 联邦模式
问题:namenode一个节点存储元数据是有限的,当集群变得特别大之后,namenode就会成为集群限制;
解决:为了解决这个问题,使用多个小集群组成一个大集群,每个namenode主要管理自己集群元数据即可,极大的扩展了hdfs的存储能力;
缺点:多个namenode,如何进行数据、通信的协调也就成为了一个问题;
扩展:1、linux文件系统先创建/(根)空间,然后在/*上挂载实际的存储空间,因为这些存储空间都是在本地,所以在将多个存储磁盘组合在一起的同时(大量存储),速度也不慢;但是在hdfs集群中,如果采用类似linux文件系统挂载多个集群,网络io或许会直接影响基于hdfs上的其它程序的运行方式。
2、在ip网络世界中,寻址都依赖dns服务器;在hdfs中,在模仿linux文件系统挂载namenode集群的同时,可以采用dns寻址的方式确定集群中namenode及其管理信息的范围,最终/服务器向集群外部提供统一的路径服务,各个namenode负责管理各自的集群元数据,具体的datanode管理分配给自己的具体文件。

4.一个datanode 宕机,怎么一个流程恢复

1、namenode根据心跳感知datanode情况,如果一个datanode心跳超时(宕机);
2、namenode查询自己的元数据找到该datanode负责存储哪几个文件块1、2、3;
3、根据文件块1在元数据中找到集群中其它存储有文件块1的datanode节点A;按照负载均衡原则找到一个可以存储该文件块的其它节点B;
4、命令节点A将文件块1复制到节点B;
5、将下一个文件块继续3-4流程;如果文件块全部复制完毕,该次故障处理完毕。

5.hadoop 的 namenode 宕机,怎么解决

可以分为两种情况:
1、 没有hadoopHA,namenode节点和secondarynamenode不在同一个节点,namenode宕机,可以从secondarynamenode节点获取上一次合并fsimage和edits文件的数据。这个会丢失上一次拉取文件到namenode宕机这段时间里面的数据。如果没有secondarynamenode,则只能尝试还原以前可能备份过的数据。
2、 如果有hadoopHA,zookeeper集群监控namenode,如果宕机则切换备用namenode为激活状态,此时备用namenode对外提供服务;数据不会丢失。

6.namenode对元数据的管理

元数据有文件名、路径、大小、分块等信息。
Namenode主要使用两个表存储元数据,块表:文件块拥有存储该文件块的所有datanode节点;节点表:节点编号拥有该节点存储的所有文件块。这样的存储结构即可以快速的根据文件块获取对应的datanode节点,也可以快速的根据datanode获取对应的文件块。
1、对元数据进行直接增删改查等;对元数据的管理操作会通过心跳包具体发送到具体的datanode进行相应操作,从而完善对元数据的操作;
2、写文件时也可以快速的、负载均衡、根据拓扑距离的从节点表查询到datanode;增加元数据;
3、当client读文件,namenode可以在块表中快速查询datanode;查询元数据;
4、当某个datanode宕机时,namenode直接在节点表查找该节点存储的文件块,然后在块表中查找拥有这些块的datanode,命令datanode将这些块复制给其它方便存储的datanode;更改元数据;
5、namenode提供文件管理api给外部使用,将具体文件管理功能转换成对元数据具体的增删改查等。

7.元数据的checkpoint

前提:namenode接收到client命令后不直接对元数据fsimage进行修改,而是将命令记录到edits文件中;为了避免edits文件变得过大,需要secondarynamenode辅助namenode合并fsimage和edits文件;
Checkpoint:合并文件需要一个时机检测设置,这就是checkpoint,checkpoint一般有1小时或者100万行命令两种检测点;当距离上次合并1小时后或者edits文件行达到100万时,通知secondarynamenode合并fsimage和edits文件。
元数据的checkpoint之后可以使edits文件不会超过100万行,启动hdfs使加载速度不会很慢。

8.yarn资源调度流程

对内资源调度,实现yarn集群自身的管理和支持对外提供的功能(对大数据运算框架的资源调度)的具体实现。
对内:nodemanager监控本节点的cpu、内存等使用情况并将这些情况作为心跳包发送给resourcemanager,resourcemanager对这些情况进行管理;
对外:当外部的运算框架申请资源时,resourcemanager根据内部管理情况选择比较空闲的datanode创建资源;当某个运算资源占用过多则杀死该进程,当某个资源不可用时yarn提供新的资源进行运算;

9.hadoop中combiner和partition的作用

Combiner:是在mapper端执行的reducer程序,他和reducer使用的是同一份代码,作用是在mapper提前执行reducer程序,减少数据量进而减少网络io消耗,当提前执行reducer程序有可能会打乱后面的运行结果,所以只在求单词数、最大值等不会影响后面结果的运算时才能使用combiner。
Partition:是分区器,mapper输出值的key经过分区器的划分,不同分区的数据落到不同的reducer;一个好的分区器应该将数据均衡的落到各个reducer中。

10.用mapreduce怎么处理数据倾斜问题?

数据倾斜:当大量数据聚集在一个reducer中,而其他reducer处理的数据很少,这就是ampreduce程序的数据倾斜;
处理:
1、 将原本应该划分到一起的数据拆分成分到多个reducer的数据,mapreduce程序默认的分区器是hash分区器,根据key的hash值%reducer数分区,我们可以自定义分区器,重新规划分区;
2、 加盐,通过加盐改变原数据的特征值进而使数据重新分布。

11.shuffle 阶段,你怎么理解的

Shuffle:mapper输出的数据到reducer输入的过程,主要通过分区、排序、归并等程序将mapper输出的数据整合成reducer输入的相同key及对应各自value值组成的列表。
Mapper端shuffle:map函数输出数据缓存在内存的环形缓冲区,当达到80%时溢出为一个个小文件,对这些小文件分区、排序、合并(以及可能存在的combiner),然后发送给reducer。
Reducer端shuffle:从所有mapper中拉取自己分区应该获得的数据,再归并,传到reducer的reduce函数。

12.Mapreduce 的 map 数量 和 reduce 数量是由什么决定的 ,怎么配置

Map:由task数决定;
Reduce:由numreducer决定,默认为1。

13.MapReduce优化经验

小文件优化:在inputformat将小文件合并为大文件,而不遵循每个文件都占一个map;
Mapjoin优化:通过distributecache将小文件缓存到内存中,直接在mapper端join表,不用执行复杂的shuffle过程;能在map端就完成的工作,尽量在map端完成,避免多余的运算;
压缩/网络io优化:在mapper输出端压缩数据减少网络io(reducer输入端配置解压器),在outputformat中压缩数据减少磁盘存储和网络io。
数据倾斜/分区优化:如果默认分区器不适合业务数据,则根据业务定义分区器,使数据均衡分布到reducer中。

14.分别举例什么情况要使用 combiner,什么情况不使用?

1、在map端使用combiner(reducer)不会影响最终值,即可使用combiner,否则不能使用;比如求最大/小值,求单词数;
2、在map端的数据有冗余的情况下使用combiner,反之则不用;此条应该注意到map端combiner减少数据是避免网络io,除非没有冗余或者冗余非常少,否则应该尽量使用combiner以减少网络io。

15.MR运行流程解析

1、inputformat处理输入数据并传给map函数;
2、map函数:map通常是自定义代码处理数据,并根据需要将处理后的数据传给reducer;
3、shuffle:在map输出端将数据经过分区、排序、归并等程序转换成reduce输入数据;
4、reduce函数:自定义代码聚合map处理过的数据,并将结果传输给outputformat;
5、outputformat:从reducer端接收数据并将这些数据存储到目标文件。

16.简单描述一下HDFS的系统架构,怎么保证数据安全?

1、文件安全:
备份:通过在不同机器甚至不同机架上保存多个备份实现数据安全(还能并发读取),一个经典3备份策略就是在本机保存一份文件,在本机架的其它机器上保存一份文件,然后在其它机器里面随机选择一个保存一份文件;
副本数:当一台机器宕机,namenode会将该机器保存的所有文件块重新给其它机器复制一份,始终维持设定的副本数。
2、元数据安全:
解决namenode单点故障:为主namenode提供一个备用namenode,当主namenode宕机时,将备用namenode切换成激活状态,对外提供服务,保证了元数据安全。

17.在通过客户端向hdfs中写数据的时候,如果某一台机器宕机了,会怎么处理

如果某台机器宕机,将package包数据重新返回client队列,跳过该节点建立通道,继续发送package包数据。

18.Hadoop优化有哪些方面

1、小文件优化:通过har打包程序将小文件打包成大文件,避免小文件占用元数据空间;
2、hadoopHA优化:为namenode和resourcemanager节点配置备用节点实现hadoopHA;
3、压缩优化:将文件压缩可以减少存储空间和网络传输消耗;
4、mapreduce程序优化:将小文件缓存到内存中;数据倾斜优化。

19.大量数据求topN(写出mapreduce的实现思路)

将需要排序的值当作key经过shuffle二次排序降序排列,这样reduce处理的第一个数据就是第一大,第二个就是第二大,,,,,,
注意:每一个key对应的values可能包含多个排序对象,此时每个排序对象都需要考虑。一般有三种策略:
1、 row_number:遍历values元素时,直接按照原顺序直接获取n个排序对象,数据连续、不重复;
2、 rank:将values里面的所有元素安排为同一个排序值,但排序依据依然递增,即下一个key的排序值为原排序值+values.length+1,数据重复、不连续;
3、 dense_rank:将values里的所有数据安排为同一个排序值,而排序依据不变,即下一个key的排序值为原排序值+1+1,数据重复、连续。

20.列出正常工作的hadoop集群中hadoop都分别启动哪些进程以及他们的作用

1、namenode:管理hdfs文件的元数据;
2、datanode:管理hdfs文件的具体数据文件;
3、secondarynamenode:替namenode合并fsimage和edits文件;
4、resourcemanager:管理hadoop集群的运算资源和存储资源,为大数据运算提供统一的资源调度、管理服务;
5、nodemanager:收集本机cpu、磁盘等设备的使用情况,作为心跳发送给resourcemanager。

21.Hadoop总job和Tasks之间的区别是什么?

Job:是对一个mapreduce程序的抽象封装;设置文件的输入、输出,指定map、reduce、等等
Tasks:在mapreduce程序运行的各个阶段的实例,如map task,reduce task;map task和reduce task分别也还有其它实例,分布式的完成具体任务。

22.Hadoop高可用HA模式

HadoopHA主要分为hdfsHA和yarnHA,分别是为了解决namenode单点故障和resourcemanager的单点故障;基本都采用了主备模式;
1、 HdfsHA:为namenode节点配置一个备用namenode,如果主namenode出现了故障,自动将备用namenode激活,对外提供服务;
2、 YarnHA:同上,也是给resourcemanager节点配置一个备用节点,出现故障时,激活备用resourcemanager,继续对外提供服务。

23.简要描述安装配置一个hadoop集群的步骤

1、下载、解压jar包到预定目录;
2、linux基础配置:按照java及配置环境变量;配置集群的无密码登陆;服务器集群的网络规划与配置;等等;
3、写hadoop配置文件,主要为3+4+1,即3个.sh文件,4个.xml文件,1个slaves文件;

24.fsimage和edit的区别

Fsimage:存储的实际元数据;不被操作直接改变;
Edit:存储的对元数据的操作;先将操作写入edit,合并时才真正指向操作;

25.yarn的三大调度策略

FIFO Scheduler

把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。

但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。

Capacity Scheduler

容量调度,维持多个队列,为每个队列提前分配固定比例的资源,允许多个任务同时运行,但使用的资源只有该队列拥有的资源量;如果其它队列空闲,允许借用小部分资源,但其它队列有任务时借用的资源马上被还回。

这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。

Fair Scheduler

我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。

从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。

26.hadoop的shell命令用的多吗?说出一些常用的

1、Hadoop fs -ls:显示目录下的文件;
2、hadoop fs -cat:显示文件的数据;
3、hadoop fs -mkdir:创建目录,-p可以强制创建原来没有的上级目录;
4、hadoop fs -rm [-r]:删除文件;如果加上-r则递归删除,主要用于目录,谨慎使用,尤其是对/目录;
5、hadoop fs -chown:改变文件所属人;
6、hadoop fs -put:将本地文件系统的文件上传到hdfs上;
7、hadoop fs -get:将hdfs上的文件下载到本地文件系统中。

27.用mr实现用户pv的top10?

假设有第一列数据时用户id,第二列是用户pv,分隔符为\t
1、 mr接收行号和行数据,将行数据按文件分隔符\t切分行数据,得到splits[0],splits[1],0为id,1为用户pv;
2、 将pv作为key,id作为value,输出到reduce函数;设置shuffle过程中二次排序为降序排序;
3、 Reduce函数获取pv,id键值对,一个pv可能对应多个id,根据需求处理多个id;
4、 在reducer类创建一个变量rank,记录获取的数据个数,如果rank值大于10,则将数据放弃;如果小于10,则将pv和id写入到文件中。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值