Scala 是否有一个“问题”;钩;对于spark中的阶段/任务的结束?

Scala 是否有一个“问题”;钩;对于spark中的阶段/任务的结束?,scala,hadoop,apache-spark,Scala,Hadoop,Apache Spark,我有一个Spark UDF,它需要在执行器的本地磁盘上安装一个特定的文件(在我的例子中是MATLAB运行时)(我们使用的是纱线)。由于我不能直接访问executor机器,因此我必须找到另一种方法在集群上部署我的运行时。 由于文件非常大,我无法在每次调用UDF时安装/删除它,因此我考虑了以下策略: 在UDF的开头,我检查运行时是否在特定路径下本地可用,例如tmp-目录 如果运行时尚未安装,我将从HDFS获取它并安装在tmp中。这仅在第一次对特定执行者调用UDF时完成 上面的screnario工

我有一个Spark UDF,它需要在执行器的本地磁盘上安装一个特定的文件(在我的例子中是MATLAB运行时)(我们使用的是纱线)。由于我不能直接访问executor机器,因此我必须找到另一种方法在集群上部署我的运行时。 由于文件非常大,我无法在每次调用UDF时安装/删除它,因此我考虑了以下策略:

  • 在UDF的开头,我检查运行时是否在特定路径下本地可用,例如
    tmp
    -目录
  • 如果运行时尚未安装,我将从HDFS获取它并安装在
    tmp
    中。这仅在第一次对特定执行者调用UDF时完成
上面的screnario工作正常,但将我安装的运行时留在整个集群中,因此我想在以后删除它们


似乎没有办法为executors()添加关闭钩子,是否还有另一个“钩子”,例如任务结束钩子?

正如我所提到的,您可以监听任务结束(我现在刚刚有时间尝试),至少在spark上下文的全局级别上是这样的(稍后我将用scala编写一些东西,因为我目前无法运行scala代码):


还有很多其他侦听器,请参见我提到的,您可以侦听任务的结束(我现在刚刚有时间尝试),至少在spark上下文的全局级别上,可以使用类似的内容(我稍后将在scala中编写一些内容,因为我目前无法运行scala代码):


还有很多其他侦听器,请参见

我会尝试使用JobProgressListener.onJobEnd()/onTaskEnd():(它似乎与spark UI相关,因此不确定它是否适用于您的情况)只是检查一下,但是您是否尝试过使用spark submit中的--files选项部署运行时?这是这类事情的明显选择。@RobertoCongiu是的,仅提交此选项是显而易见的,但我的运行时需要“安装”正在执行bash命令…@asettouf这听起来很有希望,我将研究我是否会尝试使用JobProgressListener.onJobEnd()/onTaskEnd():(它似乎与spark UI相关,因此不确定它是否适用于您的情况)只是检查一下,但是您是否尝试过使用spark submit中的--files选项部署运行时?这是这类事情的明显选择。@RobertoCongiu是的,仅提交此选项是显而易见的,但我的运行时需要“安装”正在执行bash命令…@asettouf这听起来很有希望,我会调查一下,我试过这个,问题是这个代码是在驱动程序上执行的,而不是在执行器上执行的……因此它对我没有用。@RaphaelRoth,你不能用应用程序和监听器上的
清理你的资源吗?我试过了,问题是这个代码是在驱动程序上执行的,而不是在执行器上执行的……因此它对我没有用。@RaphaelRoth,你不能用应用程序的
侦听器清理你的资源吗?
//sc is the SparkContext
sc.addSparkListener(new SparkListener() {

        @Override
        public void onTaskEnd(SparkListenerTaskEnd taskEnd) {
            // TODO Auto-generated method stub
            System.out.println("Task ended: " + taskEnd);
            super.onTaskEnd(taskEnd);
        }
    });