MapReduce如何从多个输入文件中读取?

时间:2012-12-28 09:10:37

标签: hadoop mapreduce amazon-emr emr

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

至于如何处理多个文件:

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

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

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

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

答案 1 :(得分:0)

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

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