在并行化“的MapReduce”的“减少”
-
11-07-2019 - |
题
我明白如何地图很容易并行化的。 - 每个计算机/ CPU可以在阵列的一小部分刚好操作
时缩小/与foldl并行?这似乎是每个计算依赖于前一个。难道仅仅是并行对于某些类型的功能是什么?
解决方案
如果您减少潜在的操作是联想*,您可以用操作和本地的顺序播放。因此你经常在“收集”相类似树的结构,这样就可以在对数时间几次通过做到这一点:
a + b + c + d
\ / \ /
(a+b) (c+d)
\ /
((a+b)+(c+d))
代替(((A + B)+ C)+ d)
如果您的操作是可交换的,进一步优化是可能的,你可以以不同的顺序收集(当这些操作例如为向量操作它可以是用于数据对齐是重要的)
[*]的真实期望的数学运算,而不是那些在有效类型,如当然浮动。
其他提示
是,如果操作者是关联的。例如,您可以parallelise合计数值的清单:
step 1: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
step 2: 3 + 7 + 11 + 15
step 3: 10 + 26
step 4: 36
此工作,因为(A + B)+ C = A +(B + C),即,其中所述添加是进行无关紧要的顺序。
检查出结合相Hadoop中
不知道什么平台/语言你想的,但你可以并行减少这样的运营商:
// Original
result = null;
foreach(item in map) {
result += item;
}
// Parallel
resultArray = array();
mapParts = map.split(numThreads);
foreach(thread) {
result = null;
foreach(item in mapParts[thread]) {
result += item;
}
resultArray += result; // Lock this!
}
waitForThreads();
reduce(resultArray);
可以看到,一个并行实现是容易递归的。你分割地图了,就在自己的线程每一个部分进行操作,然后执行另一个减少,一旦这些线程完成带来的拼凑。
(这是后面彼得Lesnick的回答中的编程的推理。)
技术上一个降低是不一样的,为与foldl(倍左),其也可以被描述为一个累加。
儒勒给出的例子示出了降低操作非常好:
step 1: 1 + 2 + 3 + 4
step 2: 3 + 7
step 3: 10
请注意,在每个步骤中,结果是一个数组,包括最后的结果是一个项目的阵列。
一个折叠式左边是这样的:
step 0: a = 0
step 1: a = a + 1
step 2: a = a + 2
step 3: a = a + 3
step 4: a = a + 4
step 5: a
现在显然这些都产生相同的结果,但与foldl具有定义良好的结果给出当非结合运算符(如减)而减少操作员不。
这取决于你减少一步。在Hadoop的风格MapReduce实现,你减速获取调用一次的每个键,的所有相关到关键的行。
因此,例如,你的映射器可能会采取了很多无序的Web服务器的日志,加入一些元数据(例如,地理编码),并发射与一个cookie ID作为键[键,记录]对。你减速然后将每个Cookie ID调用一次,并会喂所有数据该cookie,并可以计算汇总信息,如访问次数或者每次访问浏览网页的平均。或者你可以在地理编码数据的密钥,并且收集基于地理的汇总统计。
即使你不是每个键进行综合分析做的 - 事实上,即使你的东西计算在整个集 - 有可能打破你的计算成块,其中的每一个可以反馈到减速