無論Flink還是Spark都支持自建集群(standalone cluster)。但是為了保證穩(wěn)定性和資源隔離等,生產(chǎn)環(huán)境里的任務(wù)最好借助資源管理框架(如Yarn)運行。任務(wù)運行在yarn上,查詢?nèi)罩揪涂赡懿皇呛芊奖?,尤其是任?wù)進程異常退出之后。
JobHistoryServer
yarn容器退出之后,默認是不保存日志的。所以需要開啟JobHistoryServer,具體方法網(wǎng)上有很多教程。
查看運行中Flink任務(wù)的Log
運行中的Flink任務(wù)可以直接通過flink web ui查看:


查看已退出Flink任務(wù)的Log
對于已經(jīng)結(jié)束的yarn應(yīng)用,flink進程已經(jīng)退出無法提供webui服務(wù)。所以需要通過JobHistoryServer查看保留在yarn上的日志。
1.進入目標應(yīng)用后,可以通過logs查看日志

2.點擊logs進入,可以看到j(luò)ob manager的日志

3.task manager日志在哪里?
好像沒有task manager的日志啊,怎么辦?我們可以先研究一下job manager的日志url:http://node5:19888/jobhistory/logs//node2:8041/container_1634207619484_0505_01_000001/container_1634207619484_0505_01_000001/root,可以發(fā)現(xiàn)一些規(guī)律:
-
http://node5:19888/jobhistory/logs/:第一部分是jobhistoryserver的地址 -
/node2:8041:第二部分是job manager的當時運行的宿主yarn node -
/container_1634207619484_0505_01_000001/container_1634207619484_0505_01_000001:第三部分是yarn容器id -
/root:第四部分是提交任務(wù)的用戶名

所以我們只需要知道taskmanager的容器名和node就能找到它的日志了。flink在jobmanager的日志中記錄了詳細的相關(guān)信息,包括所有的taskmanager的容器名和node。日志太多可能不好找,這里有一個小技巧:利用appid去搜索日志,比如本文中的例子,可以搜索1634207619484_0505

Registering TaskManager with ResourceID container_1634207619484_0505_01_000002 (akka.tcp://flink@node1:37798/user/taskmanager_0)
分析這行日志: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

總結(jié)
運行中的flink/spark的日志查看非常容易,因為它們本身都提供了web ui服務(wù)。但是當任務(wù)異常退出之后,flink/spark進程的結(jié)束導(dǎo)致無法提供web ui服務(wù)。我們利用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是兩個同樣的容器名,這是為什么?希望知道的小伙伴能留言解惑一下。
相關(guān)鏈接:
Flink On Yarn如何查看任務(wù)日志
Spark On Yarn如何查看任務(wù)日志