Java 如何知道作业的哪个阶段当前正在Apache Spark中运行?
考虑到我在Spark有如下工作: CSV文件==>按列过滤=>采样=>另存为JSON 现在我的要求是如何知道作业的哪个步骤(获取文件、过滤或采样)当前正在以编程方式执行(最好使用JavaAPI)?有什么办法吗 我可以使用SparkListener类跟踪工作、阶段和任务。它可以像跟踪阶段Id一样完成。但是如何知道哪个阶段Id是作业链中的哪个步骤 < >当我想通过一个列<强> > <强>筛选器时,我想发送一个通知给用户。为此,我创建了一个扩展SparkListener类的类。但我无法从哪里找到当前正在执行的转换名称。有可能追踪吗Java 如何知道作业的哪个阶段当前正在Apache Spark中运行?,java,scala,apache-spark,bigdata,Java,Scala,Apache Spark,Bigdata,考虑到我在Spark有如下工作: CSV文件==>按列过滤=>采样=>另存为JSON 现在我的要求是如何知道作业的哪个步骤(获取文件、过滤或采样)当前正在以编程方式执行(最好使用JavaAPI)?有什么办法吗 我可以使用SparkListener类跟踪工作、阶段和任务。它可以像跟踪阶段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()
}
}
你考虑过这个选择吗?
您似乎可以使用以下rest api获取特定的作业状态/应用程序/[app id]/jobs/[job id] 您可以设置JobGroupId和JobGroupDescription,以便跟踪正在处理的作业组。i、 e 假设您将JobGroupId称为“测试” 你什么时候给警察打电话 您将获得一个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
}
{
“jobId”:3,
“姓名”:“计数:25”,
“说明”:“测试作业”,
“提交时间”:“2017-02-22T05:52:03.145GMT”,
“完工时间”:“2017-02-22T05:52:13.429GMT”,
“stageIds”:[3],
“作业组”:“1”,
“状态”:“成功”,
“numTasks”:4,
“numActiveTasks”:0,
“numCompletedTasks”:4,
“numSkippedTasks”:0,
“numFailedTasks”:0,
“NumactiveEstates”:0,
“numCompletedStages”:1,
“numSkippedStages”:0,
“numFailedStages”:0
}
您无法准确知道过滤器操作的开始或结束时间
这是因为您有转换(filter
,map
,…)和操作(count
,foreach
,…)。Spark将把尽可能多的操作放在一个阶段中。然后,该阶段在输入的不同分区上并行执行。问题来了
假设您有几个工人和以下程序
LOAD==>MAP==>FILTER==>groupby+聚合
此程序可能有两个阶段:第一阶段将加载文件并应用映射
和过滤器
。
然后输出将被洗牌以创建组。在第二阶段,将执行聚合
现在的问题是,您有几个工人,每个工人将并行处理一部分输入数据。也就是说,集群中的每个执行者都将收到您的程序(当前阶段)的副本,并在分配的分区上执行
您将看到,map
和filter
运算符的多个实例并行执行,但不一定同时执行。在极端情况下,辅助工1将在辅助工20开始之前完成阶段1(因此,在辅助工20之前完成其过滤器
操作)
对于RDDs,Spark在后台使用。但是,对于最新Spark版本的数据集,它们在分区上创建一个循环并执行转换。这意味着在这种情况下,Spark本身并不真正知道转换操作符何时完成单个任务
长话短说:
mapPartition
操作符,这些操作符将把分区ID和当前时间发送给一个服务器,服务器将评估消息。然而,这种解决方案也有其局限性。。。我还没有完全满意
但是,,除非您能够修改程序,否则恐怕您无法实现您想要的功能。要关闭的注释似乎不合适:这当然是一个与编程相关的问题,而且在广度/范围上也似乎合理。我没有尝试,因为在Spark Java API中有一个函数可以复制REST API的每个端点。我在JavaAPI中尝试了所有这些函数。你能告诉我你认为RESTAPI的哪一个端点可以解决这个问题吗?然后我可以从JavaAPI在这里发布该端点的输出。但我如何理解“jobId”:3是哪一步的“FilterByColumn”或“takingSample”?为什么不能使用jobGroup或JobDescription?这里的名称是“count at:25”,这是一个火花动作。在我的示例中,我还得到了“另存为JSON”。但我未能获得转换名称。关于作业组,基本上是一组作业,我需要一个特定的转换名称,而不是整个作业数据。无论如何,如果可能的话,只要以我的示例为例显示一个json数据,其中显示“name”:“filter”。这就是我想要的。
{
"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
}