如何在 Spark 上测量查询的执行时间

How to measure the execution time of a query on Spark

提问人:YAKOVM 提问时间:1/6/2016 最后编辑:William 'Bill' WentworthYAKOVM 更新时间:4/4/2022 访问量:52366

问:

我需要测量 Apache spark (Bluemix) 上查询的执行时间。 我尝试过:

import time

startTimeQuery = time.clock()
df = sqlContext.sql(query)
df.show()
endTimeQuery = time.clock()
runTimeQuery = endTimeQuery - startTimeQuery

这是个好办法吗?相对于我看到表格的时间,我得到的时间看起来太小了。

SQL 时间 apache-spark ibm-cloud

评论


答:

4赞 Sumit 1/6/2016 #1

SPARK 本身提供了有关 Spark 作业每个阶段的大量详细信息。

您可以在 http://IP-MasterNode:4040 上查看正在运行的作业,也可以启用历史记录服务器以在以后分析作业。

有关历史记录服务器的更多信息,请参阅此处

评论

2赞 Randy Horman 4/29/2016
OP 正在询问 Bluemix 上的 Apache Spark Service,因此不要在他们自己的控制下运行他们自己的 Spark 集群;例如,它不会在 4040 上公开 UI。
7赞 Sven Hafeneger 4/29/2016 #2

更新:否,使用包不是衡量 Spark 作业执行时间的最佳方法。据我所知,最方便、最准确的方法是使用 Spark History Server。time

在 Bluemix 上,在笔记本中转到右侧的 “Paelette”。选择“环境”面板,你将看到一个指向 Spark History Server 的链接,您可以在其中调查已执行的 Spark 作业,包括计算时间。

评论

0赞 Nadjib Mami 10/19/2016
我知道 OP 接受了答案,但奇怪的是,它并没有从字面上回答他的问题,即使用 time.clock() 来测量查询执行时间。我有同样的问题,这就是我最终来到这里的原因,但最后没有答案。
0赞 Sven Hafeneger 11/7/2018
@nadjib-mami Ops,好点,错过了简单的“不”,直接去了解决方案:)谢谢!
0赞 Sairam Krish 9/13/2021
它仍然没有回答,为什么使用不是最好的测量方式time
14赞 shridharama 9/8/2016 #3

我使用包裹的辅助函数,如下所示 -System.nanoTime

def time[A](f: => A) = {
  val s = System.nanoTime
  val ret = f
  println("time: "+(System.nanoTime-s)/1e6+"ms")
  ret
}

time {
  df = sqlContext.sql(query)
  df.show()
}
24赞 Tyrone321 5/11/2018 #4

要在 spark-shell (Scala) 中执行此操作,可以使用 .spark.time()

看到我的另一个回复:https://stackoverflow.com/a/50289329/3397114

df = sqlContext.sql(query)
spark.time(df.show())

输出将为:

+----+----+
|col1|col2|
+----+----+
|val1|val2|
+----+----+
Time taken: xxx ms

相关:关于测量 Apache Spark 工作负载指标以进行性能故障排除

评论

3赞 E B 12/17/2018
我应该将一些东西作为我的 Jupyter 的一部分来执行 Spark.Time..它显示 AttributeError: 'SparkSession' 对象没有属性 'time' (我正在使用 pyspark.. 这仅在 scala 版本中可用吗?
1赞 Tyrone321 12/22/2018
@EB我在 EMR 上使用 Scala。我不知道PySpark有没有time()
4赞 lightsong 4/8/2020
@Tyrone321 它没有。(剧照)
2赞 Sarthak Agrawal 4/12/2022
事实并非如此。(剧照)
-2赞 Mehdi LAMRANI 11/3/2020 #5

对于那些寻找/需要 python 版本
的人(因为 pyspark 谷歌搜索会导致这篇文章):

from time import time
from datetime import timedelta

class T():
    def __enter__(self):
        self.start = time()
    def __exit__(self, type, value, traceback):
        self.end = time()
        elapsed = self.end - self.start
        print(str(timedelta(seconds=elapsed)))

用法:

with T():
    //spark code goes here

灵感来自:https://blog.usejournal.com/how-to-create-your-own-timing-context-manager-in-python-a0e944b48cf8

在使用控制台或笔记本电脑时被证明很有用 (Jupyter magic %%time 和 %timeit 仅限于单元格范围,这在跨笔记本上下文共享对象时很不方便)

1赞 Amir Charkhi 3/14/2022 #6

如果您使用的是 spark-shell (scala),则可以使用以下模块:time

import time
df = sqlContext.sql(query)
spark.time(df.show())

但是,在 中不可用。对于 ,一个简单的解决方案是使用:SparkSession.time()pysparkpythontime

import time
start_time = time.time()
df.show()
print(f"Execution time: {time.time() - start_time}")
0赞 Guy 4/4/2022 #7

还可以尝试使用 sparkMeasure,它简化了性能指标的收集

评论

0赞 Andrew Halil 4/6/2022
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。- 来自评论