如何在分配给工人的Spark集群上执行任意python代码

时间:2019-02-20 17:29:51

标签: python apache-spark

我正在尝试使用火花簇以两个步骤的形式在python中运行仿真:

  1. 执行(在多个工作程序节点上并行执行)一组python函数。这些结果将以文本文件的形式写出

  2. 收集结果。这将使用pyspark数据帧进行。

是否可以指示spark在Spark集群中的工作程序节点上执行python代码(即使用普通python)以实现此第一步? 当我尝试使用spark-submit时,只有Spark上下文中的命令才在Spark集群上执行。其余的python代码在本地计算机上执行,我不想这样做。

这个答案似乎拒绝了:Using regular python code on a Spark cluster,但并不是很明确。

澄清示例

以第1步为例,我有一个名为draw_from_uniform_distribution.py的脚本,其工作原理如下:

import numpy
the_output_file=sys.argv[1] #get output file from command line
the_number=numpy.random.uniform(size=1)
f_out=open(the_output_file,'w')
print(the_number,file=f_out)

我想在Spark集群上并行运行此脚本1000次。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以看看joblib的spark后端是如何完成的 (https://github.com/joblib/joblib-spark

相关代码如下:

from pyspark.sql import SparkSession
from pyspark import cloudpickle
...

spark = SparkSession.build(...)
spark.sparkContext.parallelize([0], 1)\
.map(lambda: cloudpickle.dumps(your_function()))\
.first()

要运行的功能通过pickle进行序列化,并在提供给pyspark的“虚拟” RDD(由一个元素和一个分区组成)上执行spark map()操作。