java程序员的大数据之路(9):MapReduce的类型

概述

Hadoop的MapReduce中,map和reduce函数遵循如下常规格式:
map:(K1,V1) -> list(K2,V2)
reduce:(K2,list(V2)) -> list(K3,V3)
输入数据的类型由输入格式进行设置。例如,对应于TextInputFormat的键类型是LongWritable,值类型是Text。其他类型通过调用JobConf上的方法进行显示设置。如果没有显示设置,中间的类型默认为最终的输出类型。因此,如果K2与K3相同,就不需要调用setMapOutputKeyClass(),因为它将调用setOutputKeyClass(),如果V2与V3相同,只需要使用setOutputValueClass()。

默认的MapReduce作业

  • 默认的输入格式是TextInputFormat。
  • 默认的mapper是IdentityMapper,它将输入的键和值原封不动的写到输出中。
  • 默认的partitioner是HashPartitioner,它对每条记录的键进行哈希操作以决定该记录属于哪个分区。每个分区对应一个reducer任务,所以分区数等于作业的reducer的个数。
  • 默认只有一个reducer,它是IdentityReducer。reducer的最优个数与集群中可用的reducer任务槽数相关。总槽数由mapred.tasktracker.reduce.tasks.maximum属性的值决定。通常情况下,reducer数设置比总槽数稍微少一些。

输入格式

输入分片与记录

一个输入分片就是由单个map处理的输入块,每个map操作只处理一个输入分片。每个分片被划分为若干个记录,每条记录就是一个键值对。

FileInputFormat类

FileInputFormat类是所有使用文件作为数据源的InputFormat实现的基类。它提供两个功能:一个定义哪些文件包含在一个作业的输入中,一个为输入文件生成分片的实现。

FileInputFormat类的输入路径

FileInputFormat类提供四种静态方法来设定JobConf的输入路径:

public static void addInputPath(JobConf conf, Path path)
public static void addInputPaths(JobConf conf, String commaSeparatedPaths)
public static void setInputPaths(JobConf conf, Path... inputPaths)
public static void setInputPaths(JobConf conf, String commaSeparatedPaths)

FileInputFormat类的输入分片

FileInputFormat只分割超过HDFS块大小的文件。分片通常与HDFS块大小一致,但也可以通过设置属性改变,最小的分片大小通常是一字节。最大的分片大小默认是Java long类型表示的最大值。
分片的大小由以下公式计算:
max(minimumSize, min(maximumSize, blockSize))
默认情况下:
minimumSize < blockSize < maximumSize
所以默认大小就是blockSize。

小文件与CombineFileInputFormat

相对于大批量的小文件,Hadoop更适合处理少量的大文件。对应大量小文件的问题,使用CombineFileInputFormat会把多个文件打包到一个分片。

文本输入

TextInputFormat

TextInputFormat是默认的InputFormat。每条记录是一行输入,键是存储该行在整个文件中的字节偏移量。值是这行的内容。

KeyValueTextInputFormat

TextInputFormat的键通常不是特别有用,因此我们可以用KeyValueTextInputFormat。

NLineInputFormat

如果希望mapper收到固定行数的输入,需要使用NLineInputFormat作为InputFormat,通过设置mapred.line.input.format.linespermap属性,控制mapper收到行数。

数据库输入(和输出)

DBInputFormat这种输入格式用于使用JDBC从关系数据库中读取数据。最好用于加载小量的数据集,如果需要与来自HDFS的大数据集连接,要使用MultipleInputs。

你可能感兴趣的:(Hadoop)