大数据
reducer主要有三个阶段
1.Shuffle(一部分):
Reducer通过网络使用HTTP从每个mapper复制排序的输出(K2V2)。
2.Sort:
框架合并按键对reducer输入进行排序(因为不同的mapper可能输出相同的键)。
shuffle和sort阶段是同时发生的,也就是说,在提取输出时,它们是合并的。
SecondarySort :
要对值迭代器返回的值进行二级排序,应用程序应该使用二级键扩展键并定义一个分组比较器。
键将使用整个键进行排序,但将使用分组比较器进行分组,以决定在同一个调用中发送哪些键和值以进行缩减。
分组比较器是通过Job.setGroupingComparatorClass(Class)指定的。
排序顺序由Job.setSortComparatorClass(Class)控制。
例如,假设您希望找到重复的web页面,并将它们都标记为“最知名”示例的url。你会这样做:
地图输入键:url
地图输入值:文档
地图输出键:文档校验和,url pagerank
地图输出值:url
瓜分者:通过校验和
OutputKeyComparator:通过校验和然后减少pagerank
OutputValueGroupingComparator:通过校验和
3、Reduce
在这个阶段中,对于排序输入中的每个<key(值的集合)>
调用reduce(对象、Iterable、org.apache.hadoop.mapreduce. reduce. context)方法。
reduce任务的输出通常通过上下文写入记录写入器。写(对象,对象)。
总结:
reducer个数由job.setNumReduceTasks(tasks)控制。
程序有多少个输出结果reducer个数,如果没有reducer那么由mapper个数
mapper个数由inputsplit控制,inputsplit数由块数控制
注意: 如果一个文件大小 小于块大小*1.1 大于块大小 有2个块 有1个inputsplit
10.26
InputFormat:
InputFormat描述了Map-Reduce作业的输入规范。
Map-Reduce框架依赖于作业的InputFormat:
1.验证job的输入规范。
2.将输入文件分解为逻辑inputsplit,每个inputsplit都被分配给一个单独的mapper。
3.提供RecordReader实现,用于从逻辑InputSplit中收集输入记录,以便mapper进行处理。
基于文件的inputformat(通常是FileInputFormat的子类)的默认行为是根据输入文件的总大小(以字节为单位)
将输入拆分为逻辑inputsplit。但是,输入文件的文件系统块大小被视为输入分割的上限。
可以通过mapreduce.input.fileinputformat.split.minsize设置分割大小的下界。
FileInputFormat:
isSplitable(FileSystem fs, Path filename)
是否切分
getSplits(JobConf job, int numSplits)
获取逻辑切分
TextInputFormat:
FileInputFormat默认使用这个
isSplitable是否可切分
判断是否压缩,如果没有压缩返回true
判断是否属于可以切分的压缩模式,若属于返回true
压缩
文件压缩的两大好处:减少存储文件所需要的磁盘空间,并加速数据网络和磁盘上的传输
详见权威指南99页
LineRecordReader:
将键视为文件中的偏移量,将值视为行。
next()
给下一个KV赋值
对aa.txt文件可能被分成两个块进行分析分别求奇数偶数行和
如何判断奇偶行???
重写TextInputFormat
isSplitable
getRecordReader
重写LineRecordReader
构造方法
next
编写mapper
编写reducer
编写驱动
注意版本选择老版本的