高性能集合流式操作,MapReduce初体验
1、MapReduce简介
源自于google的MapReduce论文,发表于2004年12月,HadoopMapReduce是google MapReduce 克隆版。MapReduce是一种计算模型,用以进行大数据量的计算。其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。
回想自己最初学 Hadoop 的时候,初衷是写MapReduce程序,但是搭建单机环境折腾一周,搭建分布式环境折腾一周,跑个Demo解决一下Bug又一周过去了。最后都忘了自己是想学 MapReduce 的。
感觉自己虽然是搞Hadoop的,但是写MR比自己想的要少很多。初期是花了很多精力在安装以及集群的各种日常维护,熟悉Hive后就经常用Hive来解决问题,然后逐渐地各种任务过度到了Spark上,因此对MapReduce的重视就少了很多。 细想起来,MapReduce本身是很简洁易学的,因此这次抛开各种MapReduce背后的实现原理,来专门回顾一下它的编程模型。
MapReduce计算提供了简洁的编程接口,对于某个计算任务来说,其输入是Key/Value数据对,输出也以Key/Value数据对方式表示。
对于应用开发者来说,只需要根据业务逻辑实现Map和Reduce两个接口函数内的具体操作内容,即可完成大规模数据的并行批处理任务。
Map 函数以Key/Value数据对作为输入,将输入数据经过业务逻辑计算产生若干仍旧以Key/Value形式表达的中间数据。MapReduce计算框架会自动将中间结果中具有相同Key值的记录聚合在一起,并将数据传送给Reduce函数内定义好的处理逻辑作为其输入值。
Reduce 函数接收到Map阶段传过来的某个Key值及其对应的若干Value值等中间数据,函数逻辑对这个Key对应的Value内容进行处理,一般是对其进行累加、过滤、转换等操作,生成Key/Value形式的结果,这就是最终的业务计算结果。
MapReduce的输入输出
MapReduce框架运转在<key,value>键值对上。也就是说作业的输入输出都是<keey,value>键值对,中间的各种处理也都是对键值对进行处理。
MapReduce 的两大优势是:
1 ) 并行处理:
在MapReduce中,我们将作业划分为多个节点,每个节点同时处理作业的一部分。因此,MapReduce基于Divide and Conquer范例,它帮助我们使用不同的机器处理数据。由于数据由多台机器而不是单台机器并行处理,因此处理数据所需的时间会减少很多。
2 ) 数据位置:
我们将计算移动到MapReduce框架中的数据,而不是将数据移动到计算部分。数据分布在多个节点中,其中每个节点处理驻留在其上的数据部分。
这使得具有以下优势:
将处理单元移动到数据所在位置可以降低网络成本;
由于所有节点并行处理其部分数据,因此处理时间缩短;
每个节点都会获取要处理的数据的一部分,因此节点不会出现负担过重的可能性。
但是,MapReduce 也有其限制:
不能进行流式计算和实时计算,只能计算离线数据;
中间结果存储在磁盘上,加大了磁盘的 I/O 负载,且读取速度比较慢;
开发麻烦,例如wordcount功能就需要很多的设置和代码量,而Spark将会非常简单。
如何一起学习,有没有免费资料?
在程序员这条路上遇到瓶颈的朋友可以加入群:171985536大家一起来提升进步 但要备注好信息 ,分享知识
关注下面公众号,获取BATJ等一线互联网企业面试题目和答案还有java技术干货知识等你领取 Java这点事