pig documentation说如果满足某些条件(这些条件在文档中有描述),Pig 可以在 map 端 GROUP
。有人可以解释这个算法吗?我想深入了解 MapReduce 可以做什么。
最佳答案
例如,想象下面的文件:
10 - 1
14 - 2
10 - 3
12 - 4
12 - 5
20 - 6
21 - 7
17 - 8
12 - 9
17 - 10
然后,负载将存储您的文件,就像这样(假设您的集群有 3 个节点 - 如果您使用 Identity Map-Reduce Job,那么将 reduce 数量设置为 3 可以获得相同的结果。如果您的文件是 skweed 你可能会遇到一些性能问题)。 用于此的加载程序必须保证它不会在多个拆分中拆分键的单个值。 ( http://wiki.apache.org/pig/MapSideCogroup )
part-r-00000 part-r-00001 part-r-00002
10 - 1 14 - 2 20 - 6
10 - 3 17 - 8 21 - 7
12 - 4 17 - 10
12 - 9
现在,hadoop 框架将为每个生成的分区生成一个映射任务。我在这个案例中有 3 个 map task 。 因此,假设您要对第二个字段求和,该过程可以只在 map 端运行。
part-m-00000
10 - 17
12 - 13
part-m-00001
14 - 2
17 - 18
part-m-00002
20 - 13
就 COGROUP 而言,我想它会以类似的方式执行。每个映射任务将在两个具有相同 key 的分区文件中运行。
关于java - GROUP USING 'collected' 和 'merge' 背后的算法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097414/