如何在Hadoop中实现前缀和?
我一直在尝试在Hadoop中实现前缀和。我理解算法:如何在Hadoop中实现前缀和?,hadoop,hadoop2,Hadoop,Hadoop2,我一直在尝试在Hadoop中实现前缀和。我理解算法: 每个节点都有自己的数据“bucket” 每个节点对存储桶求和 每个节点将其总和广播到“后续”节点 现在,每个节点都可以对“先前”数据求和,并计算其bucket中每个元素的前缀和 但是我如何实现它呢?我如何知道使用了多少个节点?我如何知道哪个节点是“我”?Hadoop文档极其缺乏信息,令人困惑。我想通过使用key-in-range(nodeID,numberOfNodes)多次发送sum来广播数据,这样每个reducer都可以对其进行求和。
- 每个节点都有自己的数据“bucket”
- 每个节点对存储桶求和
- 每个节点将其总和广播到“后续”节点
- 现在,每个节点都可以对“先前”数据求和,并计算其bucket中每个元素的前缀和
但是我如何实现它呢?我如何知道使用了多少个节点?我如何知道哪个节点是“我”?Hadoop文档极其缺乏信息,令人困惑。我想通过使用key-in-range(nodeID,numberOfNodes)多次发送sum来广播数据,这样每个reducer都可以对其进行求和。我觉得很失落,我对Hadoop没有太多经验。有人能帮我吗?在Hadoop中,您可以通过三个任务来完成这一点:
- 映射器采样数据并将其作为(0,值)对发送
- Reducer从配置中读取未来任务中的r个Reducer,按升序对数据进行排序,并选择r-1拆分点。将它们另存为(null,value)
- 映射程序从分区中读取数据(只有一个文件,每行的值都是split point int升序),并将其保存在vector中。使用二进制搜索,将数据映射到(p,value),其中p是从0到r-1的数字,表示数据所在的减缩器
- 分区器是一个身份分区器-对于给定的对(键、值),它将其发送给键配对器
- Reducer计算他从映射器获得的值的数量。将结果保存为(减速机、大小)对
- 制图器-与任务2相同
- 分区器-与任务2相同
- Reducer从sizes目录读取所有Reducer窗口的大小。该目录包含的文件行仅包含整数对—减缩器的数量及其数据的大小。将数量小于当前减速器的减速器窗口的总尺寸计算为总尺寸。对数据进行排序,对于第i个值,将其另存为(总计+i,值)
您可以在Hadoop中的三个任务中完成此操作:
- 映射器采样数据并将其作为(0,值)对发送
- Reducer从配置中读取未来任务中的r个Reducer,按升序对数据进行排序,并选择r-1拆分点。将它们另存为(null,value)
- 映射程序从分区中读取数据(只有一个文件,每行的值都是split point int升序),并将其保存在vector中。使用二进制搜索,将数据映射到(p,value),其中p是从0到r-1的数字,表示数据所在的减缩器
- 分区器是一个身份分区器-对于给定的对(键、值),它将其发送给键配对器
- Reducer计算他从映射器获得的值的数量。将结果保存为(减速机、大小)对
- 制图器-与任务2相同
- 分区器-与任务2相同
- Reducer从sizes目录读取所有Reducer窗口的大小。该目录包含的文件行仅包含整数对—减缩器的数量及其数据的大小。将数量小于当前减速器的减速器窗口的总尺寸计算为总尺寸。对数据进行排序,对于第i个值,将其另存为(总计+i,值)