【问题标题】:How does MapReduce read from multiple input files?MapReduce 如何从多个输入文件中读取数据?
【发布时间】:2012-12-13 13:52:46
【问题描述】:

我正在开发一个代码来读取数据并使用mapreduce 将其写入HDFS。但是,当我有多个文件时,我不明白它是如何处理的。映射器的输入路径是目录的名称,从

的输出中可以看出
String filename = conf1.get("map.input.file");

那么它是如何处理目录中的文件的呢?

【问题讨论】:

    标签: hadoop mapreduce amazon-emr emr


    【解决方案1】:

    为了获取输入文件路径,您可以使用context 对象,如下所示:

    FileSplit fileSplit = (FileSplit) context.getInputSplit();
    String inputFilePath = fileSplit.getPath().toString();
    

    以及如何处理多个文件:

    在集群中的不同机器上创建了多个映射器函数实例。每个实例接收一个不同的输入文件。如果文件大于默认的 dfs 块大小 (128 MB),则文件会进一步拆分为更小的部分,然后分发给映射器。

    因此您可以通过以下两种方式配置每个映射器接收的输入大小:

    • 更改 HDFS 块大小(例如 dfs.block.size=1048576
    • 设置参数mapred.min.split.size(只能设置为大于HDFS块大小)

    注意: 这些参数只有在您的输入格式支持拆分输入文件时才有效。常见的压缩编解码器(如 gzip)不支持拆分文件,因此这些将被忽略。

    【讨论】:

    • 另外你应该提到,当我们处理 gz 文件时,所有配置都不起作用,每个文件都将转到单个映射器并且不会拆分。
    • @Amar :感谢您的详细解释。但是,我使用的是自定义格式,并且我已将“isSplitable()”设置为 false 以将整个文件读入一个映射器。因此,为了获取我尝试使用“FileStatus”对象的文件名。
    【解决方案2】:

    继续@Amar 的回答,我在以下代码中使用了 FileStatus 对象,因为我的自定义输入格式不会拆分输入文件。

    FileSystem fs = file.getFileSystem(conf);
                    FileStatus status= fs.getFileStatus(file);
                    String fileName=status.getPath().toString();
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 2012-10-25
      • 2016-05-13
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2013-07-16
      相关资源
      最近更新 更多