当前位置: 首页>后端>正文

大数据面试杀招——Hadoop高频考点


1、什么是Hadoop?

Hadoop是一个能够对大量数据进行分布式处理的软件框架。以一种可靠、高效、可伸缩的方式进行数据处理。主要包括三部分内容:Hdfs,MapReduce,Yarn

Hadoop在广义上指一个生态圈,泛指大数据技术相关的开源组件或产品,如HBase,Hive,Spark,Zookeeper,Kafka,flume....

2、Hadoop跟Spark的差异

大数据面试杀招——Hadoop高频考点,第1张

3、能简单介绍Hadoop1.0,2.0,3.0的区别吗?

Hadoop 1.x阶段,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大;

Hadoop 2.x阶段,增加了Yarn。Yarn只负责资源的调度,MapReduce只负责运算;

Hadoop 3.x相比于Hadoop 2.x阶段在组成上没有变化;

4、Hadoop常用端口

大数据面试杀招——Hadoop高频考点,第2张

5、简单介绍一下的Hadoop集群搭建

「准备工作」

1.?关闭防火墙

2.?关闭SELINUX

3.?修改主机名

4.?ssh无密码拷贝数据

5.?设置主机名和IP对应

6.?jdk1.8安装

「搭建工作:」

·?下载并解压Hadoop的jar包

·?配置hadoop的核心文件

·?格式化namenode

·?启动....

6、HDFS读流程和写流程

大数据面试杀招——Hadoop高频考点,第3张

1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

注意:读取一个文件不能并发读写(不能一次性读多个该文件的block),但是可以一次性读多个文件

大数据面试杀招——Hadoop高频考点,第4张

1)客户端向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。

3)客户端请求第一个 block上传到哪几个datanode服务器上。

4)NameNode返回3个datanode节点,分别为dn1、dn2、dn3。

5)客户端请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位, dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7步)。

7、MapReduce的Shuffle过程及Hadoop优化(包括:压缩、小文件、集群优化)

一、Shuffle机制

1.?Map方法之后Reduce方法之前这段处理过程叫「Shuffle」

2.?Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段「快排」;溢写产生大量溢写文件,需要对溢写文件进行「归并排序」;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。

3.?每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。

大数据面试杀招——Hadoop高频考点,第5张

二、Hadoop优化

1)HDFS小文件影响

·?影响NameNode的寿命,因为文件元数据存储在NameNode的内存中

·?影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务

2)数据输入小文件处理

·?合并小文件:对小文件进行归档(Har)、自定义Inputformat将小文件存储成SequenceFile文件。

·?采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景

·?对于大量小文件Job,可以开启JVM重用

3)Map阶段

·?增大环形缓冲区大小。由100m扩大到200m

·?增大环形缓冲区溢写的比例。由80%扩大到90%

·?减少对溢写文件的merge次数。(10个文件,一次20个merge)

·?不影响实际业务的前提下,采用Combiner提前合并,减少 I/O

4)Reduce阶段

·?合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。

·?设置Map、Reduce共存:调整?slowstart.completedmaps?参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间

·?规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。

·?增加每个Reduce去Map中拿数据的并行数

·?集群性能可以的前提下,增大Reduce端存储数据内存的大小

5) IO 传输

·?采用数据压缩的方式,减少网络IO的的时间

·?使用SequenceFile二进制文件

6) 整体

·?MapTask默认内存大小为1G,可以增加MapTask内存大小为4g

·?ReduceTask默认内存大小为1G,可以增加ReduceTask内存大小为4-5g

·?可以增加MapTask的cpu核数,增加ReduceTask的CPU核数

·?增加每个Container的CPU核数和内存大小

·?调整每个Map Task和Reduce Task最大重试次数

7) 压缩

提示:如果面试过程问起,我们一般回答压缩方式为Snappy,特点速度快,缺点无法切分(可以回答在链式MR中,Reduce端输出使用bzip2压缩,以便后续的map任务对数据进行split)

8、Yarn的Job提交流程

大数据面试杀招——Hadoop高频考点,第6张

1)MapReduce程序提交到客户端所在的节点。

2)YarnRunner向ResourceManager申请一个Application。

3)RM 将该应用程序的资源路径以及application_id返回给YarnRunner。

4)该程序将运行所需资源提交到 HDFS 上。

5)程序资源提交完毕后,申请运行 mrAppMaster。

6)RM 将用户的请求初始化成一个 Task。

7)其中一个NodeManager 领取到 Task 任务。

8)该 NodeManager 创建容器 Container,并产生 MRAppmaster。

9)Container 从HDFS 上拷贝资源到本地。

10)MRAppmaster 向RM 申请运行 MapTask 资源。

11)RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个 NodeManager 分别领取任务并创建容器。

12)MR 向两个接收到任务的NodeManager 发送程序启动脚本,这两个 NodeManager分别启动MapTask,MapTask 对数据分区排序。

13)MrAppMaster 等待所有 MapTask 运行完毕后,向 RM 申请容器,运行 ReduceTask。

14)ReduceTask 向 MapTask 获取相应分区的数据。

15)程序运行完毕后,MR 会向 RM 申请注销自己。

9、介绍下Yarn默认的调度器,调度器分类,以及它们之间的区别

1)Hadoop调度器主要分为三类:

·?FIFO Scheduler:先进先出调度器:优先提交的,优先执行,后面提交的等待【生产环境不会使用】

·?Capacity Scheduler:容量调度器:允许看创建多个任务对列,多个任务对列可以同时执行。但是一个队列内部还是先进先出。【Hadoop2.7.2默认的调度器】

·?Fair Scheduler:公平调度器:第一个程序在启动时可以占用其他队列的资源(100%占用),当其他队列有任务提交时,占用资源的队列需要将资源还给该任务。还资源的时候,效率比较慢。【CDH版本的yarn调度器默认】

10、项目经验之LZO压缩

Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的cores-site.xml文件中添加相关压缩配置。

11、Hadoop参数调优

1)在hdfs-site.xml文件中配置多目录,最好提前配置好,否则更改目录需要重新启动集群

2)NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。

dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为10台时,此参数设置为60

3)服务器节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。yarn.nodemanager.resource.memory-mb

4)单个任务可申请的最多物理内存量,默认是8192(MB)。yarn.scheduler.maximum-allocation-mb

5)编 辑 日 志 存 储 路 径 dfs.namenode.edits.dir 设 置 与 镜 像 文 件 存 储 路 径 dfs.namenode.name.dir 尽量分开,达到最低写入延迟

12、项目经验之基准测试

硬盘的读写速度网络带宽影响集群吞吐量的两个核心因素。

13、Hadoop宕机(你是怎么处理Hadoop宕机问题的)

大数据面试杀招——Hadoop高频考点,第7张

如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)。

如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

14、你是如何解决Hadoop数据倾斜的问题的,能举个例子吗?

「性能优化」「数据倾斜」,如果在面试前不好好准备,那就准备在面试时吃亏吧~其实掌握的多了,很多方法都有相通的地方。下面贴出一种靠谱的回答,大家可以借鉴下:

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,性能稍差

·?「增加Reducer,提升并行度」

JobConf.setNumReduceTasks(int)

·?「实现自定义分区」

根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer


https://www.xamrdz.com/backend/39g1936706.html

相关文章: