Java 配置MapReduce作业时使用多个InputFormat类

Java 配置MapReduce作业时使用多个InputFormat类,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我想写一个MapReduce应用程序,它可以处理文本和zip文件。为此,我想使用不同的输入格式,一个用于文本,另一个用于zip。可以这样做吗?考虑编写一个自定义的InputFormat,您可以检查正在读取的输入类型,然后根据检查调用所需的InputFormat查看API文档中的多个输入(,)。这不是非常自解释的,但您应该能够看到在作业配置中调用addInputPath方法并配置输入路径(可以是全局、输入格式和关联的映射器) 你应该可以在谷歌上搜索一些例子,事实上这里有一个例子显示了一些用法,从@

我想写一个MapReduce应用程序,它可以处理文本和zip文件。为此,我想使用不同的输入格式,一个用于文本,另一个用于zip。可以这样做吗?

考虑编写一个自定义的
InputFormat
,您可以检查正在读取的输入类型,然后根据检查调用所需的
InputFormat
查看API文档中的多个输入(,)。这不是非常自解释的,但您应该能够看到在作业配置中调用addInputPath方法并配置输入路径(可以是全局、输入格式和关联的映射器)


你应该可以在谷歌上搜索一些例子,事实上这里有一个例子显示了一些用法,从@ChrisWhite的答案中扩展了一点,你需要的是使用一个自定义的
InputFormat
RecordReader
,可以处理ZIP文件。你可以在这里和这里找到

鉴于此,正如Chris建议的那样,您应该使用
多个输入
,如果您不需要为每种类型的文件使用自定义映射器,我会这样做:

MultipleInputs.addInputPath(job, new Path("/path/to/zip"), ZipFileInputFormat.class);
MultipleInputs.addInputPath(job, new Path("/path/to/txt"), TextInputFormat.class);

我相信hadoop可以无缝地读取作为输入提供的文本和gzip文件。你试过了吗?Hadoop可以无缝地处理文本和gzip,但不能处理zip文件(它们也不是可拆分的)。但是你要么需要找到一种知道如何处理zip文件的输入格式,要么自己编写一种+1个不错的实现链接。这些东西还不是Hadoop的一部分,这总是让我感到惊讶base@ChrisWhite是的,这也让我感到惊讶,事实上我发现似乎有一个Jira已经坐了一段时间了。。。该实现看起来很简单,但当我尝试为ZipFileInputFormat类添加输入路径时,收到错误“The method addInputPath”(JobConf,Path,Class@Expressions_Galore
ZipFileInputFormat
是使用新的Hadoop API编写的,类似地,旧API和新API都有
MultipleInputs
,因此请确保您也使用了新API中的
MultipleInputs
,这应该可以修复它。我使用的是Cloudera Hadoop(CDH4)而且它似乎不完全支持新的API。因此,我的整个MapReduce代码都是使用旧的MapRedAPI编写的。只是澄清一下,许可证确实说我不能正确修改源代码,否则我可以编写自己的类,并将其作为参考。