【发布时间】:2012-12-13 13:52:46
【问题描述】:
我正在开发一个代码来读取数据并使用mapreduce 将其写入HDFS。但是,当我有多个文件时,我不明白它是如何处理的。映射器的输入路径是目录的名称,从
String filename = conf1.get("map.input.file");
那么它是如何处理目录中的文件的呢?
【问题讨论】:
标签: hadoop mapreduce amazon-emr emr
我正在开发一个代码来读取数据并使用mapreduce 将其写入HDFS。但是,当我有多个文件时,我不明白它是如何处理的。映射器的输入路径是目录的名称,从
String filename = conf1.get("map.input.file");
那么它是如何处理目录中的文件的呢?
【问题讨论】:
标签: hadoop mapreduce amazon-emr emr
为了获取输入文件路径,您可以使用context 对象,如下所示:
FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();
以及如何处理多个文件:
在集群中的不同机器上创建了多个映射器函数实例。每个实例接收一个不同的输入文件。如果文件大于默认的 dfs 块大小 (128 MB),则文件会进一步拆分为更小的部分,然后分发给映射器。
因此您可以通过以下两种方式配置每个映射器接收的输入大小:
dfs.block.size=1048576)mapred.min.split.size(只能设置为大于HDFS块大小)注意: 这些参数只有在您的输入格式支持拆分输入文件时才有效。常见的压缩编解码器(如 gzip)不支持拆分文件,因此这些将被忽略。
【讨论】:
继续@Amar 的回答,我在以下代码中使用了 FileStatus 对象,因为我的自定义输入格式不会拆分输入文件。
FileSystem fs = file.getFileSystem(conf);
FileStatus status= fs.getFileStatus(file);
String fileName=status.getPath().toString();
【讨论】: