繁体   English   中英

如何知道Apache Spark中当前正在运行的作业的哪个阶段?

[英]How to know which stage of a job is currently running in Apache Spark?

考虑一下我在Spark有一份工作;

CSV文件 ==> 按列过滤 ==> 取样 ==> 另存为JSON

现在我的要求是如何知道作业当前正在以编程方式执行哪个步骤( 获取文件过滤采样 )(最好使用Java API)? 这有什么办法吗?

我可以使用SparkListener类跟踪Job,Stage和Task。 它可以像跟踪阶段ID一样完成。 但是如何知道哪个阶段Id适用于工作链中的哪一步。

考虑按列过滤完成后,我想向用户发送通知。 为此,我创建了一个扩展SparkListener类的类。 但我无法从中找到当前正在执行的转换名称的名称。 有可能跟踪吗?

public class ProgressListener extends SparkListener{

  @Override
  public void onJobStart(SparkListenerJobStart jobStart)
  {

  }

  @Override
  public void onStageSubmitted(SparkListenerStageSubmitted stageSubmitted)
  {
      //System.out.println("Stage Name : "+stageSubmitted.stageInfo().getStatusString()); giving action name only
  }

  @Override
  public void onTaskStart(SparkListenerTaskStart taskStart)
  {
      //no such method like taskStart.name()
  }
}

您无法准确知道何时,例如,过滤器操作开始或结束。

那是因为你有转换( filtermap ,...)和动作( countforeach ,......)。 Spark会将尽可能多的操作放入一个阶段。 然后在输入的不同分区上并行执行阶段。 这就是问题所在。

假设你有几个工人和以下程序

LOAD ==> MAP ==> FILTER ==> GROUP BY + Aggregation

该程序可能有两个阶段:第一阶段将加载文件并应用mapfilter 然后输出将被洗牌以创建组。 在第二阶段,将执行聚合。

现在,问题是,你有几个工人,每个工人将并行处理一部分输入数据。 也就是说,群集中的每个执行程序都将收到程序的副本(当前阶段)并在指定的分区上执行此操作。

您会看到,您将拥有多个并行执行的mapfilter运算符实例,但不一定同时执行。 在极端情况下,工人1将在工人20完全开始之前完成阶段1(因此在工人20之前完成其filter操作)。

对于RDD,Spark在阶段内使用迭代器模型 但是,对于最新Spark版本中的数据集,它们会在分区上创建一个循环并执行转换。 这意味着在这种情况下,Spark本身并不真正知道转换运算符何时完成单个任务!

长话短说:

  1. 您无法知道舞台内的操作何时完成
  2. 即使你可以,也会有多个实例在不同时间完成。

所以,现在我已经遇到了同样的问题:

在我们的Piglet项目中 (请允许一些adverstisement ;-))我们从Pig Latin脚本生成Spark代码并想要分析脚本。 我最终在所有用户操作员之间插入mapPartition操作符,这些操作员将分区ID和当前时间发送到将评估消息的服务器。 但是,这个解决方案也有其局限性......我还没有完全满意。

但是,除非你能够修改程序,否则你恐怕无法实现你想要的。

你有没有考虑过这个选项: http//spark.apache.org/docs/latest/monitoring.html
看来你可以使用下面的rest api来获得某个工作状态/ applications / [app-id] / jobs / [job-id]

您可以设置JobGroupId和JobGroupDescription,以便跟踪正在处理的作业组。 setJobGroup

假设您将调用JobGroupId“test”

sc.setJobGroup("1", "Test job")

当你打电话给http:// localhost:4040 / api / v1 / applications / [app-id] / jobs / [job-id]

您将获得一个带有该作业描述性名称的json:

{
  "jobId" : 3,
  "name" : "count at <console>:25",
  "description" : "Test Job",
  "submissionTime" : "2017-02-22T05:52:03.145GMT",
  "completionTime" : "2017-02-22T05:52:13.429GMT",
  "stageIds" : [ 3 ],
  "jobGroup" : "1",
  "status" : "SUCCEEDED",
  "numTasks" : 4,
  "numActiveTasks" : 0,
  "numCompletedTasks" : 4,
  "numSkippedTasks" : 0,
  "numFailedTasks" : 0,
  "numActiveStages" : 0,
  "numCompletedStages" : 1,
  "numSkippedStages" : 0,
  "numFailedStages" : 0
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM