java - 两个 map 缩减作业并将每个作业的缩减值加入一个包含两个值的列表

标签 java hadoop dictionary mapreduce reduce

我正在编写一个 MapReduce 程序,要求我找到一个节点 (000-999) 的入站和出站链接数,本质上是一个网络图形处理器。我需要返回一个特定的节点作为键,每个文档的出度和入度作为值。例如,

示例文本文件:

000 002
001 002
002 000
001 000

应该返回:

000 1 2
001 2 0
002 1 2

按照我的逻辑,似乎我需要创建两个 map reduce 作业,第一个传入一个值为节点对(例如 000 002)的 LongWritable 键,计算每个节点的出站链接数并在 reducer 阶段结束时返回类似 (000 1) 的内容。然后我将通过翻转节点对(例如 000 002 变为 002 000)并找到那些出站链接的计数(在上面的示例中,这将返回 (000 2))来找到文档的入度。然后我需要组合这些值以生成 (000 1 2) 的最终输出。创建两个 map 作业并以某种方式将这两个值连接到一个包含两个值的列表中的最佳方法是什么?如果我使用 java(不是 Hive)对此进行编码,有没有办法加入这些值?有没有更简单、更有效的方法来解决这个问题?

编辑:对于这个程序,映射器功能是相同的,因为我只是切换两个值(000 002 到 002 000)以便以完全相同的方式计算入站路径和出站路径。 reducer 函数也完全相同,但它需要在两个单独的作业上运行,所以我没有收到我的最终值作为入度和出度的总和。我需要返回入度,然后返回出度并将它们附加到值列表中。

最佳答案

我的建议是使用复杂的字符串制作更复杂的中间格式。您可能只需要为您的 reducer 形成一个 CSV 格式。

对于进入 reducer 的每一行,在输入的第一行中将有 2 个不同的节点:000 和 002。 制作一个“#”分隔的字符串,例如:

context.write(new Text("000"),new Text("LeftToRight#1"));
context.write(new Text("002"),new Text("RightToLeft#1"));

稍后在 reducer 中,您可以分别计算所有 LeftToRights 和 RightToLeft 并为它们生成输出。

要在单个文件中获取输出:将 reducer 数量设置为 1。

关于java - 两个 map 缩减作业并将每个作业的缩减值加入一个包含两个值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499869/

相关文章:

java - 接口(interface)是 "Object"吗?

java - Spring Zuul 网关 - 带有 Spring Cache Redis

Java死锁挑衅

hadoop - 在同一台机器上的多个核心上运行 Map-Reduce 应用程序

C# 字典存储操作/方法

python - 试图理解通过嵌套字典进行搜索

java - JDK 中的 ThreadLocal<T> 文档

java - Hadoop与Mysql如何整合?

hadoop - core-site.xml在mapreduce程序中的使用

python - 在字典python中添加键的列表值