在Spark

时间:2015-05-26 03:47:59

标签: python matlab apache-spark

我正在尝试将一些程序分发到我使用Spark构建的本地集群。该项目的目的是将一些数据传递给每个工作者,并将数据传递给外部matlab函数,以处理数据并将数据收集回主节点。我遇到了如何调用matlab函数的问题。 Spark有可能调用外部函数吗?换句话说,我们可以控制Spark中并行化的每个函数来搜索每个节点的本地路径来执行外部函数 这是一个小测试代码:

run.py

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()

sparktest.py

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框架的推荐?

谢谢

3 个答案:

答案 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文件发送给所有工作人员。