当前位置:   article > 正文

Hadoop面试题总结

hadoop面试

一 、介绍一下hadoop

  1. 综述:hadoop是一个适合海量数据的分布式存储和分布式计算的平台
  2. 分述:hadoop包含三大组件,分别是HDFS、MapReduce和YARN
  3. --HDFS(分布式文件系统)
  4. HDFS集群由NameNode,DataNode,SecondaryNameNode构成
  5. NameNode:主要负责接受用户请求、存储元数据(描述文件的数据,如文件名、文件大小、目录名、文件创建时间等)
  6. DataNode:主要负责存储数据,管理用户的block,文件默认会按照每128M切分为block块存储在DataNode上,每个block块默认会有三个副本存放在不同的DataNode上,DataNode会通过心跳机制定期向NameNode汇报自身所保存的文件block块信息
  7. SecondaryNameNode:主要负责辅助NameNode,定期合并fsimage(快照文件)和edits(日志文件),并同步一份给NameNode
  8. --MapReduce: 分布式计算系统
  9. MapReduce分为map阶段和reduce阶段,map阶段与reduce阶段中间的过程被称为shuffer
  10. --YARN: 分布式资源调度系统
  11. YARN:yarn由4部分组成。
  12. 1. ResourceManager主要功能是:
  13. 1)接收用户请求
  14. 2)管理调度资源
  15. 3)启动管理am
  16. 4)管理所有nm,处理nm的状态汇报,向nm下达命令。
  17. 2.Container:yarn的应用都是运行在容器上的,容器包含cpu,内存等信息。
  18. 3.NodeManager:NM是每个节点上的资源和任务管理器,它会定时地向RM汇报本节点上的资源使用情况和各个容器的运行状态;同时负责对容器的启动和停止。
  19. 4. ApplicationMaster:管理应用程序。向RM获取资源、为应用程序分配任务、 监控所有任务运行状态。

二、HDFS读写数据流程

HDFS写数据流程

  1. 1.客户端使用rpc通信框架向NameNode发送请求,NameNode接收并处理用户的请求。
  2. 2.NameNode审核用户文件的操作权限,文件路径,磁盘空间是否可用,审核通过后,NameNode会返回成功状态给DFS(分布式文件系统)
  3. 3.如果DFS接收到成功的状态,会创建一个FSDataoutputStream的对象给客户端使用
  4. 4.客户端向NameNode获取文件存储在HDFS中所需要的所有DataNode节点
  5. 5.NameNode对客户端划分的block块分配好所有的DataNode
  6. 6.客户端通过机架感知与最近的DataNode建立联系,将block块划分为2048个packet进行发送,直到所有的packet发送完毕后,则当前的block块传输完毕,开始传输下一个block块中的packet
  7. 7.DataNode之间会形成pipeline通道传输这些packet
  8. 8.传输完毕后发送确认值给客户端
  9. 9.当最后一个block中的最后一个packet传输完毕后,释放FSDataoutputStream对象,关闭DataNode之间的pipeline通道,至此,写数据完成。

HDFS读数据流程

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

三、 HDFS的federation(联邦机制)

  1. Hadoop的联邦机制
  2. 1、定义
  3. Hadoop的联邦机制允许在HDFS(Hadoop Distributed File System)中使用多个独立的NameNode来管理不同的命名空间(NameSpaces),这些NameNode共享集群中所有的DataNode存储资源。每个NameNode都管理着其自己的目录树和文件块,彼此之间互不通信、互不干扰。
  4. 2、HDFS Federation设计可解决单一命名空间存在的以下几个问题:
  5. 1)HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点。
  6. 2)性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率。
  7. 3)良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很小。

四、MapReduce流程

  1. 1.文件被上传到HDFS中,默认以128M切分为一个block块
  2. 2.每个block块数据会进行逻辑上的切片,切片的大小默认与block块大小一致,为128M
  3. 3.之后根据切片的数量产生相同数量的Map任务
  4. -------------------------------------------shuffer----------------------------------------------------------
  5. 4.Map任务会进入环形缓冲区,根据Reduce数量(默认是一个)以及数据本身的值进行分区编号(底层与哈希值有关)并进行快速排序,当写入环形缓冲区的数据达到环形缓冲区的80%,向磁盘溢写一个个小文件
  6. 5.之后将溢写的小文件使用归并算法合并产生Map任务的结果文件
  7. 6.然后Reduce从结果文件拉取对应的分区编号的数据,去掉编号后,对拉取的文件数据进行归并排序
  8. ------------------------------------------------------------------------------------------------------------
  9. 7.执行Reduce逻辑,产生Reduce合并之后的结果文件

五、 yarn执行流程(Hadoop作业提交到YARN的流程)

  1. yarn执行流程:
  2. 1. 作业提交
  3. 首先我们将任务提交给JobClient,JobClient会向RM获取一个appId。 然后我们的JobClient会对作业进行处理, 切分InputSplit, 将作业的Jar包, 配置文件和拷贝InputSplit信息拷贝到HDFS。 最后, 通过调用RM的submitApplication()来提交作业。
  4. 2. 作业初始化
  5. 当RM收到submitApplciation()的请求时, 就将该请求发给调度器, 调度器分配第一个容器, 然后RM在该容器内启动applicationmaster进程。该进程上运行着一个MRAppMaster的Java应用。其通过创造一些bookkeeping对象来监控作业的进度。 然后通过hdfs得到由JobClient已经处理好的作业信息。为每个Inputsplit创建一个map任务, 并创建相应的reduce任务。然后applicationmaster会对整个作业量进行判断,如果作业量很小, applicationmaster会选择在其自己的JVM中运行任务, 这种作业称作是uber task的方式。在任务运行之前, 作业的setup方法被调用来创建输出路径。
  6. 3. 任务分配
  7. 如果不是小作业, 那么applicationmaster向RM请求更多的容器来运行所有的map和reduce任务,每个容器只能对应一个任务。这些请求是通过心跳来传输的, 包括每个map任务的数据位置, 比如Inputsplit的主机名和机架。调度器利用这些信息来调度任务, 尽量将任务分配给有存储数据的节点, 或者分配给和存放Inputsplit的节点相同机架的节点。
  8. 4. 任务运行
  9. 当一个任务由RM的调度器分配了一个容器后, applicationmaster与NM通信来启动容器。任务由一个为YarnChild的Java应用执行。在运行任务之前首先本地化任务需要的资源, 比如作业配置, JAR文件, 以及hdfs中保存的任务所需的所有文件。最后, map任务或者reduce运行在一个叫YarnChild的进程当中。
  10. 5. 进度和状态更新
  11. 每个NM会想applicationmaster汇报自己的工作状态,JobClient会每秒轮训检测applicationmaster,这样就能随时收到更新信息。
  12. 6. 作业完成
  13. 除了向applicationmaster请求作业进度外, JobClient每5分钟都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后,applicationmaster和NM会清理工作状态, OutputCommiter的作业清理方法也会被调用. 作业的信息会被作业历史服务器存储以备之后用户核查.
  14. yarn对异常task的处理(推测执行)?
  15. 推测执行是在分布式环境下,因为某种原因造成同一个job的多个task运行速度不一致,有的task运行速度明显慢于其他task,则这些task拖慢了整个job的执行进度,为了避免这种情况发生,Hadoop会为该task启动备份任务,让该speculative task与原始task同时处理一份数据,哪个先运行完,则将谁的结果作为最终结果。推测执行优化机制采用了典型的以空间换时间的优化策略,它同时启动多个相同task(备份任务)处理相同的数据块,哪个完成的早,则采用哪个task的结果,这样可防止拖后腿Task任务出现,进而提高作业计算速度,但是,这样却会占用更多的资源。

六、 yarn执行策略

  1. yarn调度器的策略?
  2. Hadoop作业调度器主要有三种:FIFO(先进先出)、容量(Capacity Scheduler)和公平(Fair Scheduler)。
  3. Apache Hadoop默认的资源调度器是Capacity Scheduler。
  4. CDH框架默认调度器是Fair Scheduler。
  5. FIFO调度器:单队列,根据提交任务的先后顺序,先来先服务。
  6. 容量调度器:按照容器的优先级分配资源。
  7. 公平调度器:默认所有作业获取的资源相同,如果某一时刻一个作业应获资源与实际获取的资源相差较大(缺额),调度器会优先为去缺额大该作业分配资源。

七、shuffle优化:

  1. 配置方面:(1)增大map阶段的缓冲区大小。
  2. (2)map阶段输出结果使压缩;压缩算法使用lzo。
  3. (3)增加reduce阶段copy数据线程数。
  4. (4)增加副本数,从而提高计算时的数据本地化。
  5. 程序方面:(1)在不影响计算结果的情况下建议使用combiner。
  6. (2)输出结果的序列化类型尽量选择占用字节少的类型。
  7. 架构方面:将http改为udp,因为http还要进行3次握手操作。

八、脑裂

  1. Hadoop中的脑裂
  2. 1、定义
  3. 脑裂:一种高可用性(HA)集群中的异常状态,由于网络延迟或设备故障导致Active NameNode与部分或全部集群失去联系,而Standby NameNode误认为Active NameNode已经失效,因此自行切换为Active状态,同时,原来的Active NameNode在网络恢复后可能仍然存活,并继续服务,这样就导致了两个Active NameNode并存的情况,那么两个NameNode都如果同时尝试写入数据或修改元数据,就可能导致数据不一致性。
  4. 2、解决策略
  5. ZooKeeper仲裁:Hadoop HA架构通常依赖于ZooKeeper进行主备选举和状态监控,通过ZooKeeper保证在同一时间只有一个NameNode被认定为Active。
  6. 共享存储隔离机制:当出现脑裂情况时,使用一个共享存储确保在切换过程中只有新的Active NameNode可以写入日志,旧的Active NameNode会被阻止对共享存储进行操作,从而避免冲突。
  7. 健康检查与心跳机制:通过心跳机制监测各个节点的状态,确保只有健康的、能够正常通信的NameNode才能成为Active。
  8. 手动干预:尽管有自动机制,但在某些复杂情况下可能仍需要管理员手动介入以解决脑裂问题。

九、hadoop优化

  1. 1、数据输入优化
  2. 合并小文件:每个小文件都会产生一个map任务,合并小文件能够减少map任务的产生,提高效率。
  3. 2、Map阶段优化
  4. 在Map之后,可以进行预聚合,减少shuffer阶段数据的拉取量以及Reducer端的计算量。
  5. 3、Reduce阶段优化
  6. 但数据量很大的适合,可以考虑增加Reduce的个数
  7. 4、资源调优
  8. 数据本地化:将计算任务分配给数据所在的节点进行处理,减少数据传输的开销,提高计算效率。

十、如何解决在MapReduce任务中的数据倾斜问题?

  1. 1、提前在map端进行combine,减少shuffer阶段传输的数据量
  2. 2、采用局部聚合加全局聚合的方式
  3. 例如:
  4. 第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
  5. 第二次mapreduce,去掉key的随机前缀,进行全局聚合。
  6. 思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
  7. 缺点:这个方法进行两次mapreduce,性能稍差。
  8. 3、增加Reducer的个数,提升并行度
  9. JobConf.setNumReduceTasks(int)
  10. 4、大小表连接时可能会产生数据倾斜
  11. 解决方法:Map Join
  12. Map Join通过将小表的数据加载到内存中,并构建一个哈希表,然后在Map阶段将大表的数据按照Join键进行哈希计算,与内存中的哈希表进行匹配。如果匹配成功,则将两个表的记录进行连接并输出。

十一、edits文件与fsimage文件是什么?

namenode没隔1H/64M会生成一个edits文件,并同步一份给secondaryname,如果是第一次同步,secondarynamenode会基于这个日志文件生成一个fsimage快照文件,并将这个快照文件同步一份给namenode。如果不是第一次,secondarynamenode会将发送过来的日志文件与上一次的快照文件合并产生新的快照文件,并同步一份给namenode,注意,namenode中的日志文件会不断地增加,但是快照文件只会保留最近的两次。

十二、描述一下Hadoop高可用的原理

  1. Hadoop的高可用性是通过Hadoop集群中的主从节点之间的备份和自动故障恢复机制来实现的。
  2. Hadoop高可用集群会有一个活跃的namenode节点与一个备份的namenode节点
  3. 当activity namenode节点反生故障,通过故障转移控制器与zookeeper的选举机制,stabdby namenode会成为新的activity namenode,
  4. 而发送故障的activity namenode节点会转为stabdby namenode。
  5. 同一时刻内只会有一个活跃的namenode节点。

十三、MapReduce作业执行的过程中,中间的数据会存在什么地方?

在MapReduce作业执行的过程中,中间的数据会存在本地磁盘上,而不是存储在内存中。这是因为MapReduce框架通常处理大规模的数据集,无法完全存储在内存中。

十四、MapReduce Map到Reduce默认的分区机制是什么?

MapReduce中默认的分区机制是根据Key的哈希值进行分区。具体来说,Map阶段输出的每个键值对都会根据键的哈希值被分配到不同的分区中,同一个键的所有值都会被发送到同一个分区中。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/763433
推荐阅读
相关标签
  

闽ICP备14008679号