一些mapreduce程序分析

原创 2016年08月29日 12:50:14

word count 

一些mapreduce程序分析

数据去重最终目标是让原始数据出现次数超过一次数据输出文件出现一次我们自然而然会想到将同一个数据的所有记录都交给一台reduce机器,无论这个数据出现多少次,只要在最终结果中输出一次就可以了。具体就是reduce的输入应该以数据作为key,而对value-list则没有要求。当reduce接收到一个时就直接将key复制到输出的key中,并将value设置成空值



一些mapreduce程序分析

数据排序跟上面的去重差不多,只不过上面的key 可能是按字母顺序排的,现在要先转换成数字再来,而且重复的数字也要表示出来,所以value不能用空了,要用1,然后累加。

//实现map函数

            String line=value.toString();

            data.set(Integer.parseInt(line));

            context.write(datanew IntWritable(1));

 

        }


//实现reduce函数

for(IntWritable val:values){

                context.write(linenum, key);

                linenum new IntWritable(linenum.get()+1);

            }



下面是平均值

一些mapreduce程序分析


单表关联和夺标关联
 分析这个实例,显然需要进行单表连接,连接的是左表parent列和右表child列,且左表右表同一个表

一些mapreduce程序分析

 多表关联和单表关联相似,都类似于数据库中的自然连接。相比单表关联,多表关联的左右表和连接列更加清楚。所以可以采用和单表关联的相同处理方式,map识别出输入的行属于哪个表之后,对其进行分割,将连接的列值保存在key中,另一列和左右表标识保存在value中,然后输出。reduce拿到连接结果之后,解析value内容,根据标志将左右表内容分开存放,然后求笛卡尔积,最后直接输出。


 

Hadoop MapReduce的实现也采用Master/Slave 结构。Master 叫做JobTracker,而Slave 叫做TaskTracker用户提交的计算叫做Job,每一个Job会被划分成若干个TasksJobTracker负责Job Tasks 的调度,而TaskTracker负责执行Tasks


当Map开始产生输出的时候,他并不是简单的把数据写到磁盘,因为频繁的操作会导致性能严重下降。他的处理更加复杂,数据首先是写到内存中的一个缓冲区,并作一些预排序,以提升效率。

 

每个Map任务都有一个用来写入输出数据的循环内存缓冲区,这个缓冲区默认大小是100M,可以通过io.sort.mb属性来设置具体的大小,当缓冲区中的数据量达到一个特定的阀值(io.sort.mb io.sort.spill.percent,其中io.sort.spill.percent 默认是0.80)时,系统将会启动一个后台线程把缓冲区中的内容spill 到磁盘。在spill过程中,Map的输出将会继续写入到缓冲区,但如果缓冲区已经满了,Map就会被阻塞直道spill完成。spill线程在把缓冲区的数据写到磁盘前,会对他进行一个二次排序。

首先根据数据所属的partition排序,然后每个partition中再按Key排序。输出包括一个索引文件和数据文件,如果设定了Combiner,将在排序输出的基础上进行。Combiner就是一个Mini Reducer,它在执行Map任务的节点本身运行,先对Map的输出作一次简单的Reduce,使得Map的输出更紧凑,更少的数据会被写入磁盘和传送到Reducer。Spill文件保存在由mapred.local.dir指定的目录中,Map任务结束后删除。

当spill 文件归并完毕后,Map 将删除所有的临时spill 文件,并告知TaskTracker 任务已完成。Reducers 通过HTTP 来获取对应的数据。用来传输partitions 数据的工作线程个数由tasktracker.http.threads 控制,这个设定是针对每一个TaskTracker 的,并不是单个Map,默认值为40,在运行大作业的大集群上可以增大以提升数据传输速率。

 

现在让我们转到Shuffle的Reduce部分。Map的输出文件放置在运行Map任务的TaskTracker的本地磁盘上(注意:Map输出总是写到本地磁盘,但是Reduce输出不是,一般是写到HDFS),它是运行Reduce任务的TaskTracker所需要的输入数据。Reduce任务的输入数据分布在集群内的多个Map任务的输出中,Map任务可能会在不同的时间内完成,只要有其中一个Map任务完成,Reduce任务就开始拷贝他的输出。这个阶段称为拷贝阶段,Reduce任务拥有多个拷贝线程,可以并行的获取Map输出。可以通过设定mapred.reduce.parallel.copies来改变线程数。

 

Reduce是怎么知道从哪些TaskTrackers中获取Map的输出呢?当Map任务完成之后,会通知他们的父TaskTracker,告知状态更新,然后TaskTracker再转告JobTracker,这些通知信息是通过心跳通信机制传输的,因此针对以一个特定的作业,jobtracker知道Map输出与tasktrackers的映射关系。Reducer中有一个线程会间歇的向JobTracker询问Map输出的地址,直到把所有的数据都取到。在Reducer取走了Map输出之后,TaskTracker不会立即删除这些数据,因为Reducer可能会失败,他们会在整个作业完成之后,JobTracker告知他们要删除的时候才去删除。


例子看下面链接。
http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html
这里主要分析上面这些例子的思路。

MapReduce流程简单解析

以最经典的WordCount单词计数为例来介绍Map/Reduce阶段具体的处理步骤。
  • yuzhuzhong
  • yuzhuzhong
  • 2016年05月22日 19:08
  • 867

Hadoop之MapReduce程序分析

摘要:Hadoop之MapReduce程序包括三个部分:Mapper,Reducer和作业执行。本文介绍和分析MapReduce程序三部分结构。...
  • wangloveall
  • wangloveall
  • 2014年06月05日 05:55
  • 5204

程序分析技术

程序分析方法。程序分析是程序设计的一个发展方向,是程序员提升能力的有效途径。...
  • ronghuilin
  • ronghuilin
  • 2016年10月29日 16:19
  • 896

对MapReduce过程的理解

对自己近一个月来学习map、reduce过程做些总结,以备后期查看。(基于hadoop1.x) 首先是官方的经典过程图: 这个过程中我们会依次接触六大类:InputFormat,Map,Combi...
  • yeruby
  • yeruby
  • 2014年03月18日 09:59
  • 6999

使用程序分析股票数据

这两天下载了从2000年1月1日到2017年2月20日的所有的2871支股票日交易数据。日交易数据,每支股有500多KB。下载下来一共有904.9MB大。使用获取数据的接口就上个文章中说的股票接口.h...
  • fengmm521
  • fengmm521
  • 2017年11月04日 22:00
  • 82

MapReduce基础开发context.write注意new text("")多出一列的问题

1、问题描述:在MapReduce中代码中,Map输出context.write(okey,new text("")),Reduce也是context.write(okey,new text(""))...
  • fjssharpsword
  • fjssharpsword
  • 2016年07月19日 10:31
  • 3744

Hadoop MapReduce程序分析飞机航班信息源代码

1: 数据来源: 基于美国民航航班1987年数据,开发MapReduce应用程序计算其中某一年各个航班的飞行数据。 数据式样 Year,Month,DayofMonth,DayO...
  • gzmfxy
  • gzmfxy
  • 2016年08月07日 18:17
  • 1644

OK6410(s3c6410)的bootloader设计蓝图

Bootloader设计蓝图 1. Bootloader的作用:开机最开始执行的软件,启动系统   2.Bootloader设计方法:模仿熟悉 再设计(U-Boot)   3. U-Boot...
  • u010853261
  • u010853261
  • 2014年08月29日 10:05
  • 381

流敏感,路径敏感和上下文敏感

流敏感(flow-sensitive),路径敏感(path-sensitive)和上下文敏感(context-sensitive),这几个概念都主要出现在Data Flow Analysis中...
  • alu_xd
  • alu_xd
  • 2016年07月31日 10:23
  • 722

程序分析的一些概念总结

写在前面的话写给我自己看的,有的地方有的人可能看不懂吧,学到的东西的快速记忆而已。基本概念总结1.代码克隆和代码剽窃的区别 a. 代码克隆(code clone)代码克隆主要指的是一个程序内(in...
  • Grace_0642
  • Grace_0642
  • 2017年04月20日 22:00
  • 374
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一些mapreduce程序分析
举报原因:
原因补充:

(最多只允许输入30个字)