[Hadoop]MapReduce多路径输入与多个输入

简介:

1. 多路径输入

FileInputFormat是所有使用文件作为其数据源的 InputFormat 实现的基类,它的主要作用是指出作业的输入文件位置。因为作业的输入被设定为一组路径, 这对指定作业输入提供了很强的灵活性。FileInputFormat 提供了四种静态方法来设定 Job 的输入路径:

 
 
  1. public static void addInputPath(Job job,Path path);
  2. public static void addInputPaths(Job job,String commaSeparatedPaths);
  3. public static void setInputPaths(Job job,Path... inputPaths);
  4. public static void setInputPaths(Job job,String commaSeparatedPaths);



1.1 addInputPath

使用FileInputFormat.addInputPath方法,只能指定一个路径。如果想使用该方法实现多路径输入,需要多次调用来加载不同的路径:

 
 
  1. FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-27/"));
  2. FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-28/"));
  3. FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-29/"));

1.2 addInputPaths

使用FileInputFormat.addInputPaths方法,可以指定多个路径。如果想使用该方法实现多路径输入,只需调用一次即可,多个路径字符串之间用逗号分隔开:

 
  
  1. FileInputFormat.addInputPaths(job, "result/search/train/pv_log/2016-04-27/,result/search/train/pv_log/2016-04-28/,result/search/train/pv_log/2016-04-29/");

1.3 setInputPaths

setInputPaths()方法一次设定完整的路径列表,替换前面调用中在 Job 上所设置的所有路径(覆盖):

 
  
  1. FileInputFormat.setInputPaths(job, "result/search/train/pv_log/2016-04-27/,result/search/train/pv_log/2016-04-28/,result/search/train/pv_log/2016-04-29/");

2. 多个输入

虽然一个MapReduce作业的输入可能包含多个输入文件,但所有的文件都由同一个InputFormat和同一个Mapper来处理,例如上面多路径输入。然而,数据格式往往会随着时间而改变,或者,有些数据源会提供相同的数据,但是格式不同,因此我们必须用不同的mapper来处理不同的数据。

这些问题可以用MultipleInputs类来解决,它允许为每条输入路径指定InputFormat 和 Mapper。MultipleInputs提供了两种用于多个输入的方法:

 
 
  1. public static void addInputPath(Job job, Path path,Class<? extends InputFormat> inputFormatClass);
  2. public static void addInputPath(Job job, Path path,Class<? extends InputFormat> inputFormatClass,Class<? extends Mapper> mapperClass);

下面两个方法的的区别在于针对不同输入路径文件,是否可以指定不同Mapper进行处理。

前者不需要指定Mapper,所以所有文件都通过一个Mapper进行处理:

 
 
  1. MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class);  
  2. MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class);  

后者可以针对不同输入路径指定不同的Mapper,故可以指定不同Mapper处理不同类型的文件:

 
 
  1. MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class,  TrainOrderMap.class);  
  2. MultipleInputs.addInputPath(job, new Path("result/search/flight/log/day=20161129"), TextInputFormat.class,  FlightOrderMap.class);  

这段代码取代了FileInputFormat.addInputPath() 和 job.setMapperClass() 的常规调用。由于火车票和机票订单数据都是文本文件,所以对两者使用TextInputFormat的数据类型。但这两个数据源的行格式不同,所以我们使用两个不一样的Mapper。TrainOrderMapper 读取火车票订单的输入数据并计算订单信息,FlightOrderMapper 读取飞机票订单的输入数据并计算订单信息。重要的是两个Mapper 输出类型一样,因此,reducer看到聚合后的map输出,并不知道这些输入是由不同的Mapper产生的。




目录
相关文章
|
4月前
|
分布式计算 Hadoop
Hadoop系列 mapreduce 原理分析
Hadoop系列 mapreduce 原理分析
38 1
|
4月前
|
存储 分布式计算 负载均衡
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
59 0
|
3月前
|
存储 分布式计算 监控
Hadoop的JobTracker和TaskTracker在MapReduce中的作用是什么?
Hadoop的JobTracker和TaskTracker在MapReduce中的作用是什么?
49 0
|
4月前
|
存储 SQL 分布式计算
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
254 0
|
4月前
|
存储 分布式计算 资源调度
干翻Hadoop系列文章【03】:MapReduce概念详解
干翻Hadoop系列文章【03】:MapReduce概念详解
|
4月前
|
存储 分布式计算 搜索推荐
【大数据技术Hadoop+Spark】MapReduce之单词计数和倒排索引实战(附源码和数据集 超详细)
【大数据技术Hadoop+Spark】MapReduce之单词计数和倒排索引实战(附源码和数据集 超详细)
46 0
|
4月前
|
分布式计算 Hadoop 大数据
【云计算与大数据计算】Hadoop MapReduce实战之统计每个单词出现次数、单词平均长度、Grep(附源码 )
【云计算与大数据计算】Hadoop MapReduce实战之统计每个单词出现次数、单词平均长度、Grep(附源码 )
145 0
|
4月前
|
存储 分布式计算 Hadoop
【云计算与大数据技术】Hadoop MapReduce的讲解(图文解释,超详细必看)
【云计算与大数据技术】Hadoop MapReduce的讲解(图文解释,超详细必看)
80 0
|
4月前
|
存储 分布式计算 大数据
【云计算与大数据技术】大数据系统总体架构概述(Hadoop+MapReduce )
【云计算与大数据技术】大数据系统总体架构概述(Hadoop+MapReduce )
100 0
|
4月前
|
分布式计算 资源调度 Hadoop
centos7 伪分布式 hadoop 利用 python 执行 mapreduce
centos7 伪分布式 hadoop 利用 python 执行 mapreduce
27 0

相关实验场景

更多