分享

新手指导:mapreduce的key与value输入输出参数为什么会让你迷惑

pig2 发表于 2014-5-1 02:53:22 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 12 46651
本帖最后由 pig2 于 2014-8-3 22:33 编辑
问题导读:
1.我们所定义的map函数与reduce函数是用来干什么的?
2.key和value分别代表什么意思?




很多在写mapreduce,但是有的写的不太明白,并不太了解我们为什么这么写,为什么会让我们感到迷惑。这是因为它与我们传统编程有所不同,我们一个函数,有明确的数据源,明确的传入传出值,但是这里mapreduce中,我们却只看到了key,value,并却还有参数context,有点莫名其妙,并且这个函数我们只是定义了,却并没有调用。
比如
一、传统开发:
1.定义函数
public static class A
{
   public string fun(String str)
  {
    System.out.println(str);
  }
}
2.调用函数
A a=new A();
a.fun('a');


二、分布式开发:
1.自定义函数
protected void map(LongWritable key, Text value, Context context)
{
     final String[] splited = value.toString().split("\t");
     for (String word : splited) {
context.write(new Text(word), new LongWritable(1L));

}
2.函数调用
Configuration conf = new Configuration();
final Job job = new Job(conf, mapreduce.class.getSimpleName());

job.setMapperClass(MyMapper.class);
严格意义来讲这里只是一个注册。同时真是因为这里并未和map函数挂钩。结构不如传统开发清晰,容易理解,所以让传统开发人员很迷惑,初学者更是摸不着头脑。所以造成我们不知道key和value这两个参数到底是什么意思。
这里我们需要知道的,其实输入参数就是我们要分析的文件,同时由于这个参数过大,因此我们需要对它进行分割,然后由map调用。

--------------------------------------------------------------------------------------------------
上面我们理解,下面我们详细讲解一下:

首先说map函数中的key和value

Key:
都说是偏移量,这里换另外一种说法,我们是否知道字符串的长度,使得也就是说我们首先计算一个字符串的长度,然后按照字符串来进行不断的分割。

value:
value这个值,是我们真正使用的,我们也就是对其进行分割。

我们知道了上面,而且有很多的解说,但是这里面很多人还是很迷惑。为什么那?下面整体来讲讲:
加入一个文件的内容:(这里以WordCount为例)
1,2,3,4
a,b,c,d
1,a,2,b

上面是一个文件的内容。
那么我们来看了。
上面那一个是map中的输入值,会有几个map。正常情况下:会有三个map值。
这里又会产生问题了,那么这三行数据,是谁划分的,是由谁来做的,由FileInputFormat来帮我们做的工作

好了,继续:
那么value是什麽?
1,2,3,4这就是所传递的value值。
我们所作的工作是什麽?
进一步的划分数据,也就是进一步的分割这个字符串。
分割之后,我们传递给reduce。

我们所书写的reduce完成了什么工作。
其实我们完成一个输出的工作:
有多少个分区就有多少个reduce。也就是说,我们所做的只不过是一个计数的工作。

怎么计数的那?对谁计数?
比如
分区1:两个1
分区2:两个2
分区3:一个b
........
这里的分区可以理解一个容器:容器里装着什么,被分组的数据。我们所定义的reduce做了什么工作:数数,数这里面装个几个数据。

那么数数怎么实现,就是通过下面进行数数的。
  1.   for (IntWritable val : values) {
  2.             sum += val.get();
  3.             System.out.println("val.get():" + val.get());
  4.         }
复制代码






已有(12)人评论

跳转到指定楼层
MR_GWP 发表于 2014-8-1 20:17:53
点赞赞赞赞赞
回复

使用道具 举报

hadoop迷 发表于 2014-8-3 21:05:07
回复

使用道具 举报

kanaka10 发表于 2014-9-29 16:27:09
回复

使用道具 举报

maizhu 发表于 2014-10-3 14:18:18
我更想了解的是楼主的这些知识是从哪里学来的,官方的文档吗?还是通过对源代码的阅读?
回复

使用道具 举报

pig2 发表于 2014-10-3 14:42:35
maizhu 发表于 2014-10-3 14:18
我更想了解的是楼主的这些知识是从哪里学来的,官方的文档吗?还是通过对源代码的阅读?

更多的是一种悟性,上学老师讲课的内容,有课本知识,但是更多的则是个人的感悟与知识积累
回复

使用道具 举报

tang 发表于 2015-3-7 19:19:45
pig2 发表于 2014-10-3 14:42
更多的是一种悟性,上学老师讲课的内容,有课本知识,但是更多的则是个人的感悟与知识积累

上课可以学到这些么???
回复

使用道具 举报

一晌贪欢 发表于 2015-7-20 15:37:11
本人小白,赞赞赞
回复

使用道具 举报

xorxos 发表于 2015-10-28 19:56:52
就是策略模式吧?
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条