【问题标题】:Hadoop, MapReduce - Multiple Input/Output PathsHadoop、MapReduce - 多输入/输出路径
【发布时间】:2016-05-14 17:16:56
【问题描述】:

在为我的 MapReduce 作业制作 Jar 时,我在输入文件中使用 Hadoop-local 命令。我想知道是否有一种方法,而不是专门指定输入文件夹中要在 MapReduce 作业中使用的每个文件的路径,我是否可以只指定并传递输入文件夹中的所有文件。这是因为文件的内容和数量可能会由于我正在尝试配置的 MapReduce 作业的性质而改变,并且由于我不知道文件的具体数量,除了这些文件的内容之外,有没有办法将输入文件夹中的所有文件传递到我的 MapReduce 程序中,然后遍历每个文件以计算某个函数,然后将结果发送到 Reducer。我只使用一个 Map/Reduce 程序,并且我正在使用 Java 进行编码。我可以使用 hadoop-moonshot 命令,但我目前正在使用 hadoop-local。

谢谢。

【问题讨论】:

  • 如果您在作业中指定 HDFS 目录而不是文件,则应读取所有文件。您能否请edit您的问题包括您正在运行的命令?也可能是minimal reproducible example 中的一些代码?
  • 谢谢@cricket_007 您能否提供一个调用 HDFS 目录而不是单个文件的示例。另外,我如何为每个输入创建一个单独的输出文件。我猜是通过某种方式使用 MultipleOutput 类,但我现在不知道如何。
  • 我不记得如何输出多个文件,但mapreduce输出本身必须是一个目录。至于目录输入,wordcount example从一个目录读取两个文件
  • @Shah.1 你试过设置:FileInputFormat.setInputDirRecursive(mapReduceJob, true); 以便能够递归读取文件吗?

标签: java hadoop mapreduce


【解决方案1】:

您不必将单个文件作为MapReduce Job 的输入传递。

FileInputFormat 类已经提供 API 来接受多个文件列表作为 Map Reduce 程序的输入。

public static void setInputPaths(Job job,
                 Path... inputPaths)
                          throws IOException

为 map-reduce 作业的输入列表添加一个路径。 参数:

conf - 作业的配置

path - 要添加到 map-reduce 作业的输入列表中的路径。

来自 Apache tutorial 的示例代码

Job job = Job.getInstance(conf, "word count");
FileInputFormat.addInputPath(job, new Path(args[0]));

MultipleInputs 提供以下 API。

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

将带有自定义 InputFormat 和 Mapper 的 Path 添加到 map-reduce 作业的输入列表中。

相关的 SE 问题:

Can hadoop take input from multiple directories and files

请参阅MultipleOutputs API,了解关于多个输出路径的第二个查询。

FileOutputFormat.setOutputPath(job, outDir);

// Defines additional single text based output 'text' for the job
MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
LongWritable.class, Text.class);

// Defines additional sequence-file based output 'sequence' for the job
MultipleOutputs.addNamedOutput(job, "seq",
SequenceFileOutputFormat.class,
LongWritable.class, Text.class);

查看有关多个输出文件的相关 SE 问题。

Writing to multiple folders in hadoop?

hadoop method to send output to multiple directories

【讨论】:

  • 您提取的示例代码仅使用一个输入路径
  • 除了问题标题中同时显示输入/输出之外,OP 正在寻找多个文件作为问题正文中的输入。没有提到输出。后来我添加了 setOutputPath API。
  • 不过,标题和问题并不真正匹配。所要求的只是读取文件目录。是的,这段代码可以做到。我只是说你提到了多个路径,但是示例代码没有使用该方法
  • 感谢@Ravindrababu,但我将如何使用它来传递多个输入文件。以及如何指定多个输出文件,每个输出到不同的目录。假设一个不同的文本文件输出每个输入的结果。
  • 更新了答案
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多