You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何查询Spark集群中Task/Executor执行的具体工作内容

好问题!Spark确实给咱们提供了几种靠谱的方法,能把Task ID和它干的具体活儿(对应的RDD或者操作)关联起来,下面给你拆解几个实用的路子:

1. 用Spark UI快速定位(最直观)

  • 先打开Spark UI(默认端口4040,如果是YARN集群,也可以通过YARN ResourceManager的UI找到对应Application的Spark UI链接)。
  • 找到你的目标Application(就是你命令里的application_1549756402460_92964),进入后切换到Stages页面。
  • 在Stages列表里,找到对应Executor(ID 11)所在的Stage(不管是Running还是Completed的Stage都能查看)。点击Stage的ID进入详情页,就能看到该Stage下所有Task的列表。
  • 找到你要查的Task ID,点击它进入Task详情页:
    • Task Details部分会显示这个Task负责处理的是哪个RDD的分区,以及该RDD对应的转换操作链(比如mapfilterreduceByKey这些操作的描述)。
    • Task Metrics里还能看到输入数据的来源,帮你进一步确认对应的业务逻辑。

2. 查看Executor容器的日志(离线排查必备)

你已经找到了容器的日志路径:/mnt/yarn-logs/userlogs/application_1549756402460_92964/container_1549756402460_92964_01_000012,直接查看stdoutstderr日志:

  • 搜索你的Task ID,或者找类似Starting task [TID X]的日志条目,里面会明确标注这个Task属于哪个Stage ID。
  • 接着搜索这个Stage ID的相关日志,就能找到该Stage对应的RDD和操作描述,比如日志里可能会出现Stage X is processing RDD Y created by [操作名称] at [代码位置]这类信息。
  • 要是你的Spark日志级别是INFO(默认就是),这些信息已经足够关联到具体的RDD和操作;如果需要更细的细节,可以临时调整日志级别到DEBUG,但注意别在生产环境一直开着,避免日志量爆炸。

3. 编程方式获取(自定义监控或脚本排查)

如果需要在代码里自动关联Task和对应的操作,可以用Spark的状态追踪API:

  • 通过SparkSession或者SparkContext获取StatusTracker
    val statusTracker = spark.sparkContext.statusTracker()
    
  • 先通过Task ID找到对应的Stage ID(可以遍历所有Stage的Task信息),然后用getStageInfo(stageId)获取Stage的详细信息:
    val stageInfo = statusTracker.getStageInfo(stageId)
    println(s"Stage ${stageInfo.stageId}对应的RDD描述:${stageInfo.name}")
    
  • 另外,也可以注册SparkListener来监听Task启动事件,在onTaskStart方法里获取TaskInfo和对应的Stage信息,实时关联Task和操作:
    val listener = new SparkListener() {
      override def onTaskStart(taskStart: SparkListenerTaskStart): Unit = {
        val taskId = taskStart.taskInfo.taskId
        val stageId = taskStart.stageId
        val stageInfo = statusTracker.getStageInfo(stageId)
        println(s"Task $taskId 属于Stage $stageId,处理的是:${stageInfo.name}")
      }
    }
    spark.sparkContext.addSparkListener(listener)
    

总的来说,Spark UI是最省心的方式,不用折腾命令行;日志适合Task已经执行完或者UI不可用的场景;编程方式则适合需要自定义监控或者批量排查的需求。

内容的提问来源于stack exchange,提问作者Joe C

火山引擎 最新活动