我正在学习Hadoop / mapreduce,并对分割映射器的各种可能性提出疑问。
在标准' wordcount'场景,每个不同的过程在一个独特的行上工作,并做一些基本的数学(加法)。但是,是否可以让每个进程都在一个唯一的文件上工作?例如,如果我有500,000个唯一文件,每个文件大约是5M,我可以告诉Hadoop每个进程应该对每个文件执行一些分析,然后对结果分析执行统计(例如,将结果平均)吗? / p>
例如,假设每个文件包含:
{name}
{data1}
{data2}
...
{dataN}
我想对这个文件执行数学函数
F({name}) = [value1, value2, value3]
基于{data1, ..., dataN}
,最后,我想找到每个[value1, value2, value3]
的所有可能{name}
数组的平均值。在这种情况下,如果我使用Hadoop处理每一行,它将无济于事,因为每个data
必须与name
相关联,所以我希望让Hadoop知道哪个{{1}它正在使用。
如果可以,name
的计算是'地图'阶段,然后F
数组的平均值为' reduce'相位θ
因此,要将问题合并为一个清晰的单行: 我怎样才能让Hadoop分解文件而不是行?
答案 0 :(得分:1)
我们可以获取文件名并输出为mapper的输出键。映射器输出值可以是value1,value2,value3等值。获取文件名的代码段如下
InputSplit split = context.getInputSplit();
String fileName = split.getPath().getName();
在reducer部分,我们可以根据我们的文件名在这里进行迭代,并进行必要的操作,如平均值,总和等。 reducer输出可以包含文件名和值。
答案 1 :(得分:0)