大数据面试题之葵花宝典------Hadoop

1. hdfs读写流程

hdfs写流程
在这里插入图片描述

1、客户端跟namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,
   然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个
   packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

hdfs读流程
在这里插入图片描述

1、client跟namenode通信查询元数据,找到文件块所在的datanode服务器

2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流

3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)

4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件
2. hdfs的体系结构
1、hdfs有namenode、secondraynamenode、datanode组成。为n+1模式
2、NameNode负责管理和记录整个文件系统的元数据
3、DataNode 负责管理用户的文件数据块,文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干
   台datanode上,每一个文件块可以有多个副本,并存放在不同的datanode上,Datanode会定期向Namenode
   汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
4、HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
5、secondraynamenode负责合并日志
3. 一个datanode 宕机,怎么一个流程恢复
Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,
那么datanode上的数据应该已经被备份到其他机器了,那这台datanode就是一台新的datanode了,
删除他的所有数据文件和状态文件,重新启动。
4. hadoop 的 namenode 宕机,怎么解决
先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,
如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。
但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
5. namenode对元数据的管理
namenode对数据的管理采用了三种存储形式:

   1、内存元数据(NameSystem)

   2、磁盘元数据镜像文件(fsimage镜像)

   3、数据操作日志文件(可通过日志运算出元数据)(edit日志文件)
6. 元数据的checkpoint
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,
并加载到内存进行merge(这个过程称为checkpoint)

namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时
可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据
7. yarn资源调度流程
1、用户向YARN 中提交应用程序, 其中包括ApplicationMaster 程序、启动ApplicationMaster 的命令、
用户程序等。
2、ResourceManager 为该应用程序分配第一个Container, 并与对应的NodeManager 通信,要求它在这个
   Container 中启动应用程序的ApplicationMaster。
3、ApplicationMaster 首先向ResourceManager 注册, 这样用户可以直接通过ResourceManage 查看
   应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7
4、ApplicationMaster 采用轮询的方式通过RPC 协议向ResourceManager 申请和领取资源。
5、一旦ApplicationMaster 申请到资源后,便与对应的NodeManager 通信,要求它启动任务。
6、NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令
   写到一个脚本中,并通过运行该脚本启动任务。
7、各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,以让ApplicationMaster 
   随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可
   随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
8、应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。
8. hadoop中combiner和partition的作用
1、combiner是发生在map的最后一个阶段,父类就是Reducer,意义就是对每一个maptask的输出进行
  局部汇总,以减小网络传输量,缓解网络传输瓶颈,提高reducer的执行效率。

2、partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理,可以将reduce阶段的
  处理负载进行分摊
9. 用mapreduce怎么处理数据倾斜问题?
数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点
运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或
者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点
迟迟运行不完,此称之为数据倾斜。

(1)局部聚合加全局聚合。

     第一次在 map 阶段对那些导致了数据倾斜的 key 加上 1 到 n 的随机前缀,这样本来相同的 key 也
会被分到多个 Reducer 中进行局部聚合,数量就会大大降低。
     第二次 mapreduce,去掉 key 的随机前缀,进行全局聚合。
思想:二次 mr,第一次将 key 随机散列到不同 reducer 进行处理达到负载均衡目的。第
二次再根据去掉 key 的随机前缀,按原 key 进行 reduce 处理。
这个方法进行两次 mapreduce,性能稍差。

(2)增加 Reducer,提升并行度

JobConf.setNumReduceTasks(int)

(3)实现自定义分区

根据数据分布情况,自定义散列函数,将 key 均匀分配到不同 Reducer
10. shuffle 阶段,你怎么理解的

在这里插入图片描述在这里插入图片描述

1、Map方法之后Reduce方法之前这段处理过程叫Shuffle
2、Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认
  大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排
  序 ,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行
  Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3、每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所
  有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。
11. Mapreduce 的 map 数量 和 reduce 数量是由什么决定的 ,怎么配置
1、 map的数量由输入切片的数量决定,128M切分一个切片,只要是文件也分为一个切片,
    有多少个切片就有多少个map Task。
2、 reduce数量自己配置。
12. MapReduce优化经验
1、 设置合理的map和reduce的个数。合理设置blocksize
2、避免出现数据倾斜
3、 combine函数
4、对数据进行压缩
5、小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合
   并成SequenceFile大文件(key:文件名,value:文件内容)
6、参数优化
13. 分别举例什么情况要使用 combiner,什么情况不使用?
求平均数的时候就不需要用combiner,因为不会减少reduce执行数量。在其他的时候,可以依据情况,使用
 combiner,来减少map的输出数量,减少拷贝到reduce的文件,从而减轻reduce的压力,节省网络开销,提升
 执行效率
14. 简单描述一下HDFS的系统架构,怎么保证数据安全?
1、存储在HDFS系统上的文件,会分割成128M大小的block存储在不同的节点上,block的副本数默认3份,也可配置
   成更多份;
2、第一个副本一般放置在与client(客户端)所在的同一节点上(若客户端无datanode,则随机放),第二个副本
   放置到与第一个副本同一机架的不同节点,第三个副本放到不同机架的datanode节点,当取用时遵循就近原则;

3、datanode已block为单位,每3s报告心跳状态,做10min内不报告心跳状态则namenode认为block已死掉,
   namonode会把其上面的数据备份到其他一个datanode节点上,保证数据的副本数量;
4、datanode会默认每小时把自己节点上的所有块状态信息报告给namenode;
5、采用safemode模式:datanode会周期性的报告block信息。Namenode会计算block的损坏率,当阀值
  <0.999f时系统会进入安全模式,HDFS只读不写。HDFS元数据采用secondaryname备份或者HA备份
15. 在通过客户端向hdfs中写数据的时候,如果某一台机器宕机了,会怎么处理
   在写入的时候不会重新重新分配datanode。如果写入时,一个datanode挂掉,会将已经写入的数据放置到
   queue的顶部,并将挂掉的datanode移出pipline,将数据写入到剩余的datanode,在写入结束后, 
   namenode会收集datanode的信息,发现此文件的replication没有达到配置的要求(default=3),
   然后寻找一个datanode保存副本
16. Hadoop优化有哪些方面
0)HDFS小文件影响
(1)影响NameNode的寿命,因为文件元数据存储在NameNode的内存中
(2)影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务
1)数据输入小文件处理:
(1)合并小文件:对小文件进行归档(Har)、自定义Inputformat将小文件存储成SequenceFile文件。
(2)采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。
(3)对于大量小文件Job,可以开启JVM重用。
2)Map阶段
(1)增大环形缓冲区大小。由100m扩大到200m
(2)增大环形缓冲区溢写的比例。由80%扩大到90%
(3)减少对溢写文件的merge次数。
(4)不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。
3)Reduce阶段
(1)合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间
    太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。
(2)设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开
    始运行,减少Reduce的等待时间。
(3)规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
(4)增加每个Reduce去Map中拿数据的并行数
(5)集群性能可以的前提下,增大Reduce端存储数据内存的大小。 
4)IO传输
(1)采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。
(2)使用SequenceFile二进制文件
5)整体
(1)MapTask默认内存大小为1G,可以增加MapTask内存大小为4-5g
(2)ReduceTask默认内存大小为1G,可以增加ReduceTask内存大小为4-5g
(3)可以增加MapTask的cpu核数,增加ReduceTask的CPU核数
(4)增加每个Container的CPU核数和内存大小
(5)调整每个Map Task和Reduce Task最大重试次数
17. 大量数据求topN(写出mapreduce的实现思路)
1.维持一个逆序的list(LinkedList)
2.新加入数据,判断是否达到最大topn,
  如果没有超过topn最大值,直接加入,重新排序;
  如果大于topn,比较和最后一个值的大小,如果小于最后一个值,不做任何处理
  如果大于最后一个值,替换最后一个值,重新排序
(实现代码包括回复内容,两种实现方式,第一种List实现,第二种TreeSet实现)
18. 列出正常工作的hadoop集群中hadoop都分别启动哪些进程以及他们的作用
1.NameNode它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate
2.SecondaryNameNode它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并
   editslog,减少NN启动时间。
3.DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个
   datanode守护进程。
4.ResourceManager(JobTracker)JobTracker负责调度DataNode上的工作。每个DataNode有一个
  TaskTracker它们执行实际工作。
5.NodeManager(TaskTracker)执行任务
6.DFSZKFailoverController高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立
  线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为
  最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
7.JournalNode 高可用情况下存放namenode的editlog文件.
19. Hadoop总job和Tasks之间的区别是什么?
1、Job是我们对一个完整的mapreduce程序的抽象封装
2、Task是job运行时,每一个处理阶段的具体实例,如map task,reduce task,maptask和reduce 
   task都会有多个并发运行的实例
20. Hadoop高可用HA模式
HDFS高可用原理:

Hadoop HA(High Available)通过同时配置两个处于Active/Passive模式的Namenode来解决上述问题,
状态分别是Active和Standby. Standby Namenode作为热备份,从而允许在机器发生故障时能够快速进行故
障转移,同时在日常维护的时候使用优雅的方式进行Namenode切换。Namenode只能配置一主一备,不能多于两个
Namenode。

主Namenode处理所有的操作请求(读写),而Standby只是作为slave,维护尽可能同步的状态,使得故障时能够
快速切换到Standby。为了使Standby Namenode与Active Namenode数据保持同步,两个Namenode都与一组
Journal Node进行通信。当主Namenode进行任务的namespace操作时,都会确保持久会修改日志到
Journal Node节点中。Standby Namenode持续监控这些edit,当监测到变化时,将这些修改同步到自己的
namespace。

当进行故障转移时,Standby在成为Active Namenode之前,会确保自己已经读取了Journal Node中的所有
edit日志,从而保持数据状态与故障发生前一致。

为了确保故障转移能够快速完成,Standby Namenode需要维护最新的Block位置信息,即每个Block副本存放
在集群中的哪些节点上。为了达到这一点,Datanode同时配置主备两个Namenode,并同时发送Block报告和心跳
到两台Namenode。

确保任何时刻只有一个Namenode处于Active状态非常重要,否则可能出现数据丢失或者数据损坏。当两台
Namenode都认为自己的Active Namenode时,会同时尝试写入数据(不会再去检测和同步数据)。为了防止这种
脑裂现象,Journal Nodes只允许一个Namenode写入数据,内部通过维护epoch数来控制,从而安全地进行故障
转移。
21. 简要描述安装配置一个hadoop集群的步骤
    1、使用root账户登录。
    2、 修改IP。
    3、修改Host主机名。
    4、 配置SSH免密码登录。
    5、关闭防火墙。
    6、 安装JDK。
    7、上传解压Hadoop安装包。
    8、配置Hadoop的核心配置文件hadoop-evn.sh,core-site.xml,mapred-site.xml,hdfs-site.xml,yarn-site.xml
    9、配置hadoop环境变量
    10、格式化hdfs # bin/hadoop  namenode  -format
    11、启动节点start-all.sh
22. fsimage和edit的区别
fsimage:filesystem image 的简写,文件镜像。

客户端修改文件时候,先更新内存中的metadata信息,只有当对文件操作成功的时候,才会写到editlog。

fsimage是文件meta信息的持久化的检查点。secondary namenode会定期的将fsimage和editlog合并dump成
新的fsimage	
23. yarn的三大调度策略
1)Hadoop调度器重要分为三类:
     FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。
         Hadoop2.7.2默认的资源调度器是 容量调度器
2)区别:

FIFO调度器:先进先出,同一时间队列中只有一个任务在执行。
在这里插入图片描述

容量调度器:多队列;每个队列内部先进先出,同一时间队列中只有一个任务在执行。队列并行度为队列的个数
在这里插入图片描述
公平调度器:多队列;每个队列内部按照缺额大小分配资源启动任务,同一时间队列中有多个任务执行。队列的并行度大于等于队列的个数。
一定要强调生产环境中不是使用的FifoScheduler,面试的时侯会发现候选人大概了解这几种调度器的区别,但是问在生产环境用哪种,却说使用的FifoScheduler(企业生产环境一定不会用这个调度的)
在这里插入图片描述大数据面试题之葵花宝典------flume
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Charlie_jun/article/details/108425106