• Hadoop高频面试题


    hadoop中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。

    一、HDFS集群架构(HDFS组织架构)

    HDFS是hadoop的存储系统,包括客户端(client)、元数据节点(nameNode)、备份节点(secondary nameNode)和数据存储节点(dataNode)

    1.1 Client :HDFS的客户端 

    • 切分文件,文件上传到hdfs的时候,client将文件切割成一个一个的block,然后进行存储
    • 与nameNode交互,获取文件的位置信息
    • 与dataNode交互,读取或是写入数据
    • 提供一些命令管理hdfs,比如启动关闭hdfs等

    1.2 NameNode:元数据节点

    • 维护和管理文件系统的元数据(元数据:名称空间目录树结构,文件和块的位置信息,访问权限等信息)
    • 监控集群中dataNode的健康状态
    • 处理客户端端读写请求(访问hdfs的唯一入口)
    • 管理数据块(block)的映射信息

    1.3 DataNode 数据节点

    • 存储实际的数据块
    • 执行数据块的读|写请求

    1.4 secondary nameNode 备份节点

    并不是nameNode的热备,当nameNode挂掉后,不会立马替换nameNode并提供服务

    • 定期合并元数据镜像文件(fsimage)和改动日志(editlog),并推动给nameNode
    • 协助nameNode,分担工作量
    • 在紧急情况下,可辅助恢复nameNode

    二、HDFS数据写流程

    1.  Client客户端发送上传请求,和元数据节点(nameNode)建立通信,NameNode检查该用户是否有上传权限,以及上传的文件是否在HDFS对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息;
    2. 客户端根据文件的大小进行切分,默认128M一块,切分完成之后给元数据节点(nameNode)​​​​​​​发送请求询问block块上传到哪些服务器上;
    3. 元数据节点(nameNode)收到请求之后,返回可用的DataNode的地址(根据网络拓扑和机架感知以及副本机制进行文件分配);
    4. 客户端收到地址之后与dataNode的地址列表建立管道通讯(本质上就是RPC调用,建立pipelineA收到请求后会继续调用BB在调用C,将整个pipeline建立完成,逐级返回Client)
    5. 客户端向dataNode发送block,直到数据写入成功​​​​​​​ 

    注:Hadoop在设计时考虑到数据的安全与高效, 数据文件默认在HDFS上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份, 不同机架的某一节点上一份。

    三、HDFS数据读流程

    1. 客户端向元数据节点(nameNode)发送请求,请求文件block的位置;
    2. 元数据节点(nameNode)收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的block列表
    3. Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
    4. 读取完一个block都会进行checksum验证,如果读取dataNode时出现错误,客户端会通知元数据节点(nameNode)​​​​​​​,然后再从下一个拥有该block副本的dataNode 继续读;
    5. 最终读取来所有的block会合并成一个完整的最终文件返回给客户端

    四、MapTask和ReduceTask工作机制 (也可回答MapReduce工作原理) 

    MapTask工作机制

    (1)Read阶段:读取目标文件,从目标文件中解析出一个个key/value。
    (2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
    (3)Collect收集阶段:数据被map处理完之后交给OutputCollect收集器,对其结果key进行分区(默认使用的hashPartitioner),并写入一个环形内存缓冲区中。
    (4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
    (5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。

    ReduceTask工作机制

    (1)Copy阶段:ReduceTask从各个MapTask上远程拷贝数据,如果数据大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
    (2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
    (3)Sort阶段:对所有数据进行一次归并排序即
    (4)Reduce阶段:reduce()函数将计算结果写到HDFS上。

    五、请说下MapReduce中Shuffle阶段

    所谓Shuffle,是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程。因此,Shuffle过程分为Map端的操作和Reduce端的操作。

    (1)在Map端的Shuffle

    Map的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序和合并,之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并成一个大的磁盘文件,然后通知相应的Reduce任务来领取属于自己处理的数据。

    (2)在Reduce端的Shuffle过程

    Reduce任务从Map端的不同Map机器领回属于自己处理的那部分数据,然后对数据进行归并后交给Reduce处理。

    六、 小文件过多会有什么危害,如何避免

    Hadoop上大量HDFS元数据信息存储在NameNode内存中,因此过多的小文件必定会压垮NameNode的内存。

    针对HDFS而言,每一个小文件在namenode中都会占用150字节的内存空间,所以如果有1千万个小文件,每个文件占用一个block,则NameNode大约需要2G空间。如果存储1亿个文件,则NameNode需要20G空间。

    针对MapReduce而言,每一个小文件都是一个Block,最终每一个小文件都会产生一个map任务,这样会导致同时启动太多的map任务,Map任务的启动是非常消耗性的,但是启动了以后执行了很短时间就停止了,因为小文件的数据量太小了,这样就会造成任务执行消耗的时间还没有启动任务消耗的时间多,这样也会影响MapReduce执行的效率。

    HDFS提供了两种类型的容器,分别是SequenceFile 和 MapFile

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

    可以参考:Hadoop之小文件问题及解决方案_李大寶的博客-CSDN博客

    七、hadoop数据倾斜问题

    情况一: 导致数据倾斜的key分布在相同的mapper,解决方案:

    提前在map进行combine,相当提前reduce,即把一个mapper中的相同的key进行聚合,减少shuffle过程中传输的数据量

    情况二:导致数据倾斜的key大量分布在不同的mapper,解决方案:

    局部聚合加全局聚合 

    第一次在map阶段对那些导致了数据倾斜的key 加上随机前缀,这样之前相同的key 也会被分到不同的reduce中,进行聚合,这样的话就那些倾斜的key进行局部聚合的数量就会大大降低。然后再进行第二次mapreduce这样的话去掉随机前缀,进行全局聚合。这样就可以有效地降低mapreduce了

    八、YARN集群的架构和工作原理

    • ResourceManager 是一个全局的资源管理器,负责集群资源的管理、监控和分配
    • NodeManager是每个节点上的资源和任务管理器,负责节点的维护
    • ApplicationMaster负责具体应用的调度和协调
    • 容器(Container)是YARN中的资源抽象,封装了各种资源。一个应用程序会分配一个容器,这个应用程序只能使用这个容器中描述的资源,以达到资源隔离的目的

    九、 YARN的任务提交流程是怎样的

    1. 用户向YARN提交一个应用程序,并指定ApplicationMaster程序、启动ApplicationMaster的命令、用户程序。
    2. ResourceManager启动一个容器,在容器中启动和运行ApplicationMaster
    3. 启动的ApplicationMaster向ResourceManager注册自己,启动成功后与ResourceManager保持心跳
    4. ApplicationMaster向ResourceManager发动请求,申请相应数量的容器
    5. ResourceManager返回ApplicationMaster申请的容器信息
    6. 申请成功的容器由ApplicationMaster初始化后,ApplicationMaster和对应的NodeManager通讯,要求其启动容器
    7. 容器在运行期间和ApplicationMaster保持心跳,并向其汇报进度
    8. 在应用程序运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的容器被收回

    十、YARN的资源调度三种模型

    • FIFO Scheduler先进先出调度器):把应用按提交的顺序排成一个队列,这是一个先进先出队列
    • Capacity Scheduler(能力调度器):它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用
    • Fair Scheduler(公平调度器):​​​​​​​它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用;当一个队列的资源有剩余时,可暂时将剩余资源共享给其他

    十一、NameNode在启动的时候会做哪些操作

    NameNode数据存储在内存和本地磁盘,本地磁盘数据存储在fsimage镜像文件和edits编辑日志文件

    首次启动NameNode

    1. 格式化文件系统,为了生成fsimage镜像文件
    2. 启动NameNode读取fsimage文件,将文件内容加载进内存
    3. 启动DataNodeNameNode注册发送block report检查fsimage中记录的块的数量和block report中的块的总数是否相同
    4. 对文件系统进行操作(创建目录,上传文件,删除文件等),此时内存中已经有文件系统改变的信息,但是磁盘中没有文件系统改变的信息,此时会将这些改变信息写入edits文件中,edits文件中存储的是文件系统元数据改变的信息。

    第二次启动NameNode

    1. 读取fsimageedits文件;
    2. fsimageedits文件合并成新的fsimage文件;
    3. 创建新的edits文件,内容开始为空;
    4. 启动DataNode

    十二、 HDFS在读取文件的时候,如果其中一个块突然损坏了怎么办

    客户端读取完DataNode上的块之后会进行checksum验证,也就是把客户端读取到本地的块与HDFS上的原始块进行校验,如果发现校验结果不一致,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。

    十三、 HDFS在上传文件的时候,如果其中一个DataNode突然挂掉了怎么办

    客户端上传文件时与DataNode建立管道通讯,管道的正方向是客户端向DataNode发送的数据包,管道反向是DataNode向客户端发送ack确认,也就是正确接收到数据包之后发送一个已确认接收到的应答。

    DataNode突然挂掉了,客户端接收不到这个DataNode发送的ack确认,客户端会通知NameNodeNameNode检查该块的副本与原来的不符,NameNode会通知DataNode去复制副本,并将挂掉的DataNode作下线处理,不再让它参与文件上传与下载。

    十四、如何保证NameNode数据存储安全

    NameNode 的高可用架构主要分为下面几个部分:

    Active NameNode 和 Standby(休眠) NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

    主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换

    元数据信息同步在 HA 方案中采用的是共享存储”,两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。每次NameNodeEditLog的时候,除了向本地磁盘写入 EditLog 之外,也会并行地向JournalNode集群之中的每一个JournalNode发送写请求,只要大多数的JournalNode节点返回成功就认为向JournalNode集群写入EditLog成功

    当Active NN故障时,Zookeeper创建的临时节点ActiveStandbyElectorLock将要被删除,其他NN节点注册的Watcher 来监听到该变化,NN节点的ZKFailoverController 会马上再次进入到创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。

    新当选的Active NN将确保从QJM(Quorum Journal Manager)同步完所有的元数据文件EditLog文件,然后切换为主节点,并向外提供服务。

  • 相关阅读:
    Oracle-触发器和程序包
    17.搜索二维矩阵Ⅱ
    数据仓库与数据挖掘实验练习题
    #gStore-weekly | gStore源码解析(四):安全机制之黑白名单配置解析
    Tauri 打包
    四通道信息融合下的齿轮箱故障诊断(Python代码,SVM模型和CNN模型进行对比实验,解压缩即可运行,有详细中文注释)
    檢測項目簡體字
    【CC3200AI 实验教程3】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-CC3200简介
    数字水印技术介绍
    【如何学习Kotlin 开发?《Kotin 移动和服务器端应用开发》告诉你】
  • 原文地址:https://blog.csdn.net/libaowen609/article/details/126636428