Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道作业的哪个阶段当前正在Apache Spark中运行?_Java_Scala_Apache Spark_Bigdata - Fatal编程技术网

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

Java 如何知道作业的哪个阶段当前正在Apache Spark中运行?,java,scala,apache-spark,bigdata,Java,Scala,Apache Spark,Bigdata,考虑到我在Spark有如下工作: CSV文件==>按列过滤=>采样=>另存为JSON 现在我的要求是如何知道作业的哪个步骤(获取文件、过滤或采样)当前正在以编程方式执行(最好使用JavaAPI)?有什么办法吗 我可以使用SparkListener类跟踪工作、阶段和任务。它可以像跟踪阶段Id一样完成。但是如何知道哪个阶段Id是作业链中的哪个步骤 < >当我想通过一个列 > 筛选器时,我想发送一个通知给用户。为此,我创建了一个扩展SparkListener类的类。但我无法从哪里找到当前正在执行的转换

考虑到我在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本身并不真正知道转换操作符何时完成单个任务

长话短说:

  • 您无法知道后台的操作何时完成
  • 即使可以,也有多个实例将在不同的时间完成
  • 所以,现在我已经有了同样的问题:

    在我们的(请允许一些批评;-)中,我们从Pig拉丁语脚本生成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
    }