hadoop reducer-在新api中获取输入目录?

fd3cxomn  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(282)

在输入目录中,我有一个要处理的文件列表和一个元数据文件。在输出缩减器方面,我想索引到这个文件中,只需将额外的元数据添加到输出中。如何获取输入目录?
在旧api中,可以执行以下操作:

context.getConfiguration().get("map.input.dir")

新api允许Map程序执行以下操作:

(FileSplit)context.getInputSplit()).getPath()

但是reducer上下文没有这个函数。而且,对于简单的任务来说,执行连接似乎有些过分。

4urapxun

4urapxun1#

Reducer 运行在 Mappers ,因此中没有有关输入文件的信息 Context 在那里。现在来识别里面的输入目录 reduce 您只需要在中标记outvalue map 使用您共享的代码,加入与此无关。如:
Map

String tag = (FileSplit)context.getInputSplit()).getPath()
                                                .getParent().getName().toString();
context.write(outKey, new Text(tag + "_" + value.toString));

如果您对文件名本身感兴趣(实际上应该是这样),请删除 getParent() 打电话。
减少

String metaFileName = "meta.dat";
for(Text value : values){
    String[] tagVal = value.toString().split("_",2); 
    if(strVal[0].equals(metaFileName){
          // process the meta file here // strVal[1] contains the actual value
    } else { // process data files }
}

这应该能解决你的问题。这里有一个建议,你可以利用 MultiOutputs 从reducer写入不同类型文件的api。否则,在作业结束后,将很难识别元文件(它将分布在多个输出文件中)。

5ktev3wc

5ktev3wc2#

mapreduce作业的输入由 FileInputFormat.addInputPath() 方法。正如方法名称所暗示的 addInputPath() 方法可以多次调用以指定其他文件和/或目录作为mapreduce作业的输入。因此,可能有多个路径作为单个mapreduce作业的输入。
Map器任务在单个拆分上操作。因此,Map器能够检索正在处理的特定拆分的路径是有意义的。
但是,还原器通常对多个Map器的输出进行操作,这些Map器的输入拆分可能(可能)具有不同的路径。因此,在一个reducer中没有inputsplit的概念,这就是为什么你不能得到它的路径。

相关问题