我知道有一些关于Spark的临时文件like this one的问题,但我找不到一个能回答我问题的问题。
我在独立模式下使用Spark 1.6.0并且我在Windows下运行它,所以当我在每个worker上设置SPARK_LOCAL_DIRS
时,这会提供写入临时文件的信息。尽管如此,我使用snappy
得到了一个奇怪的行为。事实上,无论我尝试过什么,每个执行者都会将snappy的dll副本写入我的C:\Windows
目录(这真的很糟糕)。应该处理Spark中临时文件的代码片段是:
def getConfiguredLocalDirs(conf: SparkConf): Array[String] = {
...
else if (conf.getenv("SPARK_EXECUTOR_DIRS") != null) {
conf.getenv("SPARK_EXECUTOR_DIRS").split(File.pathSeparator)
} else if (conf.getenv("SPARK_LOCAL_DIRS") != null) {
conf.getenv("SPARK_LOCAL_DIRS").split(",")
} ... (stuffs on mesos)
} else {
// In non-Yarn mode (or for the driver in yarn-client mode), we cannot trust the user
// configuration to point to a secure directory. So create a subdirectory with restricted
// permissions under each listed directory.
conf.get("spark.local.dir", System.getProperty("java.io.tmpdir")).split(",")
}
}
我尝试了这些的任意组合,但我总是snappy-1.1.2-*-snappyjava.dll
C:\Windows
(我想我得到了这个,因为这是java.io.tmpdir
)。
有人知道如何设置执行者写下dll的临时目录吗?感谢。
编辑。这确实是由于属性java.io.tmpdir
,我可以更改它:
val opt = "-Djava.io.tmpdir=myPath"
conf.set("spark.executor.extraJavaOptions", opt)
但是,不幸的是,这使得任何机器上的每个执行器都完全相同。
答案 0 :(得分:2)
因此,在Spark 1.6.0独立版,Windows中选择Snappy的dll副本目录似乎缺少实现(或者它的意思可能只是用于那个' d很奇怪,因为事后没有清理......)。它总是使用java.io.tmpdir
作为序列化目录,因此如果想要设置它。它应该在工人方面设置,例如使用选项-Djava.io.tmpdir=myPath
并在驱动程序端启动worker的JVM(与启动应用程序的JVM的worker相同)。