对Spark运行时的状态进行监控可以对运行时间较长的大型任务运行过程心中有数,明白时间花费在什么地方,看任务在什么地方发生异常。首先说明Spark的一个application的划分规则。
- job :job是application的组成单位。 A job is triggered by an action, like count() or saveAsTextFile(). Click on a job to see information about the stages of tasks inside it. 一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job.
- stage : stage 是 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。job 根据Spark的shuffle过程来切分 stage,如某stage有2个shuffle过程,它就被切分成3个stage.
- task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一个任务执行单元。“一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。”
对Spark的监控需求,可以按需划分为针对job的监控、针对stage的监控和针对task的监控,Spark UI提供了以下三种监控界面:
- 针对job的监控:一个application里所有的job列表
- 针对stage的监控:一个job里所有的stage列表
- 针对task的监控:一个stage里所有的task列表
每一种监控方式都能展示其每一步消耗的时间,可以通过Event Timeline的方式只管的看时间消耗。针对某一消耗时长异常的步骤进行检查或者调优。
这种监控方式的优点是直观易懂,而且大部分的表格可以用json的形式提供给其他应用,缺点是图形化的工具不易在其他界面上集成。
此外,Spark日志也可以打印Spark的运行状态,节选一个task从启动到结束的日志:
18/07/05 18:18:24 INFO executor.CoarseGrainedExecutorBackend: Got assigned task 1242 18/07/05 18:18:24 INFO executor.Executor: Running task 32.0 in stage 18.0 (TID 1242) 18/07/05 18:18:24 INFO rdd.HadoopRDD: Input split: hdfs://sdg/user/hive/warehouse/transfer.db/mobile_reg_info_mid_orc/part_date=2016-10-31/part-00003-bd8e8e72-7946-45c4-b995-badead467bab.c000:268435456+69819839 18/07/05 18:18:24 INFO orc.OrcRawRecordMerger: min key = {originalTxn: 0, bucket: -1, row: 15099999}, max key = null 18/07/05 18:18:24 INFO orc.ReaderImpl: Reading ORC rows from hdfs://sdg/user/hive/warehouse/transfer.db/mobile_reg_info_mid_orc/part_date=2016-10-31/part-00003-bd8e8e72-7946-45c4-b995-badead467bab.c000 with {include: [true, false, false, false, false, false, false, false], offset: 268435456, length: 9223372036854775807} 18/07/05 18:18:25 INFO executor.Executor: Finished task 32.0 in stage 18.0 (TID 1242). 1510 bytes result sent to driver
这种方式较优点是易于输出、易于在其他工具上集成,缺点是不直观。
对于交互式查询这种场景,需要跑几个例子看看在什么粒度的监控下最能满足开发者和分析师的监控需求。
文章来源: Spark运行状态的监控