adoop是一个由Apache基金会所研发的分布式系统基础架构,主要解决了海量数据的存储和海量数据的分析计算问题。Hadoop目前在大数据领域的应用之广泛有目共睹,在大数据岗位的面试中也是必然会被考察到的内容,笔者将一些常见的面试题进行了总结,并给出了作答思路,分享出来与大家交流。


面试题一:Hadoop都有哪些常用端口号?


hadoop2.x

Hadoop3.x

访问HDFS端口

50070  

9870

访问MR执行情况端口

8088   

8088   

历史服务器

19888 

19888 

客户端访问集群端口

9000

8020



面试题二:请简述Hadoop常用的配置文件及Hadoop集群搭建过程

1、配置文件:

Hadoop2.x的配置文件有core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves

Hadoop3.x的配置文件有core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers

2、简单的集群搭建过程:

  • JDK安装

  • 配置SSH免密登录

  • 配置hadoop核心文件

  • 格式化namenode


面试题三:请简要描述Hadoop的文件读写流程

面试必备!Hadoop常见面试题汇总_java


面试必备!Hadoop常见面试题汇总_java_02


面试题四:HDFS对于小文件的处理有哪些需要注意的地方?


  • 会有什么影响?

(1)存储层面:

1个文件块,占用namenode多大内存150字节

1亿个小文件*150字节

1个文件块 * 150字节

128G能存储多少文件块?   128 * 1024*1024*1024byte/150字节 = 9亿文件块

(2)计算层面:

每个小文件都会起到一个MapTask,占用了大量计算资源


  • 怎么解决?

(1)采用har归档方式,将小文件归档

(2)采用CombineTextInputFormat

(3)有小文件场景开启JVM重用;如果没有小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。

JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间

<property>   <name>mapreduce.job.jvm.numtasks</name>    <value>10</value>    <description>How many tasks to runper jvm,if set to -1 ,there is  nolimit</description></property>


面试题五:描述Shuffle的过程,并说明如何进行优化。

面试必备!Hadoop常见面试题汇总_java_03


面试必备!Hadoop常见面试题汇总_java_04



优化从四个方面考虑,分别是Map阶段、Reduce阶段、IO传输和整体考虑。


1、Map阶段

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

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

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

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


2、Reduce阶段

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

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

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

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

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


3、IO传输

采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。

压缩:

  • map输入端主要考虑数据量大小和切片,支持切片的有Bzip2、LZO。注意:LZO要想支持切片必须创建索引;

  • map输出端主要考虑速度,速度快的snappy、LZO;

  • reduce输出端主要看具体需求,例如作为下一个mr输入需要考虑切片,永久保存考虑压缩率比较大的gzip。


4、整体

  • NodeManager默认内存8G,需要根据服务器实际配置灵活调整,例如128G内存,配置为100G内存左右,yarn.nodemanager.resource.memory-mb。

  • 单任务默认内存8G,需要根据该任务的数据量灵活调整,例如128m数据,配置1G内存,yarn.scheduler.maximum-allocation-mb。

  • mapreduce.map.memory.mb:控制分配给MapTask内存上限,如果超过会kill掉进程(报:Container is running beyond physical memorylimits. Current usage:565MB of512MB physical memory used;Killing Container)。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加MapTask内存,最大可以增加到4-5g。

  • mapreduce.reduce.memory.mb:控制分配给ReduceTask内存上限。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加ReduceTask内存大小为4-5g。

  • mapreduce.map.java.opts:控制MapTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

  • mapreduce.reduce.java.opts:控制ReduceTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)

  • 可以增加MapTask的CPU核数,增加ReduceTask的CPU核数

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

  • 在hdfs-site.xml文件中配置多目录(多磁盘)

  • NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。面试必备!Hadoop常见面试题汇总_java_05,比如集群规模为8台时,此参数设置为41。可通过简单的python代码计算该值,代码如下。


[atguigu@hadoop102 ~]$ pythonPython 2.7.5 (default,Apr 11 2018, 07:36:10)[GCC 4.8.5 20150623(Red Hat 4.8.5-28)] on linux2Type "help","copyright", "credits" or "license" for moreinformation.>>> import math>>> printint(20*math.log(8))41>>> quit()



面试题六:说一下YARN的工作机制。

面试必备!Hadoop常见面试题汇总_java_06



面试题七:Yarn有几种调度器,分别有什么特点?

1、Hadoop调度器重要分为三类:

FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。

Apache默认的资源调度器是容量调度器;

CDH默认的资源调度器是公平调度器。


2、主要区别:

  • FIFO调度器:支持单队列、先进先出  生产环境不会用。

  • 容量调度器:支持多队列,保证先进入的任务优先执行。

  • 公平调度器:支持多队列,保证每个任务公平享有队列资源。资源不够时可以按照缺额分配。


3、在生产环境下怎么选择?

大厂:如果对并发度要求比较高,选择公平,要求服务器性能必须OK;

中小公司,集群服务器资源不太充裕选择容量。


4、在生产环境怎么创建队列?

  • 调度器默认就1个default队列,不能满足生产要求。

  • 按照框架:hive /spark/ flink 每个框架的任务放入指定的队列(企业用的不是特别多)

  • 按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2


5、 创建多队列的好处?

  • 因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽。

  • 实现任务的降级使用,特殊时期保证重要的任务队列资源充足。


面试题八:如何对Hadoop集群进行基准测试?

搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试。测试jar包在hadoop的share文件夹下。

集群总吞吐量= 带宽*集群节点个数/副本数

例如:100m/s * 10台/ 3= 333m/s

注意:如果测试数据在本地,那副本数-1。因为这个副本不占集群吞吐量。如果数据在集群外,向该集群上传,需要占用带宽。本公式就不用减1。


面试题八:Hadoop集群宕机应该如何解决?

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

2、如果写入文件过快造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。例如,可以调整Flume每批次拉取数据量的大小参数batchsize。

面试题九:Hadoop如何解决数据倾斜的问题。

1、提前在map进行combine,减少传输的数据量

在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。

如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。


2、导致数据倾斜的key 大量分布在不同的mapper

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

第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。

第二次mapreduce,去掉key的随机前缀,进行全局聚合。

思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。

这个方法进行两次mapreduce,性能稍差。

(2)增加Reducer,提升并行度
JobConf.setNumReduceTasks(int)

(3)实现自定义分区

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