这里的分片不是物理分片,输入分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数据
例如10MB文件,切分10各1MB小文件,0-1MB位置定义为第一个切片,1MB-2MB定义为第二个分片
map阶段(每个分片对应一个map task)
每个mapper任务都是一个java进程,它读取hdfs文件中自己对应的输入分片,将分片中记录按照一定规则调用map函数解析成键值对,如<word,1>,<word,1>形式,如果有100个键值对,就调用100次map方法
键:每一行的起始位置 值:本行的文本内容
map shuffle阶段、洗牌阶段,分区partition,排序sort,combine(本地reducer),合并
map方法输出的数据,进入到内存缓冲区,缓冲区满了后,启动线程写磁盘,在启动线程写磁盘之前,对数据进行key的hash分区,对每个分区进行key值排脊早神序,设置了combiner,则对排序的数据做简单的合并重复key值 *** 作,如<word,2>,写磁盘 *** 作会产生多个文件,当map写完磁盘后则对文件进行一次合并,确保一个map task最终只生成一个数据文件
reduce shuffle阶段:copy、merge、reduce
map方法输出完成后,reduce线程会启动copy线程,请求所有map task的输出结果,如果reduce端接收的数据量小,则直接存内存中,数据量超过内存,则数据数据合并后写磁盘,在写磁盘过程中会把这些文件合并成一个更大的有序文件,最后一次合并的结果没有写磁盘,直接输入给reduce函数中
对copy过来的数据先睁配放入内存缓冲区中,如果是数据量超过缓冲区大小,则对数据合并后写磁盘,如果设置combiner,combiner也可以这个时候做合并,如果map task1中的<word,1>,map task2中的<word,2>,那么combiner之后则为<word,{1,2}>
调用reduce函数
reduce阶段分组好的<word,{1,2}>,调用reduce函数进行聚合<word,3>,将结果输出到hdfs,每个reduce进程会对应一个输出文件,名称以part-开头
词频统计mr过程:
split:由于输入文件太大,mapreduce会对其进行分割,大文件会被切分成多份
map:解析樱亏出每一行中的每个单词,并在后面记上数字1,表示此单词出现过1次
shuffle:将每一份中相同的单词分组到一起,并按默认字母顺序进行升序排序
reduce:将每一组中的单词出现的次数进行累加求和
以上复杂的运行过程,用一张图来简单说明,方便理解和记忆,如下图所示:
使用Eclipse建立MapReduce工程1.1 下载与安装Eclipse
1.2 配置MapReduce环境
1.3 新建MapReduce工程
2.通过源码初识MapReduce工程
2.1 通俗理解MapReduce原理
2.2 了解MR实现词频统计的执行扮纯流程
2.3 读懂官方提供的WordCount源码
3.编程实现按日瞎尺期统计访问次数
3.1 分析思路与处理逻辑
3.2 编写核心模块代码
3.3 任务实现
4.编程实现按访问次数排序
4.1 分析思路与处理逻辑
4.2 编写核心模块代码
4.3 任务实现
5.小结
6.实训
实训1.获取成绩表的最高分记录
实训2.对两个文件中的数据进行合并和去厅神咐重
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)