Apache flink 将子任务id映射到Flink中的TaskManager

Apache flink 将子任务id映射到Flink中的TaskManager,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个并行度为256的操作符,在128个任务管理器上运行。每次检查点失败时,它都发生在该操作符的同一个子任务上,例如,总是子任务129卡住并阻塞检查点。我想通过检查运行子任务129的任务管理器的日志来了解这个子任务发生了什么。Flink中是否有办法将子任务id映射到相应的任务管理器?taskmanager.log文件包含已部署任务的名称,包括其子任务索引。您只需在所有taskmanager.log文件中搜索TASK\u名称(129/256)。我能够找到一个非常简单但有效的解决方案,以编程方式在

我有一个并行度为256的操作符,在128个任务管理器上运行。每次检查点失败时,它都发生在该操作符的同一个子任务上,例如,总是子任务129卡住并阻塞检查点。我想通过检查运行子任务129的任务管理器的日志来了解这个子任务发生了什么。Flink中是否有办法将子任务id映射到相应的任务管理器?

taskmanager.log文件包含已部署任务的名称,包括其子任务索引。您只需在所有
taskmanager.log
文件中搜索
TASK\u名称(129/256)

我能够找到一个非常简单但有效的解决方案,以编程方式在运行时获得所需的映射

其主要思想是,Rest端点为格式中的特定顶点提供必要的信息

{
“id”:“804e…”,
“名称”:“地图->接收器”,
...
“子任务”:[
{
“子任务”:0,
“主机”:“ip-10-xx-yy-zz:36ddd”
},
...
]
}
主要的困难是以编程方式获取web界面url。我可以这样得到它(可能有一个更优雅的解决方案):

val env=FieldUtils
.readField(getRuntimeContext.asInstanceOf[StreamingRuntimeContext],“taskEnvironment”,true)
.asInstanceOf[运行时环境]
试一试{
println(“正在尝试获取群集客户端…”)
val client=new RestClusterClient[String](env.getTaskManagerInfo.getConfiguration,“rest”)
return client.getWebInterfaceURL
}抓住{
案例e:例外=>
println(“未能获取群集客户端:”)
e、 printStackTrace()
}

给定web界面url,我只需对其进行http调用并构建地图。

谢谢@TillRohrmann。有没有一种程序化的方法可以找到它。在我的情况下,我将不得不检查所有128个TM日志。如果你使用像logstash这样的中央日志系统,这应该很容易。或者,如果您部署在Thread上,您可以激活日志聚合,这将为您提供所有组件的聚合日志。谢谢。我通过查询特定于Flink的指标找到了一种将子任务id映射到容器id的方法。@YueLiu你能解释一下你是如何实现的吗?@YueLiu。我也在寻找将子任务映射到特定任务管理器的方法。你能解释一下你的方法吗?