如何在hadoop中实现前缀和?

relj7zay  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(303)

我一直在尝试在hadoop中实现前缀和。我理解算法:
每个节点都有自己的数据“桶”
每个节点对bucket求和
每个节点将其总和广播到“following”节点
现在,每个节点都可以对“previous”数据求和,并为其bucket中的每个元素计算前缀和
但我该如何实现呢?如何知道使用了多少个节点?我怎么知道我是哪个节点?hadoop文档非常缺乏信息和混乱。我想通过多次使用key-in-range(nodeid,numberofnodes)发送sum来广播数据,这样每个reducer都可以对其进行求和。我觉得很失落,我没有太多的hadoop经验。有人能帮我吗?

eqzww0vc

eqzww0vc1#

在hadoop中,您可以通过三个任务来实现这一点:
第一个任务(只有一个减速器)
Map器对数据进行采样并将其作为(0,value)对发送
reducer从配置中读取未来任务中reducer的数量,按升序排序数据并选择r-1分割点。另存为(null,value)
假设结果存储在hdfs的分区目录中。
第二个任务(带r减速器)
Map程序从分区读取数据(只有一个文件,每行的值都是split point int的升序)并将其保存在vector中。使用二进制搜索,将数据Map到(p,value),其中p是从0到r-1的数字,表示数据所在的位置。
partitioners是一个标识partitioner-对于给定的对(key,value),它将其发送给key parititoner。
reducer计算他从Map器得到的值的数量。将结果另存为(大小写)对。
假设结果存储在hdfs的size目录中。
第二个任务(带r减速器)
Map器-与任务2相同
分区-与任务2相同
reducer从size目录中读取所有reducer窗口的大小。该目录包含的文件中的行仅包含整数对—减缩数的数目及其数据的大小。将数量小于当前减速器的减速器窗口的总尺寸计算为总尺寸。对数据进行排序,并将第i个值另存为(total+i,value)

相关问题