InputFormat

我的理解是:它就是一个读取接口,负责从文件、数据库等地方将数据读取到map中。

默认的实现是FileInputFormat.其他的还有:

  • TextInputFormat
  • KeyValueInputFormat
  • DBInputFormat

    OutputFormat

outputformat负责消费reducer的输出。默认的实现是FileOutputFormat。
**
如何自定义outputformat?比如我想将结果输出到mysql?
详情参见:

Combiner

Combiner是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数。即为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载

使用注意:

对于Combiner有几点需要说明的是:

1)有很多人认为这个combiner和map输出的数据合并是一个过程,其实不然,map输出的数据合并只会产生在有数据spill出的时候,即进行merge操作。

2)与mapper与reducer不同的是,combiner没有默认的实现,需要显式的设置在conf中才有作用。

3)并不是所有的job都适用combiner,只有操作满足结合律的才可设置combiner。combine操作类似于:opt(opt(1, 2, 3), opt(4, 5, 6))。如果opt为求和、求最大值的话,可以使用,但是如果是求中值的话,不适用。

4)一般来说,combiner和reducer它们俩进行同样的操作。

Combiner实例会在每一个运行map任务的节点上运行。Combiner会接收特定节点上的Mapper实例的输出作为输
入,接着Combiner的输出会被发送到Reducer那里,而不是发送Mapper的输出。Combiner是一个“迷你reduce”过程!

代码层如何指定: job.setCombinerClass(ReduceWordCountTask.class);

Partition

partition会将map的结果送到指定的reducer上。默认的实现是HashPartition。

得到map给的记录后,他们该分配给哪些reducer来处理呢?hadoop采用的默认的派发方式是根据散列值来派发的,但是实际中,这并不能很高效或者按照我们要求的去执行任务。例如,经过partition处理后,一个节点的reducer分配到了20条记录,另一个却分配道了10W万条,试想,这种情况效率如何。又或者,我们想要处理后得到的文件按照一定的规律进行输出,假设有两个reducer,我们想要最终结果中part-00000中存储的是”h”开头的记录的结果,part-00001中存储其他开头的结果,这些默认的partitioner是做不到的。所以需要我们自己定制partition来根据自己的要求,选择记录的reducer。自定义partitioner很简单,只要自定义一个类,并且继承Partitioner类,重写其getPartition方法就好了,在使用的时候通过调用Job的setPartitionerClass指定一下即可。