为什么 Apache Spark 的 take 函数不是并行的?
Why Apache Spark take function not parallel?
在 http://spark.apache.org/docs/latest/programming-guide.html 阅读 Apache Spark 指南,它指出:
为什么take函数不是运行并行的?并行实现此类功能有哪些难点?这是否与以下事实有关:为了获取 RDD 的前 n 个元素,需要遍历整个 RDD?
您将如何并行实施它?假设您有 4 个分区并且想要获取前 5 个元素。如果您事先知道每个分区的大小,那就很容易了:例如,如果每个分区有 3 个元素,驱动程序会向分区 0 询问所有元素,并向分区 1 询问 2 个元素。所以问题是 不知道 每个分区有多少元素。
现在,您可以先计算分区大小,但这需要限制支持的 RDD 转换集、多次计算元素或其他一些权衡,并且通常需要更多的通信开销。
实际上,虽然 take
不完全并行,但也不完全顺序。
例如,假设您 take(200)
,每个分区有 10 个元素。 take
将首先获取分区 0 并查看它有 10 个元素。它假定需要 20 个这样的分区才能获得 200 个元素。但最好在并行请求中请求更多。所以它想要 30 个分区,而它已经有 1 个。所以它接下来提取分区 1 到 29,并行。这可能是最后一步。如果非常倒霉,一共找不到200个元素,它会再次估算并并行请求另一批。
查看代码,它有详细的文档:
https://github.com/apache/spark/blob/v1.2.0/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L1049
我认为文档有误。本地计算仅在需要单个分区时发生。这是第一次通过(获取分区 0)的情况,但在以后的通过中通常不是这种情况。
在 http://spark.apache.org/docs/latest/programming-guide.html 阅读 Apache Spark 指南,它指出:
为什么take函数不是运行并行的?并行实现此类功能有哪些难点?这是否与以下事实有关:为了获取 RDD 的前 n 个元素,需要遍历整个 RDD?
您将如何并行实施它?假设您有 4 个分区并且想要获取前 5 个元素。如果您事先知道每个分区的大小,那就很容易了:例如,如果每个分区有 3 个元素,驱动程序会向分区 0 询问所有元素,并向分区 1 询问 2 个元素。所以问题是 不知道 每个分区有多少元素。
现在,您可以先计算分区大小,但这需要限制支持的 RDD 转换集、多次计算元素或其他一些权衡,并且通常需要更多的通信开销。
实际上,虽然 take
不完全并行,但也不完全顺序。
例如,假设您 take(200)
,每个分区有 10 个元素。 take
将首先获取分区 0 并查看它有 10 个元素。它假定需要 20 个这样的分区才能获得 200 个元素。但最好在并行请求中请求更多。所以它想要 30 个分区,而它已经有 1 个。所以它接下来提取分区 1 到 29,并行。这可能是最后一步。如果非常倒霉,一共找不到200个元素,它会再次估算并并行请求另一批。
查看代码,它有详细的文档: https://github.com/apache/spark/blob/v1.2.0/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L1049
我认为文档有误。本地计算仅在需要单个分区时发生。这是第一次通过(获取分区 0)的情况,但在以后的通过中通常不是这种情况。