当前位置: 首页 > 知识库问答 >
问题:

需要帮助写地图/减少工作,以找到平均值

姜志
2023-03-14

我是Hadoop Map/Reduce的新手。我正在尝试编写一个Map/Reduce作业,以查找n个进程所花费的平均时间,给定一个输入文本文件,如下所示:

ProcessName Time
process1    10
process2    20
processn    30

我读了一些教程,但仍然不能完全理解。我的mapper和reducer类应该如何解决这个问题?我的输出将始终是文本文件,还是可以直接将平均值存储在某种变量中?

谢了。

共有2个答案

曾元忠
2023-03-14

映射器将输入映射到要取平均值的值。假设您的输入是一个文本文件,格式如下:

ProcessName Time
process1    10
process2    20
.
.
.

然后,您需要获取文件中的每一行,将其拆分,获取第二列,并将该列的值作为< code>IntWritable(或其他一些< code>Writable数值类型)输出。因为您想要取所有时间的平均值,而不是按进程名称或任何东西分组,所以您将有一个固定的键。因此,您的映射器将类似于

private IntWritable one = new IntWritable(1);
private IntWritable output = new IntWritable();
proctected void map(LongWritable key, Text value, Context context) {
    String[] fields = value.split("\t");
    output.set(Integer.parseInt(fields[1]));
    context.write(one, output);
}

您的reducer接受这些值,并简单地计算平均值。这看起来像

IntWritable one = new IntWritable(1);
DoubleWritable average = new DoubleWritable();
protected void reduce(IntWritable key, Iterable<IntWrtiable> values, Context context) {
    int sum = 0;
    int count = 0;
    for(IntWritable value : values) {
        sum += value.get();
        count++;
    }
    average.set(sum / (double) count);
    context.Write(key, average);
}

我在这里做了很多假设,关于你的输入格式等等,但它们是合理的假设,你应该能够适应你的确切需求。

我的输出是否始终是文本文件,或者是否可以将平均值直接存储在某种变量中?

你有两个选择。您可以对作业的输出进行后处理(写入单个文件),或者,由于您计算的是单个值,因此可以将结果存储在计数器中。

宰父志新
2023-03-14

您的映射器读取文本文件,并在每行上应用以下映射函数

map: (key, value)
  time = value[2]
  emit("1", time)

所有map调用都会发出键“1”,该键将由一个降函数处理

reduce: (key, values)
  result = sum(values) / n
  emit("1", result)

由于您使用的是Hadoop,您可能已经看到了在map函数中使用StringTokenizer,您可以使用它仅获取一行中的时间。此外,您可以想出一些方法来计算n(进程数),例如,您可以在另一个作业中使用一个计数器,该计数器只计算行数。

更新
如果要执行此作业,则必须为每行发送一个元组到reducer,如果在多台机器上运行Hadoop集群,则可能会阻塞网络。更聪明的方法可以计算更接近输入的时间之和,例如通过指定组合器:

combine: (key, values)
  emit(key, sum(values))

然后在同一台机器的所有map函数的结果上执行此组合器,即在两者之间没有网络。然后,减速器将只获取集群中机器数量的元组,而不是日志文件中的行。

 类似资料:
  • 我似乎无法从用户输入的分数中计算出平均分数。我也不能让它停止例外输入大于100或小于0。有人能告诉我我做错了什么吗?谢谢

  • 请帮助理解我如何在我的例子中使用fkatMap(): 我看了留档。我知道如何工作,但我不明白我需要如何在我的例子中使用。谢谢。

  • 然后,这需要转到数据库,该数据库向工作人员发送返回消息,告诉他们该成员已被添加。 只有工作人员在和系统通话,没有人。

  • 我正在学习map/reduce,我正在研究计算数据集中特定列中所有值的平均值的问题。 到目前为止,我在上看到的所有解决方案都遵循这一思路 数据集 1 2 3 4 5 映射作业:生成键、值对,键为1 (1,1) (1,2) (1,3) 和(1,4) 现在,由于映射作业的输出的键是相同的,因此所有这些键都将发送到一个化简器,在那里我们可以进行计算总和/计数 然而,我的问题是,对所有条目使用相同的键是否

  • 我正在读一本关于PHP开发的书,但我遇到了让Apache与PHP一起工作的麻烦。所以我已经尝试了一段时间,第一次我认为是因为我有一个64位版本的PHP和32位版本的Apache,所以我重新下载了所有的东西,以确保我有所有的32位版本。 书名:PHP和MySQL Web开发开发者库第四版 我下载了PHP5.5(5.5.24)x86线程安全。到目前为止,我已经按照指示做了 设置一个php.ini文件,

  • 我再次下载了java sdk(如这里所示:http://www.oracle.com/technetwork/java/JavaFX/downloads/index.html),但是当我右键单击一个项目时,JavaFX并没有显示出来。(如果有关系的话,我使用的是eclipse上的scala插件) 我去了这里:http://www.eclipse.org/efxclipse/install.html