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

Rad*_*dAl 2 hadoop mapreduce amazon-emr emr

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

String filename = conf1.get("map.input.file");
Run Code Online (Sandbox Code Playgroud)

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

Ama*_*mar 10

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

FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();
Run Code Online (Sandbox Code Playgroud)

至于如何处理多个文件:

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

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

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

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

  • 另外你应该提到的是,当我们处理gz文件时,没有任何配置可以工作,每个文件都将转到单个映射器而不是拆分. (2认同)