目录

1.描述一下hdfs的写流程 读流程?

2.详细讲解一下hdfs的体系结构

3.如果一个datanode出现宕机,恢复流程是什么样的?

4.通常你是如何解决Haddop的NameNode宕机的,流程是什么?

5.描述一下NameNode的元数据的管理

 6.Hadoop集群中有哪些进程?他们各自有什么作用?

7.讲解一下Hadoop中combiner和partition的作用

8.你在MapReduce过程中遇到过数据倾斜问题吗?你是如何处理的?

9.Hadoop的Shuffle分为哪几个阶段?

10.Mapreduce的map数量和reduce数量是由什么决定的?

11.block size、切片大小?

12.讲解一下MapReduce的流程?

13.HDFS的系统架构是如何保证数据可靠性的?

14.写出MapReduce求TopN的思路

15.详细描述Yarn的三大调度策略

16.谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?


1.描述一下hdfs的写流程 读流程?

写流程:

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,检查客户端是否有权限,如果以上条件均满足,执行(2)
(2)NameNode响应客户端的请求,允许其上传文件。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(注意:NameNode在返回3个DataNode节点之前,会存储相关信息到元数据,用于对其的管理)
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(注意:这里是根据网络拓扑计算节点的距离,按照最近距离进行分配。一般而言,再本机机架节点负载允许的范围内,会优先选择本机机架节点当作dn1,然后选择最近的机架。用改机架的两个服务端当作其余两个节点dn1,dn2)
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(注意:这里的通信信道建立属于类似“串联”的方式进行连接。是由客户端根据NameNode的返回信息,找到dn1,然后,dn1找dn2,dn2找dn3)
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(注意:此处再传送packet时,会再建立一个队列,用于暂存还未存储的packet,当packet请求存储成功后,会从队列中删除,这样做的目的是,防止传输时,packet因为请求延迟等原因,导致信息丢失)
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

读流程:

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

2.详细讲解一下hdfs的体系结构

HDFS 采用的是master/slaves主从结构模型来管理数据,这种结构模型主要由四个部分组成:Client(客户端)、Namenode(名称节点)、Datanode(数据节点)和SecondaryNamenode(第二名称节点,辅助Namenode)。一个真正的HDFS集群包括一个Namenode和若干数目的Datanode。Namenode是一个中心服务器,负责管理文件系统的命名空间 (Namespace )及客户端对文件的访问。集群中的Datanode一般是一个节点运行一个Datanode进程,负责管理客户端的读写请求,在Namenode的统一调度下进行数据块的创建、删除和复制等操作。数据块实际上都是保存在Datanode本地文件系统中的。每个Datanode会定期的向Namenode发送数据信息,报告自己的状态(心跳机制)。没有按时发送心跳信息的Datanode会被Namenode标记为“宕机”,“宕机”的Datanode不会被分配I/O任务。 

3.如果一个datanode出现宕机,恢复流程是什么样的?

Hadoop Hive HBase面试题 hadoop常见面试题_hadoop


4.通常你是如何解决Haddop的NameNode宕机的,流程是什么?

先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了, 重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。 但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。

5.描述一下NameNode的元数据的管理

Hadoop Hive HBase面试题 hadoop常见面试题_大数据_02


 6.Hadoop集群中有哪些进程?他们各自有什么作用?

1.NameNode用于管理文件系统名称空间和对集群中存储的文件的访问,保存了元数据。

2.SecondaryNameNode作用是提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。

3.DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。

4.ResourceManager(JobTracker)负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。

5.NodeManager(TaskTracker)执行任务

6.DFSZKFailoverController高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。

7.JournalNode 高可用情况下存放namenode的editlog文件。

7.讲解一下Hadoop中combiner和partition的作用

8.你在MapReduce过程中遇到过数据倾斜问题吗?你是如何处理的?


9.Hadoop的Shuffle分为哪几个阶段?

map的collect到reducetask从磁盘上拉取数据中间这些过程都是shuffle,详细展开就好。

10.Mapreduce的map数量和reduce数量是由什么决定的?

map:(1)文件的个数 (2)文件大小 (3)blocksize

reduce:最优的reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目。

几个reduce对应几个分区。自己设置的话 job.setNumReduceTasks(x);x 为reduce的数量。不设置的话默认为 1。

11.block size、切片大小?

2.x和3.x默认是128M,之前是64M

在HDFS上,map默认运算切片大小是128M,但如果是本地运行的话,map默认切片大小是32M。

切片主要由这几个值来运算决定:
mapreduce.input.fileinputformat.split.minsize=1 默认值为 1
mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue默认值Long.MAXValue
因此,默认情况下,切片大小=blocksize。
maxsize(切片最大值):参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值。
minsize(切片最小值):参数调的比blockSize大,则可以让切片变得比blocksize还大。

12.讲解一下MapReduce的流程?

13.HDFS的系统架构是如何保证数据可靠性的?

(1)安全模式

① HDFS刚启动时,NameNode进入安全模式,处于安全模式的NameNode不能做任何的文件操作,甚至内部的副本创建也是不允许的,NameNode这时需要和各个DataNode进行通信,获得DataNode存储的数据块信息,并对数据块信息进行检查,只有通过了NameNode的检查,一个数据块才被认为是安全的。当认为安全的数据块所占比例达到了某个阈值,NameNode才会开始启动;

(2)SecondaryNamenode备份机制

① 在Hadoop中使用SecondaryNameNode来备份NameNode的元数据,以防止在NameNode宕机的时候,能从SecondaryNameNode中恢复出NameNode上的元数据;

② NameNode中保存了整个文件系统的元数据,而SecondaryNameNode的作用就是周期性保存NameNode的元数据。元数据中包括FSImage镜像文件数据和EditLog编辑日志。FSImage相当于HDFS的检查点,NameNode启动时候会读取FSImage的内容到内存,并将其与EditLog日志中的所有修改信息合并生成新的FSImage。在NameNode运行过程中,所有关于HDFS的修改都将写入EditLog日志文件中。这样,如果NameNode宕机,可以通过SecondaryNameNode中保存的FSImage和EditLog数据恢复出NameNode最近的状态,尽量减少数据的损失;

(3)心跳机制和副本重新创建

① 为了保证NameNode和各个DataNode的联系,HDFS采用了心跳机制。NameNode周期性的向各个DataNode发送心跳包,而收到心跳包的DataNode要进行回复。因为心跳包是定时发送的,所以NameNode就把要执行的命令也通过心跳包发送给DataNode,而DataNode收到心跳包,一方面要回复NameNode,另一方面就要开始应用数据的传输;

② 如果检测到DataNode失效,NameNode之前保存在这个DataNode上的数据就变成不可用数据。如果有的副本存储在失效的DataNode上,那么需要重新创建这个副本,放到另外可用的地方去;

(4)数据一致性

① 一般来讲,DataNode与应用交互的大部分情况都是通过网络进行的,而网络数据传输带来的一大问题就是数据是否原样到达。为了保证数据的一致性,HDFS采用了数据校验和(checkSum)机制。创建文件时,HDFS会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间中。传输数据时会将数据与校验和数据一起传输,应用收到数据后可以进行校验,如果两个校验的结果不同,则文件出错了,这个数据块就变成无效的。如果判定为无效,则需要从其他DataNode上读取副本数据;

14.写出MapReduce求TopN的思路

我一般用java的api来实现,先用自定义类型Bean作为map输出的KEYBean,必须实现WritableComparable接口,必须自定义一个分组比较器根据需求自己来写比较的逻辑。

15.详细描述Yarn的三大调度策略

FIFO调度策略 这个策略没啥好讲的,提交一个任务进入队列,调度器根据优先级和到达先后进行排序,一次给每一个应用分配资源,知道没有资源为止。没有人会在生产环境用这个策略,性能太差了。

Capacity调度策略 属于共享调度策略,将集群资源,给队列分配部分资源,每个队列互不干涉

公平调度策略 队列间可以互相共享资源,如果权重高的任务来了,权重低的任务会分给权重高的任务部分资源,必要时,可kill掉权重低的任务

16.谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?

1)序列化和反序列化

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。

2)自定义bean对象要想序列化传输步骤及注意事项:

(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),且用”\t”分开,方便后续用
(7)如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序