演讲人:时间:2018.1MapReduce原理与实践提纲2MapReduce原理1MapReduce简介3MapReduce实例•“摩尔定律”,CPU性能大约每隔18个月翻一番•从2005年开始摩尔定律逐渐失效,需要处理的数据量快速增加,人们开始借助于分布式并行编程来提高程序性能•分布式程序运行在大规模计算机集群上,可以并行执行大规模数据处理任务,从而获得海量的计算能力•谷歌公司最先提出了分布式并行编程模型MapReduce,HadoopMapReduce是它的开源实现,后者比前者使用门槛低很多MapReduce简介GoogleMapReduce架构设计师JeffreyDeanMapReduce简介在MapReduce出现之前,已经有像MPI这样非常成熟的并行计算框架了,那么为什么Google还需要MapReduce?MapReduce相较于传统的并行计算框架有什么优势?传统并行计算框架MapReduce集群架构/容错性共享式(共享内存/共享存储),容错性差非共享式,容错性好硬件/价格/扩展性刀片服务器、高速网、SAN,价格贵,扩展性差普通PC机,便宜,扩展性好编程/学习难度what-how,难what,简单适用场景实时、细粒度计算、计算密集型批处理、非实时、数据密集型•MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce•编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算•MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理•MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为,移动数据需要大量的网络传输开销•MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker•Hadoop框架是用Java实现的,但是,MapReduce应用程序则不一定要用Java来写MapReduce简介MapReduce简介Map和Reduce函数函数输入输出说明Mapk1,v1如:行号,”abc”List(k2,v2)如:“a”,1“b”,1“c”,11.将小数据集进一步解析成一批key,value对,输入Map函数中进行处理2.每一个输入的k1,v1会输出一批k2,v2。k2,v2是计算的中间结果Reducek2,List(v2)如:“a”,1,1,1k3,v3“a”,3输入的中间结果k2,List(v2)中的List(v2)表示是一批属于同一个k2的valueMapReduce设计上具有以下主要的技术特征:向“外”横向扩展,而非向“上”纵向扩展。失效被认为是常态。把处理向数据迁移。顺序处理数据、避免随机访问数据。为应用开发者隐藏系统层细节。平滑无缝的可扩展性。MapReduce简介提纲1MapReduce简介2MapReduce原理3MapReduce实例Mapreduce的工作流程MapReduce原理:•不同的Map任务之间不会进行通信•不同的Reduce任务之间也不会发生任何信息交换•用户不能显式地从一台机器向另一台机器发送消息•所有的数据交换都是通过MapReduce框架自身去实现的MapReduce:MapperMapReduce:执行阶段•Map任务的数量•Hadoop为每个split创建一个Map任务,split的多少决定了Map任务的数目。大多数情况下,理想的分片大小是一个HDFS块Reduce任务的数量•Reduce任务数量默认情况下是一个,由开发者来设定需要运行的reduce任务个数,通常情况下一个reduceTask对应着一个分区的数据,如果我们的分区数和reduceTask任务数不对应,比如分区3个、reduceTask5个,这个情况下会报错MapReduce:shuffle输入缓存溢写(分区、排序、合并)数据被Reduce任务取走磁盘文件归并多个分区归并归并输出Reduce任务Map任务其他Map任务其他Reduce任务MapReduceShuffle过程MapReduce:shuffleMap任务缓存12输入数据和执行Map任务写入缓存3溢写(分区、排序、合并)4文件归并•每个Map任务分配一个缓存•MapReduce默认100MB缓存•设置溢写比例0.8•分区默认采用哈希函数•排序是默认的操作•排序后可以合并(Combine)•合并不能改变最终结果•在Map任务全部结束之前进行归并•归并得到一个大的文件,放在本地磁盘合并(Combine)和归并(Merge)的区别:两个键值对“a”,1和“a”,1,如果合并,会得到“a”,2,如果归并,会得到“a”,1,1MapReduce:Reducer缓存Map任务Reduce任务磁盘磁盘文件归并其他Map任务“领取”数据归并数据把数据输入给Reduce任务123其他Reduce任务分区分区其他Reduce任务•Map所有任务完成后,会启动reduceTask,Reduce任务通过RPC向map拉取数据•Reduce领取数据先放入缓存,来自不同Map机器,对文件进行合并和排序,写入磁盘•当数据很少时,不需要溢写到磁盘,直接在缓存中和并,然后输出给Reduce•流程–INPUT阶段:根据输入文件和MAP数目系统产生相应的文件块–MAP阶段:每个MAP根据用户定义把输入的KEY-VALUE对转化成新的KEY-VALUE对–SHUFFLE阶段:系统对MAP输出的内容进行排序或分区–REDUCE阶段:把所有相同KEY的记录合并成一个KEY-VALUE对–OUTPUT阶段:把输出结果写到HDFS•应用程序指定–MAP模块–REDUCE模块–输入文件•各个阶段都是分布式运算–框架完成集群的计划、调度功能–框架完成容错的功能MapReduce整体流程提纲1MapReduce简介3MapReduce实例2MapReduce原理•案例:统计文本中相同的单词重复出现次数–出现次数:分别统计出来的文本中出现了那些单词,并且这些单词在文本中出现的次数。MapReduce编程实战:案例WordCount执行过程Map过程示意图Map输入1.“HelloWorldByeWorld”2.“HelloHadoopByeHadoop”3.“ByeHadoopHelloHadoop”Map输出Hello,1World,1Bye,1World,1Hello,1Hadoop,1Bye,1Hadoop,1Bye,1Hadoop,1Hello,1Hadoop,1MapMapMapWordCount执行过程用户没有定义Combiner时的Reduce过程示意图Map输出的结果Hello,1World,1Bye,1World,1Hello,1Hadoop,1Bye,1Hadoop,1Bye,1Hadoop,1Hello,1Hadoop,1Map端Shuffle后的结果发送给Reduce任务Reduce任务的输出Bye,3Hadoop,4Hello,3World,2ShuffleHello,1World,1,1Bye,1Hello,1Hadoop,1,1Bye,1Bye,1Hadoop,1,1Hello,1ShuffleShuffleReduceMapReduce编程实战:案例分析原始数据1.统计文本中出现的单词2.计算每个单词出现的次数MapReduce编程实战:MapperMapReduce编程实战:Reducer内部逻辑MapReduce编程实战:Main方法MapReduce编程实战:Main方法MapReduce编程实战:结果数据格式