无论Flink还是Spark都支持自建集群(standalone cluster)。但是为了保证稳定性和资源隔离等,生产环境里的任务最好借助资源管理框架(如Yarn)运行。任务运行在yarn上,查询日志就可能不是很方便,尤其是任务进程异常退出之后。
JobHistoryServer
yarn容器退出之后,默认是不保存日志的。所以需要开启JobHistoryServer,具体方法网上有很多教程。
查看运行中Spark任务的Log
运行中的Spark任务可以直接通过spark web ui查看:
查看已退出Spark任务的Log
对于已经结束的yarn应用,spark进程已经退出也无法提供webui服务。
1.通过应用的logs只能看到driver的日志。
2.executor日志在哪里?
根据Flink On Yarn如何查看任务日志,我们已经知道了日志的url组成方式,这次同理,只要找到容器名
和node
就能访问日志了。
driver的url为:http://node5:19888/jobhistory/logs/node3:8041/container_1634207619484_0496_01_000001/container_1634207619484_0496_01_000001/root/stderr/?start=0
搜索driver的日志,找到容器名container_1634207619484_0496_01_000002
和hostnode3
所以,最终我们得到executor的url为:
http://node5:19888/jobhistory/logs/node3:8041/container_1634207619484_0496_01_000002/container_1634207619484_0496_01_000002/root
总结
运行中的flink/spark的日志查看非常容易,因为它们本身都提供了web ui服务。但是当任务异常退出之后,flink/spark进程的结束导致无法提供web ui服务。我们利用job history server来保留和展示当时的日志。但是yarn的web只展示了flink job manager/spark driver的日志链接,我们需要自己拼接flink task manager/spark executor日志链接。
最后我有一个小疑问:文中介绍的URL组成是推测出来的,其中第三部分/container_1634207619484_0505_01_000001/container_1634207619484_0505_01_000001
是两个同样的容器名,这是为什么?希望知道的小伙伴能留言解惑一下。