一.MapReduce mapReduce Patition Combiner1. Partition分区1.默认状况在默认状况下,不论map阶段有多少个并发执行task,到reduce阶段,所有的后果都将有一个reduce来解决,并且最终后果输入到一个文件中。默认状况下MapReduce 执行流程:
2. 批改ReduceTask个数在MapReduce程序的驱动类中,通过job提供的办法,能够批改reducetask的个数。
应用api批改reducetask个数之后,输入后果文件的个数和reducetask个数对应。也就是说有几个ReduceTask,最终输入文件就是几个,比方设置为6个,此时的输入后果如下所示:
此时,MapReduce的执行流程如下所示:
3. Partition数据分区概念默认状况下,MapReduce是只有一个reducetask来进行数据的解决。这就使得不论输出的数据量多大,最终的后果都是输入到一个文件中。当扭转reducetask个数的时候,作为maptask就会波及到数据分区的问题:MapTask输入的后果如何调配给各个ReduceTask来解决。
4. partition默认规定MapReduce默认分区规定是HashPartitioner。跟map输入的数据key无关。
5. partition注意事项reducetask个数的扭转导致了数据分区的产生,而不是有数据分区导致了reducetask个数扭转。数据分区的外围是分区规定。即如何调配数据给各个reducetask。默认的规定能够保障只有map阶段输入的key一样,数据就肯定能够分区到同一个reducetask,然而不能保证数据均匀分区。reducetask个数的扭转还会导致输入后果文件不再是一个整体,而是输入到多个文件中。2. Combiner 规约1.数据规约的含意数据归约是指在尽可能保持数据原貌的前提下,最大限度地精简数据量。
2. MapReduce 弊病MapReduce是一种具备两个执行阶段的分布式计算程序,Map阶段和Reduce阶段之间会波及到跨网络数据传递。每一个MapTask都可能会产生大量的本地输入,这就导致跨网络传输数据质变大,网络IO性能低。比方WordCount单词统计案例,如果文件中有1000个单词,其中999个为hello,这将产生999个<hello,1>的键值对在网络中传递,性能及其低下。3. Combiner 组件概念Combiner中文叫做数据规约,是MapReduce的一种优化伎俩。Combiner的作用就是对map端的输入先做一次部分合并,以缩小在map和reduce节点之间的数据传输量。4. Combiner 组件应用Combiner是MapReduce程序中除了Mapper和Reducer之外的一种组件,默认状况下不启用。Combiner实质就是Reducer,combiner和reducer的区别在于运行的地位:combiner是在每一个maptask所在的节点本地运行,是部分聚合;reducer是对所有maptask的输入后果计算,是全局聚合。具体实现步骤:自定义一个CustomCombiner类,继承Reducer,重写reduce办法job.setCombinerClass(CustomCombiner.class)5. Combiner 应用注意事项Combiner可能利用的前提是不能影响最终的业务逻辑,而且,Combiner的输入kv应该跟reducer的输出kv类型要对应起来。下述场景禁止应用Combiner,因为这样不仅优化了网络传输数据量,还扭转了最终的执行后果业务和数据个数相干的。业务和整体排序相干的。Combiner组件不是禁用,而是慎用。用的好进步程序性能,用不好,改变程序后果且不易发现。二. MapReduce 编程指南1. MapReduce 编程技巧概述MapReduce执行流程了然于心,可能晓得数据在MapReduce中流转过程。业务需要解读精确,即须要明确做什么。牢牢把握住key的抉择,因为MapReduce很多行为跟key相干,比方:排序、分区、分组。学会自定义组件批改默认行为,当默认的行为不满足业务需要,能够尝试自定义规定。通过画图梳理业务执行流程,确定每个阶段的数据类型。2. MapReduce执行流程梳理
1. Map阶段执行过程第一阶段是把输出目录下文件依照肯定的规范一一进行逻辑切片,造成切片布局。默认状况下,Split size = Block size。每一个切片由一个MapTask解决。(getSplits)第二阶段是对切片中的数据依照肯定的规定解析成<key,value>对。默认规定是把每一行文本内容解析成键值对。key是每一行的起始地位(单位是字节),value是本行的文本内容。(TextInputFormat)第三阶段是调用Mapper类中的map办法。上阶段中每解析进去的一个<k,v>,调用一次map办法。每次调用map办法会输入零个或多个键值对。第四阶段是依照肯定的规定对第三阶段输入的键值对进行分区。默认是只有一个区。分区的数量就是Reducer工作运行的数量。默认只有一个Reducer工作。第五阶段是对每个分区中的键值对进行排序。首先,依照键进行排序,对于键雷同的键值对,依照值进行排序。比方三个键值对<2,2>、<1,3>、<2,1>,键和值别离是整数。那么排序后的后果是<1,3>、<2,1>、<2,2>。如果有第六阶段,那么进入第六阶段;如果没有,间接输入到文件中。第六阶段是对数据进行部分聚合解决,也就是combiner解决。键相等的键值对会调用一次reduce办法。通过这一阶段,数据量会缩小。本阶段默认是没有的。2. Map阶段执行过程第一阶段是Reducer工作会被动从Mapper工作复制其输入的键值对。Mapper工作可能会有很多,因而Reducer会复制多个Mapper的输入。第二阶段是把复制到Reducer本地数据,全副进行合并,即把扩散的数据合并成一个大的数据。再对合并后的数据排序。第三阶段是对排序后的键值对调用reduce办法。键相等的键值对调用一次reduce办法,每次调用会产生零个或者多个键值对。最初把这些输入的键值对写入到HDFS文件中。1. key 的重要性体现在MapReduce编程中,外围是牢牢把握住每个阶段的输入输出key是什么。因为mr中很多默认行为都跟key相干。
排序:key的字典序a-z 正序分区:key.hashcode % reducetask 个数分组:key雷同的分为一组最重要的是,如果感觉默认的行为不满足业务需要,MapReduce还反对自定义排序、分区、分组的规定,这将使得编程更加灵便和不便。三.美国新冠疫情Covid-19 病例统计现有美国2021-1-28号,各个县county的新冠疫情累计案例信息,包含确诊病例和死亡病例,数据格式如下所示:
2021-01-28,Juneau City and Borough,Alaska,02110,1108,32021-01-28,Kenai Peninsula Borough,Alaska,02122,3866,182021-01-28,Ketchikan Gateway Borough,Alaska,02130,272,12021-01-28,Kodiak Island Borough,Alaska,02150,1021,52021-01-28,Kusilvak Census Area,Alaska,02158,1099,32021-01-28,Lake and Peninsula Borough,Alaska,02164,5,02021-01-28,Matanuska-Susitna Borough,Alaska,02170,7406,272021-01-28,Nome Census Area,Alaska,02180,307,02021-01-28,North Slope Borough,Alaska,02185,973,32021-01-28,Northwest Arctic Borough,Alaska,02188,567,12021-01-28,Petersburg Borough,Alaska,02195,43,0字段含意如下:date(日期),county(县),state(州),fips(县编码code),cases(累计确诊病例),deaths(累计死亡病例)。
...