MapReduce 详解一

来源:互联网 发布:nlp分词算法 编辑:程序博客网 时间:2024/06/05 17:44

导言:很多时候数据太大需要并发时候我们要写map reduce 来实现,但mr计算的传入key和value有点疑惑;这里有点让人疑惑为什么要这么写;这是因为与传统的函数不同,一个函数有明确的数据源明确的输入输出。但在mr中除了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 LongWriteable(1L));}}

2.调用函数

Configuration conf = new Configuration();final Job job = new Job(conf, mapreduce.class.getSimpleName());job.setMapperClass(MyMapper.class);

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

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

我们知道了上面,而且有很多的解说,但是这里面很多人还是很迷惑。为什么那?下面整体来讲讲:
加入一个文件的内容:

         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做了什么工作:数数,数这里面装个几个数据。那么数数怎么实现,就是通过下面进行数数的。

  for (IntWritable val : values) {            sum += val.get();            System.out.println("val.get():" + val.get());        }

0 0