一、MapReduce的高级特性
提交job流程分析:
1、序列化
() 复习:Java的序列化
() MapReduce的序列化:核心接口:Writable
如果一个类实现了Writable接口,该类的对象可以作为key和value
举例1:读取员工数据,生成员工的对象,直接输出到HDFS
举例2:使用MapReduce序列化重写“求部门工资的总额的例子”
2、排序
()规则:按照Key2排序
()基本数据类型
(1)数字: 默认:升序
可以改变默认的排序规则(创建自己的比较器即可)
(2)字符串: 默认:字典顺序
可以改变默认的排序规则(创建自己的比较器即可)
(*)对象
(1)复习:SQL的排序
order by后面 + 列名、表达式、列的别名、序号
+ 多个列
desc只作用于最近的一列
补充一点知识:Oracle中,排序后得到结果是不是原来的表?(不是,是临时表的数据)
(2)员工对象的排序:接口:WritableComparable
(*)一个列排序
(*)多个列排序
前提:(*)该对象必须是Key2
(*)必须实现序列化接口:Writable接口
(*)对象必须是可排序的:类似Java的对象排序
java.lang 接口 Comparable<T>
(*)MapReduce二次排序
3、分区:比较重要
(1)什么是分区?partition
结合关系型数据库Oracle
(2)MR的分区:根据Map的输出<key2 value2>进行分区
(*)默认情况下,MR的输出只有一个分区(一个分区就是一个文件)
(*)自定义分区:按照员工的部门号进行分区
日志
18/09/12 21:45:36 INFO mapreduce.Job: map 100% reduce 33%
18/09/12 21:45:40 INFO mapreduce.Job: map 100% reduce 67%
18/09/12 21:45:41 INFO mapreduce.Job: map 100% reduce 100%
4、合并: Combiner
(1)合并是一种特殊的Reducer
(2)合并是在Mapper端执行一次合并,用于减少Mapper输出到Reducer的数据量,可以提高效率。
(3)举例:以WordCount为例
(4)注意:一定要谨慎使用Combiner,有些不能使用:求平均值
有Combiner,或者没有Combiner,都不能改变Map和Reduce对应数据的类型
注意Map和reduce前后的数据类型: