【问题标题】:Two map reduce jobs and joining reduced values of each job into one list of two values两个 map reduce 作业并将每个作业的缩减值连接到一个包含两个值的列表中
【发布时间】:2015-06-12 12:55:40
【问题描述】:

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

示例文本文件:

000 002
001 002
002 000
001 000

应该返回:

000 1 2
001 2 0
002 1 2

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

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

【问题讨论】:

    标签: java hadoop dictionary mapreduce reduce


    【解决方案1】:

    我的建议是使用复杂的字符串制作更复杂的中间格式。您可能需要的只是为您的 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。

    【讨论】:

      【解决方案2】:

      假设您想做其他事情然后计算给定顶点的度数,我建议使用jgrapht,这是一个为图论提供对象和算法的 Java 类库。

      请参阅inDegreeOf 作为您问题的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多