apache spark 中超过预期的工作 运行

More than expected jobs running in apache spark

我正在尝试学习 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 是 运行ning,但在第二种情况下 five jobs 是 运行ning。

我不明白为什么会这样。提前致谢。

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 中。如您所见,它只不过是启发式方法。它通常可以节省一些工作,但在退化的情况下会导致不必要的许多工作。