如何根据 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 获取活动任务的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设备的位置转换 GMT 时区?

如何根据spark scala中的条件进行累积和

如何使用 scala 根据 spark 中的条件获取 row_number()

如何根据 Java Spark 2.1.1 中的字段名称对 structType 进行排序/排序

如何根据 Spark Scala 中其他数据帧中的多列匹配过滤数据帧

如何使用 JS 将 GMT 日期时间转换为 GMT Unix TimeStamp?