如何在Hadoop中实现前缀和?

如何在Hadoop中实现前缀和?,hadoop,hadoop2,Hadoop,Hadoop2,我一直在尝试在Hadoop中实现前缀和。我理解算法: 每个节点都有自己的数据“bucket” 每个节点对存储桶求和 每个节点将其总和广播到“后续”节点 现在,每个节点都可以对“先前”数据求和,并计算其bucket中每个元素的前缀和 但是我如何实现它呢?我如何知道使用了多少个节点?我如何知道哪个节点是“我”?Hadoop文档极其缺乏信息,令人困惑。我想通过使用key-in-range(nodeID,numberOfNodes)多次发送sum来广播数据,这样每个reducer都可以对其进行求和。

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

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

但是我如何实现它呢?我如何知道使用了多少个节点?我如何知道哪个节点是“我”?Hadoop文档极其缺乏信息,令人困惑。我想通过使用key-in-range(nodeID,numberOfNodes)多次发送sum来广播数据,这样每个reducer都可以对其进行求和。我觉得很失落,我对Hadoop没有太多经验。有人能帮我吗?

在Hadoop中,您可以通过三个任务来完成这一点:

  • 第一个任务(只有一个减速器)

    • 映射器采样数据并将其作为(0,值)对发送
    • Reducer从配置中读取未来任务中的r个Reducer,按升序对数据进行排序,并选择r-1拆分点。将它们另存为(null,value)
    假设结果存储在hdfs上的分区目录中

  • 第二个任务(带r减速器)

    • 映射程序从分区中读取数据(只有一个文件,每行的值都是split point int升序),并将其保存在vector中。使用二进制搜索,将数据映射到(p,value),其中p是从0到r-1的数字,表示数据所在的减缩器
    • 分区器是一个身份分区器-对于给定的对(键、值),它将其发送给键配对器
    • Reducer计算他从映射器获得的值的数量。将结果保存为(减速机、大小)对
    假设结果存储在hdfs上的sizes目录中

  • 第二个任务(带r减速器)

    • 制图器-与任务2相同
    • 分区器-与任务2相同
    • Reducer从sizes目录读取所有Reducer窗口的大小。该目录包含的文件行仅包含整数对—减缩器的数量及其数据的大小。将数量小于当前减速器的减速器窗口的总尺寸计算为总尺寸。对数据进行排序,对于第i个值,将其另存为(总计+i,值)

  • 您可以在Hadoop中的三个任务中完成此操作:

  • 第一个任务(只有一个减速器)

    • 映射器采样数据并将其作为(0,值)对发送
    • Reducer从配置中读取未来任务中的r个Reducer,按升序对数据进行排序,并选择r-1拆分点。将它们另存为(null,value)
    假设结果存储在hdfs上的分区目录中

  • 第二个任务(带r减速器)

    • 映射程序从分区中读取数据(只有一个文件,每行的值都是split point int升序),并将其保存在vector中。使用二进制搜索,将数据映射到(p,value),其中p是从0到r-1的数字,表示数据所在的减缩器
    • 分区器是一个身份分区器-对于给定的对(键、值),它将其发送给键配对器
    • Reducer计算他从映射器获得的值的数量。将结果保存为(减速机、大小)对
    假设结果存储在hdfs上的sizes目录中

  • 第二个任务(带r减速器)

    • 制图器-与任务2相同
    • 分区器-与任务2相同
    • Reducer从sizes目录读取所有Reducer窗口的大小。该目录包含的文件行仅包含整数对—减缩器的数量及其数据的大小。将数量小于当前减速器的减速器窗口的总尺寸计算为总尺寸。对数据进行排序,对于第i个值,将其另存为(总计+i,值)