我在docker上运行了一个Apache Spark群集(1个主人+ 1个工作人员),我能够使用适合管道的spark-submit
提交作业然后保存(PipelineModel.save(path)).
该文件完全保存在我执行spark-submit
命令的位置本地机器上。
当我想要加载PipelineModel
并将其用于预测时,我尝试部署生产代码时出现问题。我无法传递包含已保存文件的文件夹。
这是我用来提交作业的代码:
spark-submit --class ch.supsi.isteps.Main --master spark://172.17.0.1:7077 --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0 --files=test/aFolder ./STR-0.1-alpha.jar --mode=production --file=test/aFolder
where --mode=production --file=test/aFolder
是我程序的参数
我已尝试使用--files
,但它不接受文件夹。我想避免在所有工作节点中复制模型。
修改
问题与HDFS和Docker有关。作为备份解决方案,我们避免在Docker中使用spark-cluster并在Docker中切换到本地模式。这样可以毫无问题地保存和检索文件。如果您映射文件夹(docker-compose - >卷),您甚至不需要传递文件,因为它们已经映射到您的容器
答案 0 :(得分:1)
我已经尝试使用--files,但它不接受文件夹
<a
href="tel:+xxxxxxxxxx"
>CALL 6514 9729
</a>
有以下方法来添加您可以循环的文件和文件夹中的文件列表并添加它们。
SparkContext
如上所述...... /**
* Add a file to be downloaded with this Spark job on every node.
*
* If a file is added during execution, it will not be available until the next TaskSet starts.
*
* @param path can be either a local file, a file in HDFS (or other Hadoop-supported
* filesystems), or an HTTP, HTTPS or FTP URI. To access the file in Spark jobs,
* use `SparkFiles.get(fileName)` to find its download location.
*/
def addFile(path: String): Unit = {
addFile(path, false)
}
您可以获取文件名
或SparkFiles.get(fileName)
有SparkFiles
来获取您添加文件的文件夹,您可以访问它们。
getRootDirectory
或者
使用/**
* Get the root directory that contains files added through `SparkContext.addFile()`.
*/
def getRootDirectory(): String =
SparkEnv.get.driverTmpDir.getOrElse(".")
}
,您可以将文件列表作为序列。
sparkcontext.listFiles
选项,那么您可以使用相同的方法关注我的回答submitting multiple jars from a folder,您也可以从分隔符分隔的文件夹中添加多个文件。希望这有帮助!