Hadoop面试题

1.HDFS体系架构

HDFS的体系框架是Master/Slave结构,一个典型的HDFS通常由单个NameNode和多个DataNode组成,但是为备份元数据,一般还有一个secondary namenode(HA模式没有,standby namenode 代替secondary namenode)。

  • NameNode是一个中心服务器,负责文件系统的名字空间的操作,比如打开、关闭、重命名文件或目录,也负责响应客户端的读写请求。同时它也负责维护文件路径到数据块的映射,数据块到DataNode的映射,以及监控DataNode的心跳和维护数据块副本的个数。
  • 集群中的DataNode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组DataNode上。DataNode负责处理文件系统客户端的读写请求。在NameNode的统一调度下进行数据块的创建、删除和复制。
  • secondary namenode 也是在主节点上,负责元数据的checkpoint,每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge,减少namanode启动时间

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

  • 如果是短暂的宕机,可以利用脚本监控,重新启动。
    但是如果是长时间的宕机,那么datanode上的数据已经备份到其他机器上了,这台datanode就是新的机器,可以清理数据文件和状态文件,重新启动。
简单的shell脚本监控:
#!/bin/bash
echo '.......................................'
DataNode=$(jps | grep 'DataNode')
NodeManage=$(jps | grep 'NodeManage')
echo $DataNodey
echo $NodeManage 
echo '.......................................'
if[[-z $DataNode]]; then 
	echo $(date) 'datanode is not running' >>  /home/logs/clusterMonitor.log
	echo $(date) $($HADOOP_HOME/sbin/start-all.sh) >>/home/logs/clusterStart.log
fi
if[[-z $NodeManage]];then	
	echo $(date) 'datanode is not running' >>  /home/logs/clusterMonitor.log
	echo $(date) $($HADOOP_HOME/sbin/start-all.sh) >>/home/logs/clusterStart.log
fi
echo '.......................................'
然后在crontab设置定时执行就行

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

  • 1.应该先看宕机后的损失,如果是宕机后无法访问client,内存中元数据丢失,但磁盘数据还在,可以将secondary namenode 的工作目录copy到namenode的工作目录,恢复上一次checkpoint的数据,恢复大部分数据,但是不能恢复所有的数据,因为有些数据还没做checkpoint
  • 2.也可以设置namenode的工作目录在多块磁盘上,那么edits日志文件就会同时写在多块磁盘上,如果一个磁盘坏了,另一块磁盘上还保存着数据。这两个磁盘是可以并发的,磁盘IO不会起冲突。
  • 3.最终解决方案是在建立集群初期建立namenode ha高可用模式

4.namenode对元数据的管理

namenode对元数据的管理采用了3种存储形式:

  • 1.存储在内存中完整的元数据meta data
  • 2.存储在磁盘namenode目录中的准完整的元数据镜像fsimage
  • 3.存储在jn中用来记录数据变动的操作日志edits文件。 当客户端对hdfs中的数据进行操作变动时,操作记录首先记录在edits日志中,当客户端操作成功后,相对应的元数据才会更新到metadata。

5.hadoop中combiner和partition的作用

  • 1.combiner 在下面情况下会执行combine方法:1.map端输出数据根据分区排序完成后,在写入文件前会combine操作(前提是要求设置)2.如果map输出比较大,溢出文件大于3,在merge的过程前也会执行combiner。

作用:先在map端把相同key的键值对先合并计算,计算规则与reduce一样,这样就避免了在有巨大key数据的时候,shuffle的时候,reduce取数的时候小号巨大网络流量,避免了出现1亿个key值有1亿个reduce任务的情况。

  • 2.partition :对于map输出的每一个键值对,系统都会给一个通过计算key的hash值得出的partition值,后续reducer会根据partition值来下载map输出文件。同时也可以通过key对reducer的个数取模(key%r)进行自定义partition,保证一段范围的key由同一个reducer处理,以此达到负载均衡。

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

  • 1.调优参数 set hive.map.aggr=true; 这个参数会在map阶段做部分聚合,能提高聚合效率但会耗费更多内存.set hive.groupby.skewindata=true; 这个参数设定为true时候,生成的查询计划会有两个MRjob。

第一个MRjob中,会现在第一个shuffle过程partition 的时候随机给key打标记,使得每个key随即均匀的分不到各个reduce上计算,但是这样也只是完成部分计算。但是因为相同key没有分配到相同的reduce,所以需要第二次mapreduce,这次计算就回归正常了,但是数据不均匀的问题在第一次mapreduce的时候就改善了。

  • 2.在key上进行处理,先在map阶段把造成倾斜的key分成多组,例如aaa这个key,map的时候随机在aaa后面加上1,2,3,4随机数字,把key分成四组,先进行一次运算,之后再恢复key进行最终运算。
  • 3.自定义分区partition,原来的key上加上一个随机数,再利用reducer个数进行求余打散数据,但是这是前提是任务要求不需要相同key必须分发到同一个reducer上。
  • 4.join操作中,使用map join再map阶段先join,避免再reduce卡住,
在hive就调参数设置两个mr,在mr的话就给key设置随机值令key随机分配给redue

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

shuffle过程包括在map阶段和reduce阶段,大致可以分为6个阶段

  • 1.在collect阶段,将map task的结果标记号partition值后,数据输入到默认100M的环形缓冲区,以键值对保存。
  • 2.spill阶段,当内存中环形缓冲区的数据量到达一定阈值后,将数据溢写spill到磁盘之前,需要对数据按分区号排序,再按key排序,如果配置了combiner,还会有相同分区和key的数据进行排序,如果有压缩设置,还会对数据进行压缩。
  • 3.Combiner 阶段,等map task 的数据处理完后,会对所有的map进行一个合并操作,以确保一个Map task只产生一个map中间结果集。
  • 4.copy阶段,当mapper完成的任务数据占总mapper数的百分之五时候,job tracker就会默认5个reducer线程去已经完成的mapper节点复制数据,数据默认保存在内存中的缓冲区,当缓冲区到了一定阈值,数据溢写到磁盘。
  • 5.Merge阶段,再reducer复制数据的时候,会在后台开启两个线程对内存中的数据和本地的数据文件进行合并。
  • 6.sort阶段,在对数据合并的同时,会进行排序操作,因为map阶段做了局部的排序,所以reduce需要做一次归并排序就能保证copy的数据的整体有序性。

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

  • 1.mapper的数据量是由1.输入文件的数量 2.输入文件的大小 3.配置参数:minsize ,maxsize,blocksize。

计算spiltsize决定的splitSize = Math.max(minSize, Math.min(maxSize, blockSize));。一般还能设置合并器参数

  • 2.reduce数量是由参数配置的,conf.setNumReduceTasks(int num)

9.MapReduce优化经验

  • 1.数据输入解决小文件:1.在hive中设置合并器大小, 在hadoop中使用CombineTextInputFormat
  • 2.map阶段:1.减少spill次数,通过调整io.sort.mb及sort.spill.percent 参数值,增大环形缓冲结构内存的大小和spill的阈值比,减少spill次数,减少磁盘IO。2.减少Merge次数,调整io.sort.factor,增大merge合并的文件数目,减少merge的次数,缩短mr时间。 3.在不影响业务的情况下,使用combiner,先combine处理,减少IO
  • 3.copy阶段,1.对spill和merge的数据文件进行压缩处理,这样能减少网络IO。2.调大reduce下载数据的并行度和下载最大等待时间。
  • 4.reduce阶段:1.合理设置reducer数目,太少会让task等待延长处理时间,太多会造成mapper和reducer任务之间抢占资源。2.设置mapper和reducer共存,调整参数,是的map在运行到一定程序后,reduce也开始运行,减少reduce的等待时间3.设置reducer的缓冲阈值的比例,reducer的溢写到磁盘的阈值计算是整个jvm reducer的内存空间*参数设计阈值比,增大这个阈值比,减少磁盘IO。

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

  • 1.求和,求最大值的时候可以使用combiner,减少map的输出,缓解网络IO
  • 2.求平均值的时候就不能使用combiner,因为combine的时候会使用reduce的逻辑,先行求了平均值

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

HDFS的体系框架是Master/Slave结构,一个典型的HDFS通常由单个NameNode和多个DataNode组成,但是为备份元数据,一般还有一个secondary namenode。

  • 1.存储在hdfs系统上的文件,在文件路径上是一个文件,但是文件内部会被按blocksize切分为128m的block存储在不同的节点上,同时block还存在副本文件,副本数默认为3.
  • 2.副本存放策略一般是:第一个副本如果请求方所在机器是一个datanode的话就直接存放在本地,否则就在集群中随机选择一个datanode,第二个副本放置在第一个副本的同一个机架但是不同节点,第三个副本放到不同机架不同节点。

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

写入数据的时候datenode宕机并不会重新分配datanode,而是会将已写的数据写进queue,并且将挂掉的datanode移除pipiline,将数据写入剩余的datanode中,等待写入数据完成后,namenode会检查写入的数据,如果发现副本数没有达到指定的数量后,会重新找datanode保存副本。

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

1.先将大量的数据集按照hash分成多个小数据集
2.再统计每个小数据集的key,value,
3.求出每个小数据集的topN.
4.最后在收集所有的TopN汇集一起,求出里面的真正的topN。

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

  • 1.namenode,hadoop的主服务器,负责文件系统的名字空间的操作,比如打开、关闭、重命名文件或目录,也负责响应客户端的读写请求。同时它也负责维护文件路径到数据块的映射,数据块到DataNode的映射,以及监控DataNode的心跳和维护数据块副本的个数
  • 2.secondary namenode,提供周期checkpoint,帮助namenode合并editslog和fsimage,减少namenode启动时间。
  • 3.datanode,一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组DataNode上。DataNode负责处理文件系统客户端的读写请求。在NameNode的统一调度下进行数据块的创建、删除和复制。
  • 4.resourcemanager(job tracker),负责调度datanode上的工作,每个datanode上有一个task tracker,他们执行实际工作。
  • 5.nodemanager(task tracker),执行实际任务。
  • 6.dfsZKfailoverController(zkfc),监控namenode状态,并及时的将namenode健康状态通知zk,有决定ha模式下active节点的权力。
  • 7.jounal Node(jn),在ha模式下存放着namenode的edits log文件。

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

1.job是我们对整个mr程序的抽象封装。
2.task是job运行的时候,每个阶段的具体实例,例如map task和reduce task,maptask和reducetask有着多个并发的实例。

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

1.按照jdk,配置环境遍历
2.关闭防火墙
3.配置静态ip
4.配置host文件
5.设置ssh免密码登录
6.解压hadoop安装包,配置环境变量
7.修改配置文件hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml
8.格式化namenode
9.启动hadoop

17.fsimage和edit的区别

fsimage保存了最新的元数据检查点。edits保存自最新检查点后的命名空间的变化。

18.yarn的三大调度策略

  • 1.FIFO,先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
  • 2.Capacity,容量)调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
  • 3.Fair在Fair(公平)调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。

19.一个文件只有一行,但是这行有100G大小,mr会不会切分,我们应该怎么解决

在TextInputFormat中可以看到,在getRecordReader函数中调用了LineRecordReader这个类。我们注意观察在传入的参数中有一个delimiter参数,这个参数就是用来指定分割符的(具体可以查看LineRecordReader中实现对文件分割的实现),所以我们可以自己定义一个类MyInputFormat继承FileInputFormat

20.hdfs HA机制,一台namenode宕机了,joualnode,namenode,edit.log fsimage的变化(答案待确定此题)

  • 1.jn,jn中保存着namenode启动后的editslog文件,没宕机前是activenamenode写入,standby namenode读出,等到namenode切换后,读写节点会变化,jn要保证只有一个namenode写入editslog到jn中
  • 2.active namenode被zkfc强行杀死,standby namenode 被zkfc转换为active namenode。
  • 3.edit.log:旧的active namenode,滚动正在写的edits log。新active namenode 会生成edits.inprogress记录后面新的日志变化。
  • 4.fsimage:新active namenode 会把滚动的最新edits log 和其他edits log 拉取,然后和自身最新的fsimage合并成最新的fsimage
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值