【问题标题】:Is there a "hook" for the end of a stage/task in spark?spark中的阶段/任务结束时是否有“钩子”?
【发布时间】:2017-04-03 15:37:42
【问题描述】:

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

  • 在 UDF 的开头,我检查运行时是否在本地特定路径下可用,例如tmp-目录
  • 如果尚未安装运行时,我会从 HDFS 获取它并安装在 tmp 中。这仅在 UDF 首次在特定执行程序上调用时执行。

上面的脚本运行良好,但是我安装的运行时在整个集群中都留下了,所以我想在之后删除它们。

似乎没有办法为执行程序添加关闭钩子(Spark worker shutdown - how to free shared resources),是否还有另一个“钩子”,例如任务结束挂钩?

【问题讨论】:

  • 我会尝试使用 JobProgressListener.onJobEnd()/onTaskEnd():spark.apache.org/docs/latest/api/scala/…(它似乎与 spark UI 有关,因此不确定它是否适用于您的情况)
  • 只是检查,但您是否尝试过使用 spark-submit 中的 --files 选项部署运行时?对于这类事情,这是显而易见的选择。
  • @RobertoCongiu 是的,只是为了提交这个很明显,但我的运行时需要“安装”才能执行 bash-commands...
  • @asettouf 这听起来很有希望,我会调查一下

标签: scala hadoop apache-spark


【解决方案1】:

正如我所提到的,你可以听一个任务的结束(我现在刚刚有时间尝试它),至少在火花上下文的全局层面上使用类似的东西(我会在 scala 中写一些东西)稍后,因为我目前无法运行 scala 代码):

//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);
        }
    });

还有很多其他的听众,见SparkListener

【讨论】:

  • 我试过了,问题是这段代码是在驱动程序上执行的,而不是在执行程序上执行的……所以对我没用。
  • @RaphaelRoth 你不能用onApplicationEnd监听器清理你的资源吗?
  • onApplicationEnd 是否在执行器中运行?
猜你喜欢
  • 2019-12-04
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2018-07-16
  • 2012-03-20
相关资源
最近更新 更多