java程序员的大数据之路(9):MapReduce的类型
来源:互联网 发布:mac子弹头口红 编辑:程序博客网 时间:2024/06/06 20:08
概述
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程序员的大数据之路(9):MapReduce的类型
- java程序员的大数据之路(8):MapReduce的工作机制
- java程序员的大数据之路(10):MapReduce的排序
- java程序员的大数据之路(11):MapReduce的连接
- java程序员的大数据之路(6):定制的Writable类型
- java程序员的大数据之路(7):基于文件的数据结构
- java程序员的大数据之路(12):Hadoop的守护进程
- java程序员的大数据之路(1):Hadoop安装
- java程序员的大数据之路(2):创建第一个Hadoop程序
- java程序员的大数据之路(3):用maven构建Hadoop项目
- java程序员的大数据之路(4):编程调用HDFS
- java程序员的大数据之路(5):HDFS压缩与解压缩
- java程序员的大数据之路(13):Pig入门
- java程序员的大数据之路(14):Pig Latin
- java程序员的大数据之路(15):Pig Latin用户自定义函数
- 大数据学习笔记之四 MapReduce的核心思想
- java程序员的AI之路-大数据篇 hadoop安装
- 大数据学习记录(day4)-Hadoop之MapReduce的执行方式
- 欢迎使用CSDN-markdown编辑器
- 20171024memo
- juqery 总结大全 基础-菜鸟
- maven替换中央仓库- 阿里云
- 使用PullToRefreshScrollView实现无线轮播和ListView同时刷新加载
- java程序员的大数据之路(9):MapReduce的类型
- Tomcat项目配置文件
- java对redis进行操作
- 源代码管理 未能找到解决方案的映射
- 使用HttpClient的PoolingHttpClientConnectionManager实现Http请求连接池
- Solr之搜索语法。
- 什么是Mbps、Kbps、bps、kb、mb及其换算和区别
- learning R with swirl-logic
- websocket的简单介绍,通俗易懂