火花提交pipe道模型

我有一个在Docker上运行的Apache Spark集群(1 master + 1 worker),我可以使用spark-submit一个适合pipe道的作业,然后保存(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有关。 作为备份解决scheme,我们避免了在Docker中使用spark-cluster并在Docker中切换到本地模式。 这允许保存和检索文件没有问题。 如果您映射文件夹(docker-compose – > volumes),您甚至不需要传递已经映射到您的容器的文件

我已经尝试使用 – 文件,但它不接受文件夹

选项1:

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)你可以得到文件名

或者SparkFilesgetRootDirectory来获取你添加文件的文件夹,你可以访问它们。

 /** * Get the root directory that contains files added through `SparkContext.addFile()`. */ def getRootDirectory(): String = SparkEnv.get.driverTmpDir.getOrElse(".") } 

要不然

使用sparkcontext.listFiles你可以得到文件的列表作为序列。

选项2:如果你想继续使用--files选项,那么你可以按照我的答案从一个文件夹提交多个jar使用相同的方法,你可以添加多个文件从一个文件夹分隔的文件夹以及。

希望这可以帮助!