mapreduce基础知识

来源:互联网 发布:知乎经典问答搞笑 编辑:程序博客网 时间:2024/06/03 18:28

一、Mapreduce作业的处理流程

这里写图片描述

input:输入如图所示的数据。
splitting:将每行数据进行拆分。
mapping:进行映射,算出每行单词的数目,“Deer,1”中的1为一个Deer。
Shuffling:将所有的单词进行洗牌,相同的单词放入同一块中。
Reducing:归总所有单词,算出相同单词的数量。
Final Result:得到最终结果。

2.mapreduce运行步骤

首先是客户端要编写好mapreduce程序,配置好mapreduce的作业也就是job,
接下来就是提交job了,提交job是提交到JobTracker上的,这个时候JobTracker就会构建这个job,具体就是分配一个新的job任务的ID值

接下来它会做检查操作,这个检查就是确定输出目录是否存在,如果存在那么job就不能正常运行下去,JobTracker会抛出错误给客户端,接下来还要检查输入目录是否存在,如果不存在同样抛出错误,如果存在JobTracker会根据输入计算输入分片(Input Split),如果分片计算不出来也会抛出错误,至于输入分片我后面会做讲解的,这些都做好了JobTracker就会配置Job需要的资源了。

分配好资源后,JobTracker就会初始化作业,初始化主要做的是将Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,作业调度器会初始化这个job,初始化就是创建一个正在运行的job对象(封装任务和记录信息),以便JobTracker跟踪job的状态和进程。

初始化完毕后,作业调度器会获取输入分片信息(input split),每个分片创建一个map任务。

接下来就是任务分配了,这个时候tasktracker会运行一个简单的循环机制定期发送心跳给jobtracker,心跳间隔是5秒,程序员可以配置这个时间,心跳就是jobtracker和tasktracker沟通的桥梁,通过心跳,jobtracker可以监控tasktracker是否存活,也可以获取tasktracker处理的状态和问题,同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。

任务分配好后就是执行任务了。在任务执行时候jobtracker可以通过心跳机制监控tasktracker的状态和进度,同时也能计算出整个job的状态和进度,而tasktracker也可以本地监控自己的状态和进度。当jobtracker获得了最后一个完成指定任务的tasktracker操作成功的通知时候,jobtracker会把整个job状态置为成功,然后当客户端查询job运行状态时候(注意:这个是异步操作),客户端会查到job完成的通知的。如果job中途失败,mapreduce也会有相应机制处理,一般而言如果不是程序员程序本身有bug,mapreduce错误处理机制都能保证提交的job能正常完成。

3.map方法(参数)

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {…}

这里有三个参数,
前面两个Object key, Text value就是输入的key和value,
第三个参数Context context这是可以记录输入的key和value

4.reduce方法(参数)

public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {…}

reduce函数的输入也是一个key/value的形式,
不过它的value是一个迭代器的形式Iterable values,
也就是说reduce的输入是一个key对应一组的值的value,reduce也有context和map的context作用一致。

5.FileInputFormat

详见:http://www.cnblogs.com/yurunmiao/p/4514017.html

6.FileOutputFormat

详见:http://www.infoq.com/cn/articles/HadoopOutputFormat

原创粉丝点击