大数据面试题集锦-Hadoop面试题-HDFS

Posted 张飞的猪的技术总结

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据面试题集锦-Hadoop面试题-HDFS相关的知识,希望对你有一定的参考价值。

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料。

1、 HDFS 中的 block 默认保存几份?

默认保存3份

2、HDFS 默认 BlockSize 是多大?

默认64MB

3、负责HDFS数据存储的是哪一部分?

DataNode负责数据存储

4、SecondaryNameNode的目的是什么?

他的目的使帮助NameNode合并编辑日志,减少NameNode 启动时间

5、文件大小设置,增大有什么影响?

HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。
  思考:为什么块的大小不能设置的太小,也不能设置的太大?
  HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。
  如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。默认的块大小128MB。
  块的大小:10ms×100×100M/s = 100M,如图

  增加文件块大小,需要增加磁盘的传输速率。

6、hadoop的块大小,从哪个版本开始是128M

Hadoop1.x都是64M,hadoop2.x开始都是128M。

7、HDFS的存储机制(☆☆☆☆☆)

HDFS存储机制,包括HDFS的写入数据过程和读取数据过程两部分

HDFS写数据过程

  1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
  2)NameNode返回是否可以上传。
  3)客户端请求第一个 block上传到哪几个datanode服务器上。
  4)NameNode返回3个datanode节点,分别为dn1、dn2、dn3。
  5)客户端通过FSDataOutputStream模块请求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步)。

HDFS读数据过程

  1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
  2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。
  4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

8、secondary namenode工作机制(☆☆☆☆☆)


1)第一阶段:NameNode启动
  (1)第一次启动NameNode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  (2)客户端对元数据进行增删改的请求。
  (3)NameNode记录操作日志,更新滚动日志。
  (4)NameNode在内存中对数据进行增删改查。

2)第二阶段:Secondary NameNode工作
  (1)Secondary NameNode询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果。
  (2)Secondary NameNode请求执行checkpoint。
  (3)NameNode滚动正在写的edits日志。
  (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
  (5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
  (6)生成新的镜像文件fsimage.chkpoint。
  (7)拷贝fsimage.chkpoint到NameNode。
  (8)NameNode将fsimage.chkpoint重新命名成fsimage。

9、NameNode与SecondaryNameNode 的区别与联系?(☆☆☆☆☆)

机制流程看第7题

1)区别
  (1)NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
  (2)SecondaryNameNode主要用于定期合并命名空间镜像和命名空间镜像的编辑日志。

2)联系:
  (1)SecondaryNameNode中保存了一份和namenode一致的镜像文件(fsimage)和编辑日志(edits)。
  (2)在主namenode发生故障时(假设没有及时备份数据),可以从SecondaryNameNode恢复数据。

10、HDFS组成架构(☆☆☆☆☆)

架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面我们分别介绍这四个组成部分。

1)Client:就是客户端。
  (1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
  (2)与NameNode交互,获取文件的位置信息;
  (3)与DataNode交互,读取或者写入数据;
  (4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;
  (5)Client可以通过一些命令来访问HDFS;
2)NameNode:就是Master,它是一个主管、管理者。
  (1)管理HDFS的名称空间;
  (2)管理数据块(Block)映射信息;
  (3)配置副本策略;
  (4)处理客户端读写请求。
3)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
  (1)存储实际的数据块;
  (2)执行数据块的读/写操作。
4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
  (1)辅助NameNode,分担其工作量;
  (2)定期合并Fsimage和Edits,并推送给NameNode;
  (3)在紧急情况下,可辅助恢复NameNode。

11、HAnamenode 是如何工作的? (☆☆☆☆☆)


ZKFailoverController主要职责
  1)健康监测:周期性的向它监控的NN发送健康探测命令,从而来确定某个NameNode是否处于健康状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于一个不健康的状态。
  2)会话管理:如果NN是健康的,zkfc就会在zookeeper中保持一个打开的会话,如果NameNode同时还是Active状态的,那么zkfc还会在Zookeeper中占有一个类型为短暂类型的znode,当这个NN挂掉时,这个znode将会被删除,然后备用的NN,将会得到这把锁,升级为主NN,同时标记状态为Active。
  3)当宕机的NN新启动时,它会再次注册zookeper,发现已经有znode锁了,便会自动变为Standby状态,如此往复循环,保证高可靠,需要注意,目前仅仅支持最多配置2个NN。
  4)master选举:如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断那个NameNode为Active状态

原文链接:
张飞的猪大数据面试题集锦
大数据面试题集锦-Hadoop面试题(二)-HDFS
Hadoop面试题(二)-HDFS

大数据面试题:Hadoop优化核心高频面试题

文章目录

Hadoop优化核心高频面试题

一、Mapreduce 跑的慢的原因?

1、计算机性能

2、I/O 操作优化

二、Mapreduce优化方法

1、数据输入

2、map阶段

3、reduce阶段

4、IO传输

5、数据倾斜问题

6、常用的调优参数

三、HDFS小文件优化方法 

1、HDFS小文件弊端

2、解决方案

3、CombineFileInputFormat

4、开启JVM重用

四、MapReduce怎么解决数据均衡问题,如何确定分区号? 

五、Hadoop中job和Tasks之间的区别是什么?


Hadoop优化核心高频面试题

一、Mapreduce 跑的慢的原因?

Mapreduce 程序效率的瓶颈在于两点:

1、计算机性能

CPU、内存、磁盘健康、网络

2、I/O 操作优化

  • 数据倾斜
  • map和reduce数设置不合理
  • reduce等待过久
  • 小文件过多
  • 大量的不可分块的超大文件
  • spill次数过多
  • merge次数过多等

二、Mapreduce优化方法

1、数据输入

1.1、合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致 mr 运行较慢。

1.2、采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。

2、map阶段

2.1、减少spill次数:通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数, 从而减少磁盘 IO。

2.2、减少merge次数:通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

2.3、在 map 之后先进行combine处理,减少 I/O。

3、reduce阶段

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

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

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

3.4、合理设置reduc端的buffer,默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说,buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:mapred.job.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存 读buffer中的数据直接拿给reduce使用。这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整。

4、IO传输

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

4.2、使用SequenceFile二进制文件

5、数据倾斜问题

5.1、数据倾斜现象

  • 数据频率倾斜——某一个区域的数据量要远远大于其他区域。
  • 数据大小倾斜——部分记录的大小远远大于平均值。

5.2、如何收集倾斜数据

在reduce方法中加入记录map输出键的详细情况的功能。

public static final String MAX_VALUES = "skew.maxvalues";
private int maxValueThreshold;
@Override
public void configure(JobConf job) 
    maxValueThreshold = job.getInt(MAX_VALUES, 100);

@Override
public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException 
    int i = 0; 
    while (values.hasNext())  
        values.next();
        i++;
    
    if (++i > maxValueThreshold) 
    log.info("Received " + i + " values for key " + key);
    

5.3、减少数据倾斜的方法

方法1:抽样和范围分区

可以通过对原始数据进行抽样得到的结果集来预设分区边界值。

方法2:自定义分区

另一个抽样和范围分区的替代方案是基于输出键的背景知识进行自定义分区。例如,如果map输出键的单词来源于一本书。其中大部分必然是省略词(stopword)。那么就可以将自定义分区将这部分省略词发送给固定的一部分reduce实例。而将其他的都发送给剩余的reduce实例。

方法3:Combine

使用Combine可以大量地减小数据频率倾斜和数据大小倾斜。在可能的情况下,combine的目的就是聚合并精简数据。

6、常用的调优参数

6.1、资源相关参数

(a)以下参数是在用户自己的mr应用程序中配置就可以生效(mapred-default.xml)

配置参数参数说明

mapreduce.map.memory.mb

一个Map Task可使用的资源上限(单位:MB),默认为1024。如果Map Task实际使用的资源量超过该值,则会被强制杀死 。

mapreduce.reduce.memory.mb

一个Reduce Task可使用的资源上限(单位:MB),默认为1024。如果Reduce Task实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores每个Map task可使用的最多cpu core数目,默认值:1
mapreduce.reduce.cpu.vcores每个Reduce task可使用的最多cpu core数目,默认值:1
mapreduce.reduce.shuffle.parallelcopies每个reduce去map中拿数据的并行数。默认值是5
mapreduce.reduce.shuffle.merge.percentbuffer中的数据达到多少比例开始写入磁盘。默认值0.66
mapreduce.reduce.shuffle.input.buffer.percentbuffer大小占reduce可用内存的比例。默认值0.7
mapreduce.reduce.input buffer.percent指定多少比例的内存用来存放buffer中的数据,默认值是0.0

(b)应该在yarn启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)

配置参数参数说明
yarn.scheduler.minimum-allocation-mb    1024给应用程序container分配的最小内存
yarn.scheduler.maximum-allocation-mb    8192给应用程序container分配的最大内存
yarn.scheduler.minimum-allocation-vcores每个container申请的最小CPU核数
yarn.scheduler.maximum-allocation-vcores   32每个container申请的最大CPU核数
yarn.nodemanager.resource.memory-mb      8192给containers分配的最大物理内存

(c)shuffle性能优化的关键参数,应在yarn启动之前就配置好(mapred-default.xml)

配置参数参数说明
mapreduce.taskio.sort.mb 100shuffle的环形缓冲区大小,默认100m
mapreduce.map.sort.spill.percent 0.8环形缓冲区溢出的阈值,默认80%

6.2、容错相关参数(mapreduce性能优化)

配置参数参数说明
mapreduce.map.maxattempts每个Map Task最大重试次数, 一旦重试参数超过该值,则认为MapTask运行失败,默认值:4。
mapreduce.reduce.maxattempts每个Reduce Task最大重试次数, 一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。

mapreduce.task.timeout

Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该task处于block状态,可能是卡住了,也许永远会卡主,为了防止因为用户程序永远block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“AttemptID:attempt_14267829456721_123456_m_000224_0
Timed out after 300 secsContainer killed by the
ApplicationMaster.”。

三、HDFS小文件优化方法 

1、HDFS小文件弊端

HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大是的索引速度变慢。

2、解决方案

2.1、Hadoop Archive:

是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时。

2.2、Sequence file:

sequence file由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。

3、CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。

4、开启JVM重用

对于大量小文件Job,可以开启JVM重用会减少45%运行时间。

JVM重用理解:一个map运行一个jvm,重用的话,在一个map在jvm上运行完毕后,jvm继续运行其他jvm

具体设置:mapreduce.job.jvm.numtasks值在10-20之间。

四、MapReduce怎么解决数据均衡问题,如何确定分区号? 

数据均衡问题指的就是某个节点或者某几个节点的任务运行的比较慢,拖慢了整个Job的进度。实际上数据均衡问题就是数据倾斜问题,解决方案同解决数据倾斜的方案。

MapReduce中分区默认是按hashcode来分的,用户可以自定义分区类,需要继承系统的Partitioner类,重写getPartition()方法即可。

五、Hadoop中job和Tasks之间的区别是什么?

编写好的一个程序,我们称为Mapreduce程序,一个Mapreduce程序就是一个Job,而一个Job里面可以有一 个或多个Task,Task又可以区分为Map Task和Reduce Task。


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于大数据面试题集锦-Hadoop面试题-HDFS的主要内容,如果未能解决你的问题,请参考以下文章

大数据面试题——hadoop(hdfsmapreduceyarn)

大数据面试题:Hadoop优化核心高频面试题

大数据开发面试题详解:Hadoop的运行原理

大数据开发必备面试题Hadoop篇

大数据hadoop 面试经典题

大数据面试题