如何在Hadoop中实现前缀和?

时间:2016-12-11 16:34:25

标签: hadoop hadoop2

我试图在Hadoop中实现前缀和。我理解算法:

  • 每个节点都有“桶”数据
  • 每个节点汇总桶
  • 每个节点将其总和广播到“跟随”节点
  • 每个节点现在可以对“先前”数据求和,并计算其存储桶中每个元素的前缀和

但我该如何实施呢?我怎么知道使用了多少个节点?我怎么知道哪个节点'我'? Hadoop文档令人难以置信地缺乏信息和混乱。我希望通过使用键范围(nodeID,numberOfNodes)多次发送和来广播数据,以便每个reducer可以对其进行求和。我感到迷茫,我在Hadoop上没有很多经验。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您可以在Hadoop中的三个任务中执行此操作:

  1. 第一项任务(只有一个减速机)

    • Mappers示例数据并将其作为(0,值)
    • 发送
    • Reducer在以后的任务中从配置中读取 r 减少器的数量,按升序对数据进行排序并选择 r - 1 分割点。将它们保存为(null,value)

    假设结果存储在hdfs的 partition 目录中。

  2. 第二项任务(使用 r reducer)

    • Mappers从 partition 读取数据(只有一个文件,每一行都是一个以升序排序的分割点的值)并将其保存在向量中。使用二进制搜索,将数据映射到(p,value),其中 p 是从 0 r - 1的数字并表示数据所在的reducer。
    • 分区程序是一个标识分区程序 - 对于给定的对(密钥,值),它将其发送到密钥 parititoner。
    • Reducer计算从映射器获取的值的数量。将结果保存为(缩减器,大小)对。

    假设结果存储在hdfs的 sizes 目录中。

  3. 第二项任务(使用 r reducer)

    • Mappers - 与任务编号相同。 2
    • 分区程序 - 与任务编号相同。 2
    • Reducer从 sizes 目录中读取所有reducer窗口的大小。该目录包含的行文件只包含整数对 - 减速器数量和数据大小。计算减速器窗口的总大小,其数量小于当前减速器的数量总计。对数据进行排序,对于 i - 值,将其另存为(总计+ i,值)