概述
一、隐藏的过程:
1、读取hdfs上的一个file文件
2、将块文件进行分片split(默认分片是hdfs的块大小,一个分片就是一个maptask)
3、读取split(分片)文件中的一行内容
4、将一行内容转换为key-value的形式(key:为偏移量(即多少行,我的理解),value:为一行的内容)
5、将key-value输入到自己的map函数中
二、进入自己写的map函数:
--自己的map函数作用是:
1、读入一个key-value的数据(每一次只能读取一行数据,循环读完分片中所有的行当前maptask结束)
2、对该行的内容进行处理加工(即对value中的内容进行处理)(例如拆分)
3、输出处理完一行内容生成的key(单词)和value(1)进行输出(进入shuffle中)
三、进入到隐藏的过程的shuffle过程
shuffle过程是将所有的map函数的执行的结果(重点)进行以下步骤:
1、将map执行的结果(所有的key-value值)内存缓存区
备注:map方法(写入)-->内存缓冲区(溢出)-->本地多个溢出磁盘文件(合并)-->大的溢出文件
备注:溢出和合并都会调用partitioner进行分区和排序(key)
2、将所有的结果放入到不同的分区中(key取余reduce个数=该分区的编号)
备注:一个分区编号对应唯一的一个reduce的编号。
3、将同一个分区中的key进行统一的排序(字典排序)
4、将同一个分区中的key-value进行合并:([key1,value1,value2,value3)],是map文件分片的唯一)
5、当所有的maptask完成处理后reduc会按照自己编号到拉取所有的map生成的对应的分区下的数据,对拿过来的文件进行合并排序,按照map-key进行唯一的处理合并成:([key1,value1,value2,value3,value4...)],是处理文件的唯一)
shuffle过程完成进入到reduce 中
四、--自己的reduce函数:map传过来的(key1,value1)值经过shuffle处理后,输出的(key,value)值(每一次只读唯一的(map-key,values)),进行统一的处理。
输入为:([key1,value1,value2,value3,value4...)],是处理文件的唯一)
key:map处理一行内容生成的数据(例如hello); value是在源文件中相同key组成之后,返回给我们的一个集合(例如该集合是[1,1,1,1])。
(比如说进行循环相加i++)
输出为:通过job类中的FileOutputFormat.setOutputPath(job, new Path("/result"))
写入到hdfs的文件中。
context.write(new Text(key),new LongWritable(count))
map函数:主要是读取文件并分片,指定输出的key和输出的value(一般情况下输出的map-key是需求最后的主键,而value是需要进行聚合的数据);
reduce函数:按照map指定的map-key对文件进行聚合处理(文件:读取的所有文件,且是经过map函数shuffle过程处理过后的文件)
以上全为本人对MR过程的理解,希望对大家有所帮助!,如有不正确的地方请多多指教!
最后
以上就是单纯小鸭子为你收集整理的(统计单词数)mapreduce函数理解的全部内容,希望文章能够帮你解决(统计单词数)mapreduce函数理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复