[英]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()
}
}
您无法准确知道何时,例如,过滤器操作开始或结束。
那是因为你有转换( filter
, map
,...)和动作( count
, foreach
,......)。 Spark会将尽可能多的操作放入一个阶段。 然后在输入的不同分区上并行执行阶段。 这就是问题所在。
假设你有几个工人和以下程序
LOAD ==> MAP ==> FILTER ==> GROUP BY + Aggregation
该程序可能有两个阶段:第一阶段将加载文件并应用map
和filter
。 然后输出将被洗牌以创建组。 在第二阶段,将执行聚合。
现在,问题是,你有几个工人,每个工人将并行处理一部分输入数据。 也就是说,群集中的每个执行程序都将收到程序的副本(当前阶段)并在指定的分区上执行此操作。
您会看到,您将拥有多个并行执行的map
和filter
运算符实例,但不一定同时执行。 在极端情况下,工人1将在工人20完全开始之前完成阶段1(因此在工人20之前完成其filter
操作)。
对于RDD,Spark在阶段内使用迭代器模型 。 但是,对于最新Spark版本中的数据集,它们会在分区上创建一个循环并执行转换。 这意味着在这种情况下,Spark本身并不真正知道转换运算符何时完成单个任务!
长话短说:
所以,现在我已经遇到了同样的问题:
在我们的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.