【问题标题】:how to use file (many file's full path inside) as input to MapReduce job如何使用文件(里面有很多文件的完整路径)作为 MapReduce 作业的输入
【发布时间】:2015-11-13 06:54:15
【问题描述】:

我正在使用 Hadoop 2.7.1 并使用 Java 进行编码。我可以运行一个简单的 mapreduce 程序,在其中我提供一个文件夹作为 MapReduce 程序的输入。

但是我想使用一个文件(完整路径在里面)作为输入;此文件包含要由映射器函数处理的所有其他文件。

下面是文件内容,

/allfiles.txt
    - /tmp/aaa/file1.txt
    - /tmp/bbb/file2.txt
    - /tmp/ccc/file3.txt

如何将 MapReduce 程序的输入路径指定为文件,以便它可以开始处理里面的每个文件?谢谢。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    在您的驱动程序类中,您可以读取文件,并将每一行添加为文件以供输入:

    //Read allfiles.txt and put each line into a List (requires at least Java 1.7)
    List<String> files = Files.readAllLines(Paths.get("allfiles.txt"), StandardCharsets.UTF_8);
    
    /Loop through the file names and add them as input
    for(String file : files) {
         //This Path is org.apache.hadoop.fs.Path 
         FileInputFormat.addInputPath(conf, new Path(file));
    }
    

    这是假设您的 allfiles.txt 位于运行 MR 作业的节点的本地,但如果 allfiles.txt 实际上位于 HDFS 上,这只是一个很小的变化。

    我强烈建议您在将其添加为输入之前检查 HDFS 上是否存在每个文件。

    【讨论】:

      【解决方案2】:

      您可以使用globs,而不是创建带有其他文件路径的文件。

      在您的示例中,您可以将输入定义为 -input /tmp/*/file?.txt

      【讨论】:

        猜你喜欢
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多