我正在开发一个读取数据并将其写入的代码 HDFS 使用 mapreduce . 然而,当我有多个文件,我不明白它是如何处理。Map器的输入路径是目录的名称,从
HDFS
mapreduce
String filename = conf1.get("map.input.file");
那么它如何处理目录中的文件呢?
qltillow1#
为了获得输入文件路径,可以使用 context 对象,如下所示:
context
FileSplit fileSplit = (FileSplit) context.getInputSplit(); String inputFilePath = fileSplit.getPath().toString();
至于如何处理多个文件:Map器函数的几个示例是在集群中的不同机器上创建的。每个示例接收不同的输入文件。如果文件大于默认的dfs块大小(128 mb),则文件将进一步拆分为更小的部分,然后分发给Map器。因此,您可以通过以下两种方式配置每个Map器接收的输入大小:更改hdfs块大小(例如 dfs.block.size=1048576 )设置参数 mapred.min.split.size (只能设置为大于hdfs块大小)注意:这些参数只有在您的输入格式支持拆分输入文件时才有效。常见的压缩编解码器(如gzip)不支持拆分文件,因此这些文件将被忽略。
dfs.block.size=1048576
mapred.min.split.size
dgjrabp22#
为了继续@amar的回答,我在下面的代码中使用了filestatus对象,因为我定制的input格式不会分割输入文件。
FileSystem fs = file.getFileSystem(conf); FileStatus status= fs.getFileStatus(file); String fileName=status.getPath().toString();
2条答案
按热度按时间qltillow1#
为了获得输入文件路径,可以使用
context
对象,如下所示:至于如何处理多个文件:
Map器函数的几个示例是在集群中的不同机器上创建的。每个示例接收不同的输入文件。如果文件大于默认的dfs块大小(128 mb),则文件将进一步拆分为更小的部分,然后分发给Map器。
因此,您可以通过以下两种方式配置每个Map器接收的输入大小:
更改hdfs块大小(例如
dfs.block.size=1048576
)设置参数
mapred.min.split.size
(只能设置为大于hdfs块大小)注意:这些参数只有在您的输入格式支持拆分输入文件时才有效。常见的压缩编解码器(如gzip)不支持拆分文件,因此这些文件将被忽略。
dgjrabp22#
为了继续@amar的回答,我在下面的代码中使用了filestatus对象,因为我定制的input格式不会分割输入文件。