`
shuofenglxy
  • 浏览: 196894 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MapReduce初探与思考

阅读更多

     MapReduce是hadoop的分布式计算框架,主要包括map与reduce两大阶段:

     Map阶段主要负责把数据输入转换成中间键值对结果,它要求输入为键值对方式,具体实现map方法就可以,产生的输出是以可序列化的键值对结果,对键要求可比较即可。而在读入输入数据之前,要求数据已经被逻辑分片。

reduce阶段主要负责把中间结果进一步处理产生最后的输出结果。

      考虑到海量数据键的重复性和从中间结果到reduce输入的映射关系,在map结果后以一个combine方式进行重复键的合并,也可以说是通过shuffle和sort来减少发送到reduce阶段的有效数据量。这样就能起到第一步的优化。conbine其实也是一种reduce。

     combine之后,虽然数据量有所减少,但数量还是很大的,于是就采用compress的方式把数据压缩,到达reduce端后再去解压缩就OK了。

        基本上单个mapreduce任务的通用优化方式就这些。针对多任务的mapreduce,比如 map  map  reduce方式,则以第一个map的中间结果来作为第二个map的输入的方式,减少一个reduce阶段从而缩短整体耗时。


       虽然有了以上的优化方式,mapreduce效率有所提高,但仍然很慢,仍然是只能处理离线的任务。 

        mapreduce online提供了一个优化的方案,以稍微复杂的框架改造来提高效率,通过准实时的用户响应来改进用户体验。 mapreduce online是基于pipeline的改造方式。首先,将map阶段产生的结果不先写入磁盘文件,而是直接发送给reduce机器,这就要求map机器和reduce机器维持一个socket连接.如果没有建立连接,则写入磁盘,结果可以是到达一定阀值之后进行combine类似操作去重减少数据集大小,然后发送给reduce端。 由reduce端去优化处理。

 

          以上是延数据流向上的优化思考。

         针对不同的角色,master (jobtracker),slave (tasktracker),由于tasktracker通过heartbeat消息向jobtrakcer请求map 或者reduce任务,而一个tasktracker通常有多个maptask或是reducetask 。尽量从hdfs文件系统中高效取得带输入文件(最好本机数据,次之同机架数据等),复用子vm(即多个map任务之间可能公用某些元数据,如果将这些数据存入vm中,则也能改进效率)都能改进效率。

         多个job任务之间如果能优化合并则能提高整体jobs的执行效率。

 

          总而言之,hadoop作为离线数据处理的一个架构,注重吞吐量,但效率改进上还可以大大提高。总的思路就是减少数据传输量,提高并发率,提高复用比率等通用方式。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics