1.HADOOP集群的架构, 架构中各个节点的作用是什么?
HADOOP集群包括HDFS,YARN和MR。
HDFS是分布式存储框架。
NameNode:HDFS的主节点,负责接受用户的读写请求,负责管理各个从节点,负责管理HDFS的元数据。
DataNode:HDFS的从节点,负责执行数据的读写操作,负责向主节点定时汇报自己存储的块信息和自身运行的状态信息。
SecondaryNameNode:HDFS的辅助节点,辅助NameNode管理元数据,高可用的情况下转化为JournalNode
YARN是资源调度平台。
ResourceManager:YARN的主节点,负责接受用户的请求,负责启动Appmaster,负责YARN集群的资源分配。
NodeManager:YARN的从节点,负责执行Appmaster分配的任务,负责向主节点汇报自己资源信息。
Appmaster:不是节点,是一个进程,一个任务就会一个Appmaster,负责资源的申请和任务的分配以及与任务相关的管理工作。
MR是分布式计算引擎。
MapTask: 负责分的操作 负责分布式并行计算操作
reduceTask: 负责合的操作 负责聚合统计处理操作
2.HDFS的三大机制: 心跳机制 负载均衡机制 副本机制
心跳机制:DataNode每隔3秒就会向NameNode汇报,汇报的内容包括:自己存储的块信息以及当前的运行状态信息。默认每隔3秒一次,当NameNode连续10次没有收到DataNode的信息,就会认为DataNode可能宕机了,NameNode会每隔5分钟发送一次确认消息,连续两次没有收到DataNode的消息就认为DataNode真的宕机了。
负载均衡机制:主要是会保证每个DataNode存储的块信息大致相同,同时NameNode会优先将数据存储在剩余容量较大的DataNode上。
副本机制:可以将Block块信息存储在不同的副本,可以提高数据的安全性,默认是3个副本。
机架感知原理:
第一个副本放置在离当前客户端最近的一个机架上的某一个服务器中。
第二个副本放置在同第一个副本机架的另一个机器上。
第三个副本放置在另一个机架的某台机器上。
3.HDFS的数据写流程:
* 1- 客户端向NameNode发起写入数据的请求, NameNode接收到写入请求后, 首先会判断对应目录下是否存在要写入的文件, 如果有理解报错, 说写入的文件以存在, 如果不存在, 还会校验是否有写入数据权限, 如果没有, 直接报错, 报权限不足, 如果既不存在, 也有权限, 就会给客户端返回可以写入;
* 2- 客户端开始对要写入的文件进行切割操作, 默认是按照128M一个快来进行切割, 切割完后, 拿着
第一个Block块再次请求NameNode, 询问应该放置到那个位置下;
* 3- NameNode接收到请求后, 会根据网络拓扑关系 机架感知原理 副本机制 从所有的DataNode
选择一些合适的DataNode的节点地址返回给客户端;
* 4- DataNode接收到NameNode返回的DataNode节点列表后, 首先会先连接列表中第一个
DataNode, 然后让第一个DataNode连接第二次, 第二个连接第三次, 以此类推, 形成一个数据传输
管道, 同时反向还会构建一条ACK确认管道;
* 5- 客户端开始进行写入数据, 数据通过数据包的形式来进行传输, 每一个数据包为64kb大小, 当第
一个DataNode接收到数据后, 然后传递给第二个, 第二个传递给第三个 完成数据保存同时每个节点接收到, 还是在ACK中进行确认操作;
* 6- 当客户端发现各个节点都收到消息后, 开始传入下一个数据包, 依次类推, 知道将这个block所
有的数据全部写完;
* 7- 接着会拿着第二次block再次请求NameNode, 询问, 第二个block块应该存储在那些位置中,
后续循环执行 3~7 直到将所有block全部都写完。
4.HDFS的数据读流程
* 1- 客户端向NameNode发起读取数据的请求, NameNode接收到读取数据请求后, 首先判断对应目录下是否有这个数据, 如果没有, 直接报错, 返回不存在此文件, 如果有, 接着判断是否有读取数据的权限, 如果没有, 直接报错, 如果有, 那么就直接根据网络拓扑关系, 机架感知原理 返回对应文件各个
block所在的DataNode的地址, 如果block比较多, 可能此时先返回一部分, 如果块比较少, 那么直
接全部都返回了;
* 2- 客户端, 根据返回地址, 可以选择并行的方式, 或者串行的方式连接各个DataNode开始读取数
据, 采用IO流的方式, 直接获取;
* 3- 如果nameNode仅返回了一部分, 那么客户端会再次请求Namenode获取下一批block所在的地
址, 然后重复第二步, 不断的将数据全部读取到本地;
* 4- 当客户端全部读取完成后, 将各个block按照顺序拼接在一起, 形成了最终的文件。
5.HDFS的secondaryNameNode是如何辅助管理元数据
* 1- SNN会每隔一定的时间, 检测NameNode是否需要进行checkpoint(1个小时/128M);
* 2- SNN一旦达到对应阈值, 就会让Namenode执行checkpoint, 滚动形成一个新的edit文件;
* 3- SNN将之前整个edit文件和对应fsimage通过HTTP请求的方式将其拉取到SNN所在的节点上;
* 4- 将edits文件和fsimage文件读取到内存中, 进行内存合并操作, 将其合并为一个新的fsimage
文件(fsimage.checkpoint);
* 5- 将新的fsimage文件重新发送会给namenode, 放置到namenode指定的位置下即可;
* 6- NameNode将fsimage.checkpoint 重命名为 fsimage文件也正因为如何, secondaryNameNode应该是要具备和nameNode等量内存的空间大小。