超过预期的工作在阿帕奇运行火花

时间:2015-06-09 12:26:22

标签: apache-spark bigdata pyspark

我正在努力学习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)给出小于或等于RDD中元素数量的n值

2)给出的值大于RDD中元素的数量

我有pyspark application UI来查看每种情况下运行的作业数量。在第一种情况下,只有one job正在运行,但第二个five jobs正在运行。

我无法理解为什么会这样。提前致谢。

1 个答案:

答案 0 :(得分:2)

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。正如你所看到的,它只不过是启发式。它通常会节省一些工作,但在退化的情况下会导致不必要的工作。