Hadoop面试题总结

一 、介绍一下hadoop

sql 复制代码
综述:hadoop是一个适合海量数据的分布式存储和分布式计算的平台
分述:hadoop包含三大组件,分别是HDFS、MapReduce和YARN	

--HDFS(分布式文件系统)
HDFS集群由NameNode,DataNode,SecondaryNameNode构成

NameNode:主要负责接受用户请求、存储元数据(描述文件的数据,如文件名、文件大小、目录名、文件创建时间等)

DataNode:主要负责存储数据,管理用户的block,文件默认会按照每128M切分为block块存储在DataNode上,每个block块默认会有三个副本存放在不同的DataNode上,DataNode会通过心跳机制定期向NameNode汇报自身所保存的文件block块信息

SecondaryNameNode:主要负责辅助NameNode,定期合并fsimage(快照文件)和edits(日志文件),并同步一份给NameNode

--MapReduce: 分布式计算系统 	
MapReduce分为map阶段和reduce阶段,map阶段与reduce阶段中间的过程被称为shuffer

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


--YARN: 分布式资源调度系统
YARN:yarn由4部分组成。
1. ResourceManager主要功能是:
(1)接收用户请求
(2)管理调度资源
(3)启动管理am
(4)管理所有nm,处理nm的状态汇报,向nm下达命令。
2.Container:yarn的应用都是运行在容器上的,容器包含cpu,内存等信息。
3.NodeManager:NM是每个节点上的资源和任务管理器,它会定时地向RM汇报本节点上的资源使用情况和各个容器的运行状态;同时负责对容器的启动和停止。
4. ApplicationMaster:管理应用程序。向RM获取资源、为应用程序分配任务、 监控所有任务运行状态。

二、HDFS读写数据流程

HDFS写数据流程

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

HDFS读数据流程

sql 复制代码
1.使用HDFS提供的client,向远程的NameNode发起RPC请求
2.namenode会视情况返回文件的部分block块信息列表或者全部block,对于每个block,namenode都会返回该block副本的DataNode地址
3.client会选取离最近的DataNode读取block块
4.建立socket流,DataNode发送数据,以packet的单位接收,先在本地缓存,然后写入目标文件。读取完block,关闭当前的datanode连接,再寻找下一个block最佳的datanode。
5.读取完block后且文件没有读取完,client继续向namenode获取下一批block块
6.后面的block块相对于append到前面的block块,最后合成最终需要的文件
7.读取一个block都会进行checksum验证。如果读取DataNode出现错误,client会通知NameNode,然后再从下一个拥有block的DataNode继续读。

三、 HDFS的federation(联邦机制)

sql 复制代码
HDFS Federation设计可解决单一命名空间存在的以下几个问题:
(1)HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点。
(2)性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率。
(3)良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很小。

四、 yarn执行流程

sql 复制代码
yarn执行流程:
1. 作业提交
首先我们将任务提交给JobClient,JobClient会向RM获取一个appId。 然后我们的JobClient会对作业进行处理, 切分InputSplit, 将作业的Jar包, 配置文件和拷贝InputSplit信息拷贝到HDFS。 最后, 通过调用RM的submitApplication()来提交作业。

2. 作业初始化
当RM收到submitApplciation()的请求时, 就将该请求发给调度器, 调度器分配第一个容器, 然后RM在该容器内启动applicationmaster进程。该进程上运行着一个MRAppMaster的Java应用。其通过创造一些bookkeeping对象来监控作业的进度。 然后通过hdfs得到由JobClient已经处理好的作业信息。为每个Inputsplit创建一个map任务, 并创建相应的reduce任务。然后applicationmaster会对整个作业量进行判断,如果作业量很小, applicationmaster会选择在其自己的JVM中运行任务, 这种作业称作是uber task的方式。在任务运行之前, 作业的setup方法被调用来创建输出路径。

3. 任务分配
如果不是小作业, 那么applicationmaster向RM请求更多的容器来运行所有的map和reduce任务,每个容器只能对应一个任务。这些请求是通过心跳来传输的, 包括每个map任务的数据位置, 比如Inputsplit的主机名和机架。调度器利用这些信息来调度任务, 尽量将任务分配给有存储数据的节点, 或者分配给和存放Inputsplit的节点相同机架的节点。

4. 任务运行
当一个任务由RM的调度器分配了一个容器后, applicationmaster与NM通信来启动容器。任务由一个为YarnChild的Java应用执行。在运行任务之前首先本地化任务需要的资源, 比如作业配置, JAR文件, 以及hdfs中保存的任务所需的所有文件。最后, map任务或者reduce运行在一个叫YarnChild的进程当中。

5. 进度和状态更新
每个NM会想applicationmaster汇报自己的工作状态,JobClient会每秒轮训检测applicationmaster,这样就能随时收到更新信息。 

6. 作业完成
除了向applicationmaster请求作业进度外, JobClient每5分钟都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后,applicationmaster和NM会清理工作状态, OutputCommiter的作业清理方法也会被调用. 作业的信息会被作业历史服务器存储以备之后用户核查.

yarn对异常task的处理(推测执行)?
   推测执行是在分布式环境下,因为某种原因造成同一个job的多个task运行速度不一致,有的task运行速度明显慢于其他task,则这些task拖慢了整个job的执行进度,为了避免这种情况发生,Hadoop会为该task启动备份任务,让该speculative task与原始task同时处理一份数据,哪个先运行完,则将谁的结果作为最终结果。推测执行优化机制采用了典型的以空间换时间的优化策略,它同时启动多个相同task(备份任务)处理相同的数据块,哪个完成的早,则采用哪个task的结果,这样可防止拖后腿Task任务出现,进而提高作业计算速度,但是,这样却会占用更多的资源。

五、 yarn执行策略

sql 复制代码
yarn调度器的策略?
    yarn默认是计算能力调度
    FifoScheduler:根据先进先出排队,最简单的调度器。
    CapacityScheduler(计算能力调度)、FairScheduler(公平调度):
    相同点:(1)都是多队列。
            (2)都有资源最大最小上线限制。
            (3)都是资源共享,每个队列剩余的资源可以给其他队列使用。
    不同点:(1)队列排序算法不同:计算能力调度资源使用量小的优先。公平调度根据公平排序算法排序。
            (2)应该用选择算法不同:计算能力调度是先进先出。公平调度先进先出或者公平排序算法。
            (3)资源抢占:公平调度如果当前队列有新应用提交后,会把共享出去的资源抢夺回来。

六、shuffle优化:

sql 复制代码
配置方面:(1)增大map阶段的缓冲区大小。
        (2)map阶段输出结果使压缩;压缩算法使用lzo。
        (3)增加reduce阶段copy数据线程数。
        (4)增加副本数,从而提高计算时的数据本地化。
程序方面:(1)在不影响计算结果的情况下建议使用combiner。
        (2)输出结果的序列化类型尽量选择占用字节少的类型。

架构方面:将http改为udp,因为http还要进行3次握手操作。
相关推荐
材料苦逼不会梦到计算机白富美1 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
拓端研究室TRL1 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗1 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
想进大厂的小王1 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情2 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
编码小袁2 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式2 小时前
大数据治理:确保数据的可持续性和价值
大数据
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk3 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
激流丶3 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic