我有一些代码执行了很多步骤,我知道整个过程需要多长时间。但是,我希望能够计算每次转换所需的时间。以下是一些简单的步骤示例:
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
将强制执行),但是如何仅对代码的reduceByKey
或fullOuterJoin
部分进行基准测试?我知道我可以在每次操作后运行count()
来强制执行,但这不能正确地对操作进行基准测试,因为它增加了执行count
所需的时间以及执行转换的时间
鉴于其懒惰的执行风格,对Spark变换进行基准测试的最佳方法是什么?
请注意,我不是在问如何衡量时间。我知道time
模块,start = time.time()
等等。我问如何基于Spark转换的延迟执行风格进行基准测试,直到你调用需要返回信息的动作才执行司机。
答案 0 :(得分:5)
您最好的选择是使用Spark UI来阅读此信息。问题是双重的: