为什么我们需要知道mapreduce中正在处理的文件的名称?

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

我遇到一个帖子,询问如何获得mapreduce正在处理的文件名。这让我想知道在什么情况下我们需要知道正在处理的文件的名称或路径。

FileSplit fileSplit = (FileSplit) context.getInputSplit();

String fileName = fileSplit.getPath().getName();

谢谢,巴萨姆

3j86kqsm

3j86kqsm1#

有趣的问题。
假设您需要高效地基于mapper id生成惟一的整数,就像这里所做的那样:在hive/hadoop中生成惟一的密钥
或者您使用Map器id的原因完全不同(由context.gettaskattentid().gettaskid().getid()返回)
mapper任务id的问题是没有根据输入文件确定地分配它。
例如,Map器输入文件可能是前面的缩减器的结果,并假设您有10个输入分区:
输出-r-00000输出-r-00001。。。输出-r-00009
现在您需要将此数据提供给Map器,并且可能需要此Map器具有与输入文件索引直接对应的id。
通常,在这种情况下,您首先要做的是禁用输入分割,这样每个Map器将完全处理自己的分区。
但正如我前面所说的,Map器的分配是不确定的,因此不能依赖于context.gettaskattentid().gettaskid().getid():
有时Map器0将处理output-r-00000,有时处理output-r-00001,依此类推。
因此,要确定地产生一个自定义Map器id,您可以使用输入文件名,您可以解析该文件名来获得分区索引。

u5rb5r59

u5rb5r592#

有几种情况下,文件名很重要,例如:
进程中需要文件名中的时间戳。
根据文件名的不同,可以对文件进行不同的处理。例如,如果您有两个非常相似的文件类型,而这两个文件类型需要一个具有微小差异的相似进程(如果没有,则最好有两个不同的mapreduce作业)。
除此之外,还需要跟踪所处理文件的名称。

相关问题