MapReduce中mapTask和reduceTask的执行流程
一个完整的mapreduce程序在分布式运行时有三类实例进程: 1)MrAppMaster:负责整个程序的过程调度及task监督 2)MapTask:负责map阶段的整个数据处理流程 3)ReduceTask:负责reduce阶段的整个数据处理流程
maptask的执行流程
1).首先客户端准备好要处理的文件,客户端向Yarn集群提出请求创建Mrappmaster并提交切片等相关信息. 2).Yarn调用ResourceManager来创建Mrappmaster,而Mrappmaster则会根据切片的个数来创建几个Map Task,有多少个块就有多少个任务,这样MapTask进程开始工作。 3)MapTask从文件中读取各自需要处理的数据,默认是TextInputFormat格式(可以自定义)。数据都是以<key,value>键值对形式存在,然后maptask执行map任务中的代码,在Mapper中调用map()方法来对每一行数据进行相关的业务上的逻辑运算处理 4)然后map的结果会拆分为不同的分区,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中(环形缓冲区默认大小是100M,数据处理的特点:左侧写索引或者是元数据信息,右侧写数据,写满80%后溢写到磁盘,然后反向又开始写,如此反复)。自数据进入到环形缓冲区后,Shuffle过程正式开始。 5)进入到环形缓冲区之后在溢写之前会对数据进行一次排序。排序的方式是,先按照分区编号Partition进行排序,然后按照key进行排序。经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。 6)排完序之后就溢出到文件(分区且区内有序),整个过程会多次溢出到多个文件,在所有数据都溢出到文件之后,开始Merge归并排序(对同一个分区内溢出的多个有序的结果文件合并成一个大的溢出文件且完成归并排序) 之后的Combiner合并为可选流程:分区内合并和压缩。之后,写入到磁盘。至此MapTask的执行过程基本结束,等待reduce任务获取数据
reduceTask的执行流程 1)在所有Map Task任务都完成之后,根据分区的数量来启动相应数量的Reduce Task,并告知ReduceTask处理数据范围(数据分区)(有几个分区就启动几个Reduce Task,每个Reduce Task专门处理同一个分区的数据,比如处理MapTask1中partition0和MapTask2中partition0的数据) 2)ReduceTask根据自己的分区号,去各个MapTask机器上拷贝相应分区内的数据到本地内存缓冲区,缓冲区不够的话就溢写到磁盘。待所有数据拷贝完毕之后,ReduceTask会将这些文件再进行合并排序,排好序之后按照相同的key分组。至此Shuffle的过程基本结束。 3)在分组之后一次读取一组数据到Reducer,调用reduce任务的代码进行聚合处理,通过目标输出路径写入处理的结果 (通过context.write默认以TextOutputFormat格式经RecordWriter下入到文件)。一般有多少个reducetask就有多少个文件,ReduceTask过程结束。
HIVE中内部表和外部表的区别, 分区表和分桶表的区别以及作用
区别:
1)内部表数据由 Hive 自身管理,外部表数据由 HDFS 管理; 2)内部表数据存储的位置是 hive.metastore.warehouse.dir (默认:/user/hive/warehouse),外部表数据存储的位置由自己定制(在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里) 3)删除内部表会直接删除元数据及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
分区表和分桶表的区别以及作用
分桶和分区的区别:
-
分桶的目的是减少笛卡尔积的数量,提升连接性能,对于查询效率的提升是次要提升
-
分区对于查询效率的提升是主要提升
-
分桶字段真实存在,而分区字段是虚拟字段,是使用元数据映射出来的
-
分桶表只能间接加载数据, 而分区表可以动态静态两种方法加载数据
-
分桶表是使用一定规则进行文件的拆分,而分区表是拆分为多个文件目录
共同点:都可以提高查询效率,都是表的优化方式,并不是必须存在的. 都是只有按照分区或者分桶字段连接或查询才能提高效率,否则和普通表无异.分区的作用是可以使用分区字段查询减少全部扫描,提高查询效率