MR
1.MapTask调用Inputformat方法创建一个RecordReader
RecordReader以此调用nextkeyvalue getcurrentkey getcurrentvalue方法
获取<K,V>传递给Mapper类,每读取一行数据就会调用一次map方法,然后将
通过逻辑处理后的<K,V>输出到OutputCollector
2.Collector将数据缓存到环形缓冲区中,存满80%的数据后会溢出到溢出器
spiller中,然后再溢出器中进行分区和快速排序,将分区后的数据生成
几个文件(多次溢出生成多个文件)
3.在Merge中将这几个文件进行归并排序后生成一个(局部有序–>分区内有序)文件(一个MapTask对应一个大文件)
4.一个Reduce去所有MapTask的输出文件中拉去相同分区的数据然后通过Merger进行归并排序
(ReduceTask数量可以通过手动设置) 第二个再去相应分区拉取
5.ReduceTask从合并后的文件中读取 一个key传递给reduce方法,同时传递一个value迭代器
value迭代器的hasnext方法会判断文件中的下一个key
是否还是已经传入的key,如果是,则next可以返回下一个value 否则,hasnext直接返回false,本次reduce结束
6.Reducer中的reduce方法将输出的结果导入到外部文件系统
HBase:路由机制
1:到zookeeper上查找root表的位置
2:跟root表交互,查找meta表所在的位置
3:查找meta,确定rowkey所在的region以及regionserver的位置
4:跟数据所在的regionserver进行交互
5:regionserver转发io请求给region
6:查找memstore,如果有则返回,若无到hdfs上找
7:与hdfs进行交互读取数据
8:返回结果,首先会写memstore
9:返回结果到客户端
YRAN:job提交流程
1.客户端提交作业给resourcemanager
2.resourcemanager将信息加入到等待队列中并返回给客户端jobid,存储路径(HDFS上的路径)信息
3.客户端将job.jar、job.xml、job.split、job.splitinfo包括切片信息等信息上传到存储路径(HDFS上的路径/)
4.客户端通知resourcemanager可以启动job
5.resourcemanager将job加入到job队列当中,等待nodemanager领取job,将客户端发出命令启动AppMaster,然后nodemanager启动container,job.jar、job.xml、job.split、job.splitinfo等信息下载到container内
6.AppMaster计算资源,向resourcemanager请求maptask的资源(container启动maptask)
7.resourcemanager根据心跳信息分配资源(container),下载job.jar到container内,AppMaster启动maptask(yarnchild)
8.maptask执行完成,通知AppMaster,然后释放maptask资源,AppMaster向resourcemanager申请reducetask的资源
9.resourcemanager分配资源(container),下载job.jar到container内,AppMaster启动reducetask(yarnchild)
10.reducetask执行完成,通知AppMaster,然后释放reducetask资源。AppMaster通知resourcemanager。AppMaster释放资源。