设置 yarn.log-aggregation-enable 为 true ,默认为 false 。日志聚合是 yarn 提供的日志中央化管理功能,收集每个容器的日志并将这些日志移动到文件系统中,比如 HDFS 上,方便用户查看日志。
yarn.nodemanager.log.retain-seconds: 保存在本地节点的日志的留存时间, 默认值是 10800,单位:秒,即 3 小时。当开启日志聚合功能后,该配置无效。
yarn.nodemanager.delete.debug-delay-sec:默认值为 0,表示在开启日志聚合功能的情况下,应用完成后,进行日志聚合,然后 NodeManager 的 DeletionService 立即删除应用的本地日志。如果想查看应用日志,可以将该属性值设置得足够大(例如,设置为 600 = 10 分钟)以允许查看这些日志。
无论Flink还是Spark都支持自建集群(standalone cluster)。但是为了保证稳定性和资源隔离等,生产环境里的任务最好借助资源管理框架(如Yarn)运行。任务运行在yarn上,查询日志就可能不是很方便,尤其是任务进程异常退出之后。
yarn容器退出之后,默认是不保存日志的。所以需要开启JobHistoryServer,具体方法网上有很多教程。
运行中的Flink任务可以直接通过flink web ui查看:
对于已经结束的yarn应用,flink进程已经退出无法提供webui服务。所以需要通过JobHistoryServer查看保留在yarn上的日志。
好像没有task manager的日志啊,怎么办?我们可以先研究一下job manager的日志url: http://node5:19888/jobhistory/logs//node2:8041/container_1634207619484_0505_01_000001/container_1634207619484_0505_01_000001/root ,可以发现一些规律:
所以我们只需要知道taskmanager的 容器名 和 node 就能找到它的日志了。flink在jobmanager的日志中记录了详细的相关信息,包括所有的taskmanager的 容器名 和 node 。日志太多可能不好找,这里有一个小技巧:利用appid去搜索日志,比如本文中的例子,可以搜索 1634207619484_0505
分析这行日志:taskmanager只有一个,并且它的容器名为 container_1634207619484_0505_01_000002 ,node为 node1 (注意:后面拼接url用的端口号是8041不是37798)
最终我们得的taskmanager日志的url是: http://node5:19888/jobhistory/logs/node1:8041/container_1634207619484_0505_01_000002/container_1634207619484_0505_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 是两个同样的容器名,这是为什么?希望知道的小伙伴能留言解惑一下。
相关链接:
Flink On Yarn如何查看任务日志
Spark On Yarn如何查看任务日志
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)