我正在开发一个代码来读取数据并使用HDFS
将其写入mapreduce
。但是,当我有多个文件时,我不明白它是如何处理的。映射器的输入路径是目录的名称,从
String filename = conf1.get("map.input.file");
那么它如何处理目录中的文件?
答案 0 :(得分:10)
为了获取输入文件路径,您可以使用context
对象,如下所示:
FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();
至于如何处理多个文件:
在群集中的不同计算机上创建了几个mapper函数实例。每个实例接收不同的输入文件。如果文件大于默认的dfs块大小(128 MB),则文件将进一步拆分为更小的部分,然后分发给映射器。
因此,您可以通过以下两种方式配置每个映射器接收的输入大小:
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();