【发布时间】: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