在 apache spark 中运行的作业超出预期
Posted
技术标签:
【中文标题】在 apache spark 中运行的作业超出预期【英文标题】:More than expected jobs running in apache spark 【发布时间】:2015-06-09 12:26:22 【问题描述】:我正在尝试学习 apache-spark。这是我正在尝试运行的代码。我正在使用pyspark api
。
data = xrange(1, 10000)
xrangeRDD = sc.parallelize(data, 8)
def ten(value):
"""Return whether value is below ten.
Args:
value (int): A number.
Returns:
bool: Whether `value` is less than ten.
"""
if (value < 10):
return True
else:
return False
filtered = xrangeRDD.filter(ten)
print filtered.collect()
print filtered.take(8)
print filtered.collect()
将此作为输出[1, 2, 3, 4, 5, 6, 7, 8, 9]
。
据我了解,filtered.take(n)
将从 RDD 中获取 n 个元素并打印出来。
我正在尝试两种情况:-
1)给出的n值小于或等于RDD中的元素个数
2)n 的值大于 RDD 中的元素个数
我有pyspark application UI
可以查看每种情况下运行的作业数量。在第一种情况下,只有one job
正在运行,但在第二种情况下,five jobs
正在运行。
我无法理解为什么会这样。提前致谢。
【问题讨论】:
【参考方案1】:RDD.take
尝试评估尽可能少的分区。
如果你take(9)
它将获取分区 0(作业 1)找到 9 个项目并愉快地终止。
如果您take(10)
,它将获取分区 0(作业 1)并找到 9 个项目。它还需要一个。由于分区 0 有 9 个,它认为分区 1 可能至少还有一个(作业 2)。但事实并非如此!在 2 个分区中,它找到了 9 个项目。到目前为止,每个分区有 4.5 个项目。该公式将其除以 1.5 表示悲观,并决定 10 / (4.5 / 1.5) = 3 个分区将执行此操作。所以它获取分区 2(作业 3)。依然没有。所以到目前为止每个分区有 3 个项目,除以 1.5 意味着我们需要 10 / (3 / 1.5) = 5 个分区。它获取分区 3 和 4(作业 4)。没有。我们每个分区有 1.8 个项目,10 / (1.8 / 1.5) = 8。它获取最后 3 个分区(作业 5),仅此而已。
此算法的代码在RDD.scala 中。正如你所看到的,它只不过是启发式方法。它通常会节省一些工作,但在退化的情况下会导致不必要的工作。
【讨论】:
感谢您向我解释这一点。我对火花还是很陌生,所以这需要一些时间才能完全理解。但我想我收到了你的回复。 如果部分不清楚,请告诉我。如果您想完全理解这一点,我认为源代码是最好的资源。 (不过,您不必了解这一点,也能有效地使用 Apache Spark!) 这是我目前的理解。xrangeRDD
是一个有 8 个分区的 RDD。当执行collect
操作时,spark 将在所有 8 个分区上运行作业并形成过滤的 RDD。但是当我执行take
操作时,它只会在提供所需元素的那么多分区上运行作业。在第一种情况下,因为要求的元素是 9
并由第一个分区完成,所以它停止了。但是当它们超过9
时,它会继续到其他分区,直到找不到解决方案或没有更多分区。请纠正我哪里错了。以上是关于在 apache spark 中运行的作业超出预期的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Spark SQL 批处理作业结果写入 Apache Druid?
驱动程序内存、执行程序内存、驱动程序内存开销和执行程序内存开销对作业运行成功的 Apache Spark 影响
如何确保我的 Apache Spark 设置代码只运行一次?
Spark 作业抛出“org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [120 seconds]”