[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产生的。

时间: 2024-11-03 21:09:38

[Hadoop]MapReduce多路径输入与多个输入的相关文章

方法-hadoop MapReduce 路径输入

问题描述 hadoop MapReduce 路径输入 MapReduce程序中要处理的文件在一个文件夹及它的子文件夹中,用什么方法可以处理这种情况,让所有的文件都能被处理 解决方案 写个hdfs 方法,把所有内层文件夹遍历出来,把文件都add到 fileinput

hadoop MapReduce实例解析

1.MapReduce理论简介 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果.简单地说,MapReduce就是"任务的分解与结果的汇总". 在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker:另一个是TaskTracker,JobTracker是用于调度工作的,TaskTracke

Hadoop MapReduce处理海量小文件:自定义InputFormat和RecordReader

一般来说,基于Hadoop的MapReduce框架来处理数据,主要是面向海量大数据,对于这类数据,Hadoop能够使其真正发挥其能力.对于海量小文件,不是说不能使用Hadoop来处理,只不过直接进行处理效率不会高,而且海量的小文件对于HDFS的架构设计来说,会占用NameNode大量的内存来保存文件的元数据(Bookkeeping).另外,由于文件比较小,我们是指远远小于HDFS默认Block大小(64M),比如1k~2M,都很小了,在进行运算的时候,可能无法最大限度地充分Locality特性带

Hadoop MapReduce如何进行WordCount自主编译运行

上次我们已经搭建了Hadoop的伪分布式环境,并且运行了一下Hadoop自带的例子–WordCount程序,展现良好.但是大多数时候还是得自己写程序,编译,打包,然后运行的,所以做一次自编译打包运行的实验. 编辑程序 在Eclipse或者NetBeans中编辑WordCount.java程序,用IDE的好处就是我们可以更方便的选择各种依赖的jar包,并且它会帮我们编译好,我们只需要去workspace中拿出class文件打包就好了,或者直接打包就行.而不用在命令行输入很多依赖jar包去打包,这样

《Hadoop MapReduce性能优化》一2.1 研究Hadoop参数

2.1 研究Hadoop参数 Hadoop MapReduce性能优化 正如第1章中提到的那样,有很多因素会对Hadoop MapReduce性能产生影响.一般说来,与工作负载相关的Hadoop性能优化需要关注以下3个主要方面:系统硬件.系统软件,以及Hadoop基础设施组件的配置和调优/优化. 需要指出的是,Hadoop被归类为高扩展性解决方案,但却不足以归类为高性能集群解决方案.系统管理员可以通过各种配置选项来配置和调优Hadoop集群.性能配置参数主要关注CPU利用率.内存占用情况.磁盘I

《Hadoop MapReduce实战手册》一1.3 写WordCountMapReduce示例程序,打包并使用独立的Hadoop运行它

1.3 写WordCountMapReduce示例程序,打包并使用独立的Hadoop运行它 Hadoop MapReduce实战手册本节传授如何写一个简单的MapReduce程序,以及如何执行它,如图1-1所示. 要运行MapReduce作业,用户需要提供一个map函数.一个reduce函数.输入数据,以及输出数据的位置.在执行时,Hadoop实际执行如下步骤. Hadoop通过换行符将输入数据分解成多个数据项,并且在每一个数据项上运行一次map函数,将这个数据项作为对应map函数的输入.执行完

Hadoop Map-Reduce的压缩最终输出文件

Hadoop 可以在作业的Configuration对象中通过设定一系列参数来改变作业的行为,比如,我们需要进行一个map-reduce作业,并且吧最终作业reduce过程的结果输出为压缩的格式,我们可以在一般的map-reduce上进行一些定制. 实现 还是以以前做的删选最高气温的例子为参照: 以前的例子可以见这个博文:http://supercharles888.blog.51cto.com/609344/878422 我们现在要求让结果输出为压缩格式,所以保持Map类(MaxTempera

使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

引言 Hadoop MapReduce作业有着独一无二的代码架构,这种代码架构拥有特定的模板和结构.这样 的架构会给测试驱动开发和单元测试带来一些麻烦.这篇文章是运用MRUnit,Mockito和PowerMock的真实范例 .我会介绍 使用MRUnit来编写Hadoop MapReduce应用程序的JUnit测试 使用PowerMock和Mockito模拟静态方法 模拟其他类型中的业务逻辑(译注:也就是编写测试驱动模块) 查看模拟的业务逻辑是否被调用(译注:测试驱动模块是否运行正常) 计数器

《R与Hadoop大数据分析实战》一2.3 Hadoop MapReduce原理

2.3 Hadoop MapReduce原理 为了更好地理解MapReduce的工作原理,我们将会: 学习MapReduce对象. MapReduce中实现Map阶段的执行单元数目. MapReduce中实现Reduce阶段的执行单元数目. 理解MapReduce的数据流. 深入理解Hadoop MapReduce. 2.3.1 MapReduce对象 由Hadoop的MapReduce技术可以引申出如下3个主要对象: Mapper:它主要用于实现MapReduce的Map阶段的操作.该对象在M