在Sp中调用外部matlab函数

2024-05-14 13:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在运行.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在

^{pr2}$

提交spark

    #!/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文件,但是Spark不识别sparktest.m。 我不知道怎么继续下去。谁能给我一些建议吗?火花允许这样吗?或者其他分布式python框架有什么建议吗?在

谢谢


Tags: 数据path函数runpyimport目的节点
3条回答

谢谢你回答我的问题。我用不同的方法来解决这个问题。我上传了matlab需要调用的文件和数据,并加载到了节点文件系统的一个路径上。python只需添加路径并使用matlab.引擎模块。 所以我的调用Matlab.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

首先,我不认为有任何理由放弃sparktest.m。 其次,推荐的方法是将它们放入.zip文件中。根据文档:

For Python, you can use the py-files argument of spark-submit to add .py, .zip or .egg files to be distributed with your application. If you depend on multiple Python files we recommend packaging them into a .zip or .egg.

最后,请记住,您的函数将在远程m/c中的executor jvm中执行,因此Spark framework会将函数、闭包和附加文件作为作业的一部分。希望有帮助。在

添加

 files 

斯巴克斯特之前的选择。在

它告诉Spark将sparktest.m文件发送给所有工人。在

相关问题 更多 >

    热门问题