我正在尝试将一些程序分发到我使用Spark构建的本地集群。该项目的目的是将一些数据传递给每个工作者,并将数据传递给外部matlab函数,以处理数据并将数据收集回主节点。我遇到了如何调用matlab函数的问题。 Spark有可能调用外部函数吗?换句话说,我们可以控制Spark中并行化的每个函数来搜索每个节点的本地路径来执行外部函数 这是一个小测试代码:
import sys
from operator import add
from pyspark import SparkContext
import callmatlab
def run(a):
# print '__a'
callmatlab.sparktest()
if __name__ == "__main__":
sc = SparkContext(appName="PythonWordCount")
output = sc.parallelize(range(1,2)).map(run)
print output
sc.stop()
import matlab.engine as eng
import numpy as np
eng = eng.start_matlab()
def sparktest():
print "-----------------------------------------------"
data = eng.sparktest()
print "----the return data:\n", type(data), data
if __name__ == "__main__":
sparktest()
#!/bin/bash
path=/home/zzz/ProgramFiles/spark
$path/bin/spark-submit \
--verbose \
--py-files $path/hpc/callmatlab.py $path/hpc/sparktest.m \
--master local[4] \
$path/hpc/run.py \
README.md
似乎Spark要求所有附加的.py文件显示为--py-files的参数,但Spark不识别sparktest.m。 我不知道如何继续。有人能给我一些建议吗? Spark是否允许这种方式?或者其他分布式python框架的推荐?
谢谢
答案 0 :(得分:1)
感谢您尝试回答我的问题。我用不同的方法来解决这个问题。我上传了需要调用的matlab文件和数据并加载到节点文件系统中的路径。而python只是添加路径并使用matlab.engine模块调用它。 所以我的callmatlab.py变成了
import matlab.engine as eng
import numpy as np
import os
eng = eng.start_matlab()
def sparktest():
print "-----------------------------------------------"
eng.addpath(os.path.join(os.getenv("HOME"), 'zzz/hpc/'),nargout=0)
data = eng.sparktest([12, 1, 2])
print data
答案 1 :(得分:0)
首先,我认为没有任何理由传递sparktest.m。 其次,推荐的方法是将它们放在.zip文件中。来自文档:
对于Python,您可以使用spark-submit的--py-files参数进行添加 .py,.zip或.egg文件将随您的应用程序一起分发。如果 你依赖多个Python文件,我们建议将它们打包成一个 .zip或.egg。
最后,请记住您的函数将在远程m / c中的执行程序jvm中执行,因此Spark框架将函数,闭包和其他文件作为作业的一部分。希望有所帮助。
答案 2 :(得分:0)
添加
--files
sparktest.m之前的选项。
告诉Spark将sparktest.m文件发送给所有工作人员。