最近有个任务就是处理上百G的日志文件,为了效率我们首先想到的是用hadoop,而hadoop框架中最重要的一
部分就是MapReduce,下面个人总结下MapReduce的流程:
1、MapRuduce File要处理得文件:File存储在HDFS上,切分成默认64M的Block,存储在多个DataNode节点上
2、MapReduce InputFormat:数据格式定义,例如以\n分割记录,“空格”分割单词
3、MapReduce Split:map函数的输入逻辑概念,一个inputSplit和Block是“1对1”或者“1对多”的关系
4、MapReduce RecordReader:每读取一条记录,调用一次map函数
5、MapReduce Map:执行map函数,在内存中增加数据
6、MapReduce Shuffle:Partion,Sort,Spill,Merge, Combiner,Copy,Memory,Disk……性能优化的大
有可为的地方
6.1、Partitioner:决定数据由哪个Reducer进行处理(例如用hash方法)
6.2、MemoryBuffer:内存缓冲区 三元组数据{"partion" "key" "value"}形式存储 缓冲区大小默
认100M,溢出阀值80M
6.3、Spill:内存缓冲超过80M时,spill线程锁住这80M内容,将数据写到本地磁盘,然后释放内存,
数据溢出前会先进行Sort、Combiner并发送到相同Reduce的key数据,这样可减少partitioner索引量
6.4、Sort:缓冲区按照key进行排序
6.5、Combiner:数据合并,将相同的key value值合并,combine函数其实就是reduce函数
6.6、Spill to Disk:溢写到硬盘 内存缓冲区每次数据溢写都会生成一个溢写文件,将相同partition
的数据存储到一块
6.7、Merge on disk:map后合并溢写文件
7、MapReduce Map Task:Map任务上的输出时按照partitiion和key排序的数据存储文件,一般有多个map task,
每个task有一个输出文件{key1 :[value1,value2...]} {key2 :[value1,value2...]}...
8、MapReduce Copy:将map端的输出文件按照相应的partition,copy到reduce端
9、MapReduce Spill:和Map端的Spill一样
10、MapReduce Sort:以相同的key值为参照排序
11、MapReduce combiner:value值合并
12、MapReduce merge:合并溢出文件
13、reduce函数:function reduce
附加一张官方的shuffle流程图;
下面凭借我自己的理解写一下具体数据在MapReduce过程中的形式变化:
样例数据:this is a hello hello world
a b a
b c b
1、数据被inputformat分隔为"this is a hello hello world",value1 "a b a ",value2 "b c b ",value3
(注:数据以split形式存储在Block中)
Map开始
2、map(value1) map(value2) map(value3) ----------> {"this",1}{"is",1}{"a",1}{"hello",1}.....{"c",1}{"b",1}
3、partion每个{key value},例如{"this",1} 让this对reduce个数n取模得到m,则{"this",1}----------->{m,"this",1}
4、按照key值进行sort,例如:{1,"a",1}{1,"b",1}{1,"a",1}------->{1,"a",1}{1,"a",1}{1,"b",1}
5、combine {1,"a",1}{1,"a",1}{1,"b",1} --------> {1,"a",2}{1,"b",1}
merge 如果没有设置上述combiner 则 {1,"a",1}{1,"a",1}{1,"b",1} ------> {1,"a",[1,1]}{1,"b",[1]}
6、map输出{1,"a",[1,1]}{1,"b",1}... ,这些数据被copy到1号reduce(因为partition的值为1)
(注:以上的输出数据没有经过combine)
Reduce开始
7、sort{1,"a",[1,1]}{1,"b",[1]}{1,"c",[1]}{1,"b",[1,1]}---------> {1,"a",[1,1]}{1,"b",[1]}{1,"b",[1,1]}{1,"c",[1]}
8、combine {1,"a",[1,1]}{1,"b",[1]}{1,"b",[1,1]}{1,"c",[1]}--------> {1,"a",[2]}{1,"b",[1]}{1,"b",[2]}{1,"c",[1]}
9、merge {1,"a",[2]}{1,"b",[1]}{1,"b",[2]}{1,"c",[1]}------>{1,"a",[2]}{1,"b",[1,2]}{1,"c",[1]}
10、reduce {1,"a",[2]}{1,"b",[1,2]}{1,"c",[1]}------->{1,"a",[2]}{1,"b",[3]}{1,"c",[1]}
即完成了一个wordcount程序,统计出单词个数a:2 b:3 c:1
(样例数据第一行不具代表性,博主悄悄地把这行数据的处理忽视了......)
其实整个MapReduce流程的最最神奇的地方在shuffle,因为整个MR程序的执行效率全在这个里面进行优化,而平时
我们仅仅是通过split或者string的连接来编写一些简单的map、reduce函数,殊不知得shuffle者得MapReduce,得
MapReduce者得hadoop,得hadoop者得大数据云计算的天下......播主有点神经了......以上分析仅仅是为了梳理一
下自己对mapreduce流程的理解(其实我还是比较凌乱的),并没有上代码,以后慢慢的分析源码并总结吧。
文献参考来源:http://www.slideshare.net/snakebbf/hadoop-mapreduce-12716482
(每次看这个都感触颇深啊)
MR优化博客:http://hongweiyi.com/2012/09/mapred-optimize-writable/
http://langyu.iteye.com/blog/1341267
shuffle分析博客:http://langyu.iteye.com/blog/992916
相关推荐
MapReduce(MapReduce 介绍、编程规范、运行模式、WordCount统计单词个数案例,MapReduce 分区,MapReduce 中的计数器)详解
云计算技术之————MapReduce 详细介绍MapReduce
大数据技术之Hadoop(MapReduce)
大数据技术之Hadoop(MapReduce),详细讲解hadoop中MapReduce
尚硅谷大数据技术之Hadoop(MapReduce)(作者:尚硅谷大数据研发部)版本:V2.0第1章 MapReduce概述1.1 MapReduce定义1.2
MapReduce学习,
大数据技术之Hadoop(MapReduce&Yarn).docx详细文档
大数据小型项目源码之mapreduce英语单词频次统计,附带所需全部jar包,欢迎下载学习。
7W+条数据,大数据实验源数据——商用车销量数据案例.xlsx,可用做大数据实验,数据挖掘、数据分析等
大数据技术基础实验报告-MapReduce编程
4_0大数据技术之Hadoop(MapReduce) (1)
林子雨大数据原理与技术第三版实验5实验报告 大数据技术与原理实验报告 MapReduce 初级编程实践 姓名: 实验环境: 操作系统:Linux(建议Ubuntu16.04); Hadoop版本:3.2.2; 实验内容与完成情况: (一)...
大数据Hadoop核心模块之MapReduce,文档有概念、案例、代码,Mapreduce中,不可多得文档!
大数据技术基础培训-MapReduce技术培训.pptx
大数据与云计算教程课件 优质大数据课程 05.Hadoop入门数据分析实战(共57页).pptx 大数据与云计算教程课件 优质大数据课程 06.HDFS(共38页).pptx 大数据与云计算教程课件 优质大数据课程 07.HDFS Shell命令(共...
1、资源内容:大数据综合实验,基于mapreduce的成绩分析系统,引入hadoop作云存储+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过...
MapReduce
四川大学IT企业实训,拓思爱诺大数据第五天MapReduce编程
MapReduce起源,在介绍大数据编年史时有提到Google最早在04年发表论文MapReduce,之后Doug Cutting基于这篇论文通过Java做了开源实现,Mapredce如今是作为Hadoop的核心组件之一,而HDFS是Hadoop的另外一个核心,此外...
本代码主要利用Python工具实现大数据与MapReduce,简单明了,易于理解