如果懒惰的执行风格,如何在Spark中进行转换?

时间:2016-03-28 19:01:54

标签: apache-spark benchmarking pyspark

我有一些代码执行了很多步骤,我知道整个过程需要多长时间。但是,我希望能够计算每次转换所需的时间。以下是一些简单的步骤示例:

rdd1 = sc.textFile("my/filepath/*").map(lambda x: x.split(","))
rdd2 = sc.textFile("other/filepath/*").map(lambda x: x.split(","))
to_kv1 = rdd1.map(lambda x: (x[0], x[1])) # x[0] is key, x[1] is numeric
to_kv2 = rdd2.map(lambda x: (x[0], x[1])) # x[0] is key, x[1] is numeric
reduced1 = to_kv1.reduceByKey(lambda a, b: a+b)
reduced2 = to_kv1.reduceByKey(lambda a, b: a+b)
outer_joined = reduced1.fullOuterJoin(reduced2) # let's just assume there is key overlap
outer_joined.saveAsTextFile("my_output")

现在:我如何对此代码的特定部分进行基准测试?我知道端到端运行需要花费一定的时间(saveAsTextFile将强制执行),但是如何仅对代码的reduceByKeyfullOuterJoin部分进行基准测试?我知道我可以在每次操作后运行count()来强制执行,但这不能正确地对操作进行基准测试,因为它增加了执行count所需的时间以及执行转换的时间

鉴于其懒惰的执行风格,对Spark变换进行基准测试的最佳方法是什么?

请注意,我不是在问如何衡量时间。我知道time模块,start = time.time()等等。我问如何基于Spark转换的延迟执行风格进行基准测试,直到你调用需要返回信息的动作才执行司机。

1 个答案:

答案 0 :(得分:5)

您最好的选择是使用Spark UI来阅读此信息。问题是双重的:

  • 计算是分布式的,即使你在每个转换中添加了一个计时机制,也很难分辨出任务何时真正完成,因为它可以在一台机器上完成,而不是在另一台机器上完成。也就是说,您可以在内部添加日志记录并找到执行的第一个实例,然后找到最终执行。请记住下一点
  • 转换尽可能流水线化。因此,Spark会同时运行多个转换以提高效率,因此您必须明确测试JUST这一行动。