在Flink中将subtask_id映射到TaskManager

时间:2019-05-09 00:59:54

标签: apache-flink flink-streaming

我有一个并行度为256的运算符,在128个任务管理器上运行。每当我遇到检查点失败时,它都会在此运算符的同一子任务上发生,例如,总是有子任务129卡住并阻止了检查点。我想通过检查运行子任务129的任务管理器的日志来了解此子任务发生了什么。 Flink中是否可以将子任务ID映射到相应的任务管理器?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我能够找到一个琐碎但可行的解决方案,以编程方式在运行时获取所需的地图。

主要思想是其余端点/jobs/:jobid/vertices/:vertexid以格式提供特定顶点的必要信息

{
  "id": "804e...",
  "name": "Map -> Sink",
  ...
  "subtasks": [
    {
      "subtask": 0,
      "host": "ip-10-xx-yy-zz:36ddd"
    },
    ...
   ]
}

主要困难在于以编程方式获取Web界面的url。我能够通过这种方式获得它(可能有一个更优雅的解决方案):

val env = FieldUtils
      .readField(getRuntimeContext.asInstanceOf[StreamingRuntimeContext], "taskEnvironment", true)
      .asInstanceOf[RuntimeEnvironment]

    try {
      println("trying to get cluster client...")
      val client = new RestClusterClient[String](env.getTaskManagerInfo.getConfiguration, "rest")
      return client.getWebInterfaceURL

    } catch {
      case e: Exception =>
        println("Failed to get cluster client : ")
        e.printStackTrace()
    }

鉴于Web界面的网址,我只是对其进行了http调用并构建了地图。