1、HDFS读写流程数据写入流程
1 .客户端请求NN上传文件
2.NN检查目标文件是否存在,父目录是否存在,并返回是否可以上载
3 .客户端请求将第一个块上载到哪个DN
4.NN返回3个DN节点,分别返回dn1、dn2、dn3
5 .客户端向dn1请求数据上传,dn1接收该请求后,继续调用dn2,随后dn2调用dn3,建立该通信管道
6.dn1、dn2、dn3阶段响应客户端
7 .客户端开始向dn1上传第一个块(从磁盘读取数据并将其放置在本地内存缓存中),以Packet(64k )为单位,当dn1接收到一个packet时向dn2上传,dn2向dn3上传
8 .完成一个块的传输后,客户端再次请求NameNode上传第二个块的服务。 (重复执行步骤3-7。
PS:packet的大小为64K,由512字节的chunk构成,包括4字节的chunksum验证
数据读取流程
1 .客户端向NN请求下载文件,NN通过查询元数据,找到文件块所在的DN地址。
2 .选择dn (就近原则,并随机)服务器,委托读取数据。
3.DN开始向客户端传输数据(从磁盘读取数据输入流,按Packet单位进行检查)。
4 .以Packet为单位接收客户端,将其缓存在本地,然后写入目标文件。
2.Hadoop-MR中的shuffle工作流
3.Yarn工作机制提交流程
1.MR程序向客户端所在的节点提交
2.YarnRunner向RM申请APP
3.RM将此APP应用程序的资源路径返回给YarnRunner
4 .该程序向HDFS提交执行所需的资源。 所需的资源是xml配置文件、Jar包和Job.spilt
5 .程序资源提交完成后,申请执行mrAppMaster。
6.RM将用户请求初始化为Task
节点管理器之一接收任务任务
8 .此节点管理器创建容器容器并生成映射器
9 .控制器将资源从HDFS本地复制。
10.MRAppmaster向RM申请执行映射任务资源。
11.RM将执行映射任务的任务分配给其他两个节点管理器,其他两个节点管理器分别接收任务并创建容器。
12.MR将程序启动脚本发送到接收到任务的两个节点管理器,两个节点管理器分别启动MapTask,MapTask对数据分区进行排序。
13.MrAppMaster等待所有映射任务运行完成,然后向RM申请容器以运行ReduceTask。
14.ReduceTask向映射任务获取相应分区的数据。
15 .程序执行完成后,MR向RM申请注销自己。
4、Hive 体系结构
将hql转换为MR任务流
1 .进入程序,利用Antlr框架定义HQL的语法规则,对HQL完成词法语法分析,将HQL转换为AST (抽象语法树)。
2 .遍历ast,抽象化作为查询的基本构成要素的QueryBlock (查询块),可以看作最小的查询执行单元。
遍历查询块并将其转换为操作树(即逻辑执行计划)可以理解为不可分割的逻辑执行单元。
4 .使用逻辑优化程序对操作树进行逻辑优化。 例如,合并不需要的ReduceSinkOperator,减少Shuffle数据量。
遍历操作树并将其转换为任务树。 这意味着将它翻译为MR任务的流程,并将逻辑执行计划转换为物理执行计划。
6 .使用物理优化程序对任务树进行物理优化。
7 .制定最终执行计划,并将任务提交给Hadoop集群执行。
即hql-ast-query block-operator tree-task tree -最终执行计划
5.HBase数据读写流程数据写入流程
1 .客户端首先访问zookeeper以获取hbase:元表位于哪个注册服务器上。
2 .访问对应的注册服务器,获取hbase:meta表,从写入请求的namespace:table/rowkey中获取目标数据位于哪个注册服务器的哪个注册中将此表的注册信息和meta表的位置信息缓存在客户端的meta cache中,以便于下次访问。
3 .与目标注册服务器的通信;
4 .将数据依次写入(添加) wal;
5 .将数据写入相应的MemStore,数据按MemStore排序;
6 .向客户端发送ack
当MemStore写入时机到来时,将数据写入HFile。
也就是说,首先与ZK进行通信,找出元表所在的位置,基于元表找出目标数据在哪个RS的哪个r上,建立缓存。 然后与RS进行通信,依次追加写入WAL,写入写缓存排序。
数据读取流程
1 .客户端首先访问zookeeper以获取hbase:元表位于哪个注册服务器上。
2 .访问对应的Region Server,获取hbase:meta表,从读请求的namespace:table/rowkey中获取目标数据是哪个Region Server的哪个Region 将此表的注册信息和meta表的位置信息缓存在客户端的meta cache中,以便于下次访问。
3 .与目标注册服务器的通信;
在BlockCache、MemStore和BC中查询未缓存的storefile(hfile )文件中的目标数据,并合并所有找到的数据。 这里的所有数据都是指同一数据的不同版本(time stamp )或不同类型(Put/Delete )。
5 .在Block Cache中缓存查询的新数据块(Block,HFile数据存储单元,默认大小为64KB )。
6 .向客户端返回合并后的最终结果。
注:HBase阅读速度比写作慢
访问BlockCache/Memstore/中未缓存的StoreFile
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
To Be Continued…