Spark应用Executor启停时间与数量获取及日志与GUI差异咨询
问题解答
一、Event Log和History Server GUI数据不一致的原因
- History Server的Executors标签页默认只展示当前存活或最后活跃的Executor,而event-log会记录所有曾经创建过的Executor——包括那些因为资源回收、故障重启、任务完成后被释放的临时Executor,所以ID数量会比GUI里多很多。
- 运行时长的差异是因为统计维度不同:GUI里的
Task Time (GC Time)是该Executor上所有任务的累计执行时间(包含GC耗时),而event-log里记录的是Executor从创建到销毁的实际生命周期时长,两者数值自然不一样。
二、截图时间的判定
- 2022年12月13日周二下午2:49:24.444:如果这个时间对应event-log里的
SparkListenerExecutorAdded事件,或者是GUI中Executor行的起始时间,那就是Executor的创建时间。 - 2022年12月13日周二下午2:52:04.811:如果对应event-log里的
SparkListenerExecutorRemoved事件,或者是GUI中Executor行的结束时间,那就是Executor的终止时间。
三、Executor ID 10没在GUI显示的原因
- 这个Executor大概率是创建后很快就被销毁了——比如集群资源不足被回收、启动失败、只执行了少量任务就被释放,History Server GUI默认不会展示这类短生命周期的Executor,只会保留活跃时间较长或者最后存在的Executor记录,但它的完整信息会保存在event-log里。
四、获取Executor启停时间与数量的方法
1. 直接解析Event Log
event-log是最权威的数据源,包含所有Executor的全生命周期事件:
- 查找
SparkListenerExecutorAdded事件:里面有Executor ID、创建时间(timestamp字段)、节点信息等。 - 查找
SparkListenerExecutorRemoved事件:里面有Executor ID、终止时间(timestamp字段)、移除原因。 - 统计所有
SparkListenerExecutorAdded事件的数量,就是总共启动过的Executor数量。 - 你可以用Spark自带的History Server工具,或者自己写个简单的JSON脚本解析(event-log是逐行的JSON格式)。
2. Spark History Server REST API
用REST API能拿到结构化的Executor数据,比GUI更完整:
- 请求地址:
GET http://<history-server-host>:<port>/api/v1/applications/<app-id>/executors - 返回的每个Executor对象包含:
id:Executor IDstartTime:创建时间戳endTime:终止时间戳(如果没销毁就是0)removedReason:移除原因
- 数返回列表的长度就是Executor总数,但要注意:部分Spark版本的API可能还是会过滤短生命周期的Executor,要是需要所有数据,优先解析event-log。
3. 实时获取(应用运行中)
如果应用还在跑,直接调用Driver的REST API:GET http://<driver-host>:<port>/api/v1/applications/<app-id>/executors,能拿到实时的Executor状态和时间信息。
内容的提问来源于stack exchange,提问作者Energizer1
相关产品推荐
相关产品推荐

