首页 > 分布式 > Hadoop > Hadoop MapReduce编程模型
2015
06-26

Hadoop MapReduce编程模型

4、InputFormat、OutputFormat

  • InputFormat:MR框架读取输入时所用组件。默认的实现类为TextInputFormat,每次读取一行,并将<行起始偏移量,行内容>作为一组key-value传给map()函数。
  • OutputFormat:MR框架输出结果时所用组件。默认的实现类为TextOutputFormat,将结果输出到HDFS上。

前面的例子中,MR程序的输入都是文本文件,当然也可以自己实现InputFormat,从MySQL、Oracle甚至Socket端口读取输入数据;同样的,也可以实现OutputFormat将结果输出到数据库等。。

四、一些概念

1、文件切片:Split

1)reduce任务数可以通过job.setNumReduceTask()设置,那map任务数由什么决定?

问题场景:在运行TrafficStatistics_Sort程序时,采用TrafficStatistics程序的输出文件作为输入,运行时只启动一个map任务(可以通过clone session,并在新的窗口执行jps命令观察);如果采用TrafficStatistics_Partition程序的输出文件(共6个)作为输入,此时启动了6个map任务。那map任务数是由输入文件的数量决定的么?

Answer:说法错误Map任务数是由文件切片(Split)决定的。切片是MapReduce框架在做任务规划时所使用的一个概念,同文件分块(Block)一样,也是对文件的一种切分。区别在于Block是HDFS在存储文件时对文件进行分块并存储,是物理的概念;而Split是MapReduce在任务规划时对输入文件进行分片,一个分片就对应一个map任务进行处理,它是一个逻辑的概念

2)Split大小和Block大小之间的关系?

Answer默认情况下,一个Split对应一个Block。TrafficStatistics_Partition程序的输出6个文件,这6个文件用6个block存储,对应着6个split,因此会启动6个map任务。下面是一些设置Split大小的经验:

  • 如果Block大小适中,保持默认即可。
  • 如果Block特别大,为了提高Map的并发数,可以将Split的设置的比Block小。
  • 如果要处理的文件都是一些小文件,那么这些小文件所产生的Block也很小,为了提高效率,可以让一个Map任务多处理一些Block,这是就应该把Split设置得更大一些(小文件优化)。之所以设计出Split这个概念,一个重要的场景就是优化小文件。

Hadoop MapReduce编程模型》有 1 条评论

  1. 小恒 说:

    MAKING-H无人售货机加盟http://www.makingh.com

留下一个回复

你的email不会被公开。