火花提交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)
你可以得到文件名
或者SparkFiles
有getRootDirectory
来获取你添加文件的文件夹,你可以访问它们。
/** * Get the root directory that contains files added through `SparkContext.addFile()`. */ def getRootDirectory(): String = SparkEnv.get.driverTmpDir.getOrElse(".") }
要不然
使用sparkcontext.listFiles
你可以得到文件的列表作为序列。
选项2:如果你想继续使用--files
选项,那么你可以按照我的答案从一个文件夹提交多个jar使用相同的方法,你可以添加多个文件从一个文件夹分隔的文件夹以及。
希望这可以帮助!