1 hdfs的上传文件原理(工作原理)☆☆☆☆☆

简单版本:
1 客户端向NameNode请求上传文件,NM检查文件信息是否允许上传
2 NameNode给Client返回一个可以上传的信息
3 Client请求上传第一个Block文件信息
4 NM返回可以上传到那个DataNode上
5 Client根据NameNode返回信息向DataNode发送block文件
6 第一台DataNode接受到block文件后依次将Block文件发送给B,B在发送给C
7 客户端接受到第一块上传完毕的信息后,接着上传第二块文件
详细版本:
1)client客户端发送上传请求,通过RPC与namenode建立通信,namenode检查该用户是否有上传权限,以及上传的文件是否在hdfs对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息
2)client根据文件的大小进行切分,默认128M一块,切分完成之后给namenode发送请求第一个block块上传到哪些服务器上
3)namenode收到请求之后,根据网络拓扑和机架感知以及副本机制进行文件分配,返回可用的DataNode的地址

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

  1. 4)客户端收到地址之后与服务器地址列表中的一个节点如A进行通信,本质上就是RPC调用,建立pipelineA收到请求后会继续调用BB在调用C,将整个pipeline建立完成,逐级返回client<br /> 5client开始向A上发送第一个block(先从磁盘读取数据然后放到本地内存缓存),以packet(数据包,64kb)为单位,A收到一个packet就会发送给B,然后B发送给CA每传完一个packet就会放入一个应答队列等待应答<br /> 6)数据被分割成一个个的packet数据包在pipeline上依次传输,在pipeline反向传输中,逐个发送ack(命令正确应答),最终由pipeline 中第一个 DataNode 节点 A pipelineack 发送给 Client<br /> 7)当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个 block namenode重新选择三台DataNodeclient

2 hdfs的下载文件原理 ☆☆☆☆☆

简单版本:

  1. 客户端向NameNode请求下载文件
  2. NameNode返回要下载文件的元数据信息
  3. 客户端向DataNode读取block文件
  4. 读取完毕之后,将block合并成一个完整的文件

详细版本:
1)client向namenode发送RPC请求。请求文件block的位置
2)namenode收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后
3)Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)
4)底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕
5)当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表
6)读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读
7)read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据
8) 最终读取来所有的 block 会合并成一个完整的最终文件

3 mr的shuffle原理 ☆☆☆☆☆

4 hadoop的小文件过多会造成什么危害,如何处理(思路)☆☆☆☆

5 NameNode,DataNode,SecondaryNameNode的作用 ☆☆☆☆☆

  1. ** NameNode**:管理元数据信息,给子节点分配任务(FSImage是主节点启动时对整个文件系统的快照, Edits是修改记录)<br /> ** DataNode**:负责数据存储,实时上报心跳给主节点<br /> **SecondaryNameNode:**<br />1)首先,它定时到NameNode去获取edit logs,并更新到fsimage上。一旦它有了新的fsimage文件,它将其拷贝回NameNode中。<br /> 2 NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

6 fsimage和edits的作用 ☆☆☆☆☆

edits:记录 client 执行创建,移动,修改文件的信息,同时体现了 HDFS 的最新的状态(二进制文件)。
它分布在磁盘上的多个文件,名称由前缀 edits 及后缀组成.后缀值是该文件包含的事务 ID,同一时刻只有一个文件处于可读写状态.为避免数据丢失,事务完成后 client 端在执行成功前,文件会进行更新和同步,当 NN 向多个目录写数据时,只有在所有操作更新并同步到每个副本之后执行才成功。

fsimage:记录的是数据块的位置信息、数据块的冗余信息(二进制文件)
由于 edits 文件记录了最新状态信息,并且随着操作越多,edits 文件就会越大,把 edits 文件中最新的信息写到 fsimage 文件中就解决了 edits 文件数量多不方便管理的情况。
没有体现 HDFS 的最新状态。
每个 fsimage 文件都是文件系统元数据的一个完整的永久性的检查点。

7 yarn 集群的架构和工作原理知道多少 ☆☆☆☆☆

8 yarn 的三种资源调度模型 ☆☆☆☆

在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler
apache版本的hadoop默认使用的是capacity scheduler调度方式。CDH版本的默认使用的是fair scheduler调度方式

FIFO Scheduler(先来先服务):

FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。

FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞,比如有个大任务在执行,占用了全部的资源,再提交一个小任务,则此小任务会一直被阻塞。

Capacity Scheduler(能力调度器):

对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。

Fair Scheduler(公平调度器):

在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。

比如:当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。

需要注意的是,在Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。

9 yarn 提交任务的流程 ☆☆☆☆☆

当jobclient向YARN提交一个应用程序后,YARN将分两个阶段运行这个应用程序:一是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,监控运行直到结束。具体步骤如下:

  1. 用户向YARN提交一个应用程序,并指定ApplicationMaster程序、启动ApplicationMaster的命令、用户程序。
  2. RM为这个应用程序分配第一个Container,并与之对应的NM通讯,要求它在这个Container中启动应用程序ApplicationMaster。
  3. ApplicationMaster向RM注册,然后拆分为内部各个子任务,为各个内部任务申请资源,并监控这些任务的运行,直到结束。
  4. AM采用轮询的方式向RM申请和领取资源。
  5. RM为AM分配资源,以Container形式返回
  6. AM申请到资源后,便与之对应的NM通讯,要求NM启动任务。
  7. NodeManager为任务设置好运行环境,将任务启动命令写到一个脚本中,并通过运行这个脚本启动任务
  8. 各个任务向AM汇报自己的状态和进度,以便当任务失败时可以重启任务。
  9. 应用程序完成后,ApplicationMaster向ResourceManager注销并关闭自己