如何根据 Spark 中的 GMT lanuchTime 获取活动任务的运行时间?
Posted
技术标签:
【中文标题】如何根据 Spark 中的 GMT lanuchTime 获取活动任务的运行时间?【英文标题】:How to get the runTime of an active task according to its GMT lanuchTime in Spark? 【发布时间】:2018-06-03 16:46:42 【问题描述】:我想获得一个活动任务的运行时间。在/applications/[app-id]/stages/[stage-id]
的REST API页面,我可以得到详细的任务信息。
enter image description here
你可以看到,executorRunTime
在一个任务没有完成的时候是0。我想我可以根据launchTime
获得运行时间。假设launchTime
是 2017-12-21T03:15:31.106GMT。我使用以下代码来计算运行时间。
val format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'.'sss'GMT'", Locale.ENGLISH)
format.setTimeZone(TimeZone.getTimeZone("GMT"))
val launchTime = format.parse("2017-12-21T03:15:31.106GMT").getTime
val runTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis -
launchTime
但我得到一个负数。时间格式错了吗?还是什么?
【问题讨论】:
您为什么要使用早已过时且臭名昭著的麻烦SimpleDateFormat
类? java.time
, the modern Java date and time API,使用起来更好。
【参考方案1】:
TL;DR
String launchTimeString = "2017-12-21T03:15:31.106GMT";
launchTimeString = launchTimeString.replaceFirst("GMT$", "Z");
long launchTime = Instant.parse(launchTimeString).toEpochMilli();
long runTime = System.currentTimeMillis() - launchTime;
(对不起,我只能写 Java 8 代码,我得相信你翻译。)
java.time 和 ISO 8601
Java 1.0 和 1.1 中的日期和时间类早已过时,而 SimpleDateFormat
尤其是出了名的麻烦。我建议您停止使用它们并改用现代 Java 日期和时间 API java.time
。使用起来感觉好多了。
您的启动时间字符串有点搞笑。它类似于 ISO 8601 标准格式,在日期和时间之间具有特征 T
,但最后有一个非标准的 GMT
,其中遵循标准的字符串通常有 Z
(或正数或负数)从 UTC 偏移)。由于现代日期和时间类将 ISO 8601 解析为其默认值,也就是说,没有任何显式格式化程序,并且由于编写格式模式字符串似乎是无穷无尽的错误来源(当然不仅仅是你),我发现它很诱人修改你的字符串以符合标准,然后解析它。
你的格式有什么问题?
你格式化模式字符串有两个错误:
您需要大写的HH
表示一天中的某个小时。小写hh
表示上午或下午之间的小时,在 1 到 12 之间。对于SimpleDateFormat
,这个错误通常“只是”意味着 12 的小时被理解为 00(这会给你一个很长的运行时间)(现代的DateTimeFormatter
更急切地告诉你,如果你对那个类尝试同样的方法,你就有一个错误)。
虽然小写ss
是正确的秒,但毫秒是大写SSS
。这一定是你遇到的问题:你的字符串中的 106 被认为是秒而不是毫秒,所以如果在 03:16:46 之前运行你的代码,你会得到一个负的运行时间。
所以这两个错误都归结为:格式模式字符串区分大小写,因此您需要注意正确的大小写。
链接
Oracle tutorial: Date Time,讲解如何使用java.time
。
Wikipedia article on ISO 8601。
【讨论】:
谢谢。首先,我在不同的节点上进行时间校准。 (我使用 4 台机器以纱线集群模式运行 Spark)。然后我使用您提供的代码。现在我想我得到了正确的时间。以上是关于如何根据 Spark 中的 GMT lanuchTime 获取活动任务的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 scala 根据 spark 中的条件获取 row_number()
如何根据 Java Spark 2.1.1 中的字段名称对 structType 进行排序/排序