java程序员的大数据之路(9):MapReduce的类型
2017-10-24 13:36
351 查看
概述
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。相关文章推荐
- java程序员的大数据之路(10):MapReduce的排序
- java程序员的python之路(数据类型)
- java程序员的大数据之路(8):MapReduce的工作机制
- java程序员的大数据之路(11):MapReduce的连接
- 黑马程序员----------java基础数据类型
- Java新手之路——Day03 Java语言基础组成_数据类型
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
- 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符
- 菜鸟的学习之路(1) —java 原生数据类型与引用类型
- java程序员的大数据之路(5):HDFS压缩与解压缩
- java程序员的大数据之路(7):基于文件的数据结构
- C++程序员学Java系列之七:Scanner类 和 引用数据类型
- Java基础知识学习之路-04-第三章-数据类型和运算符
- C++程序员学Java系列之五:常量,变量,基本数据类型及转换
- java程序员的大数据之路(4):编程调用HDFS
- Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解
- 【Java Script 入门之路之数据类型和值】
- java自学之路之数据类型
- java程序员的大数据之路(6):定制的Writable类型
- java自学之路-----StringBuffer 基本数据类型(装箱) 集合(迭代器)