将SparkContext传递给新进程(python多处理模块)

将SparkContext传递给新进程(python多处理模块),python,apache-spark,timeout,pyspark,python-multiprocessing,Python,Apache Spark,Timeout,Pyspark,Python Multiprocessing,我正在使用Python/Spark运行一系列不同的作业,一次一个。为了避免每次创建SparkContex都需要一段时间,我想将上下文作为参数发送到每个作业。除此之外,我希望管理器(创建上下文并运行作业的代码)具有超时机制 我在第一次运行作业时出现了一个奇怪的错误,之后该错误消失。 Traceback (most recent call last): File "/usr/lib/python3.4/multiprocessing/process.py", line 254, in _bootst

我正在使用Python/Spark运行一系列不同的作业,一次一个。为了避免每次创建SparkContex都需要一段时间,我想将上下文作为参数发送到每个作业。除此之外,我希望管理器(创建上下文并运行作业的代码)具有超时机制

我在第一次运行作业时出现了一个奇怪的错误,之后该错误消失。

Traceback (most recent call last):
File "/usr/lib/python3.4/multiprocessing/process.py", line 254, in _bootstrap
    self.run()
  File "/usr/lib/python3.4/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/dev/ComponentEngine/components/ExampleComponent/ExampleComponent.py", line 35, in run
    numbers = sparkContext.parallelize([1,2,3,4,5,6,7,8,9,10])
  File "/home/dev/Programs/spark-1.4.1-bin-hadoop2.6/python/pyspark/context.py", line 395, in parallelize
    readRDDFromFile = self._jvm.PythonRDD.readRDDFromFile
  File "/home/dev/Programs/spark-1.4.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 772, in __getattr__
    raise Py4JError('{0} does not exist in the JVM'.format(name))
py4j.protocol.Py4JError: PythonRDD does not exist in the JVM
代码:

#!/bin/python3
import multiprocessing
from pyspark import SparkContext

def doJob(sc):
    try:
        sc.parallelize([1,2,3,4,5,6,7,8,9,10])
    except Exception as e:
        print('Got excpetion {}'.format(e))

def runWithTimeout(sc):
    p = multiprocessing.Process(target=doJob, name="runWithTimeout", args=(sc))
    p.start()

    # Wait till the timeout
    p.join(10)

    if p.is_alive():
        p.terminate()
        p.join()


if __name__ == '__main__':
    sc = SparkContext()
    for i in range(3):
        runWithTimeout(sc)
为什么会出现此错误?
这样传递SparkContext有什么问题吗?我知道它会被序列化并被另一端的进程使用,如果作业对上下文执行任何更改,引擎的副本将不会受到影响

是否有任何此类变更会干扰其他作业的运行

序列化Spark上下文在任何受支持的语言中都无法正常工作。通常,所做的工作与IBM Spark内核或ooyola jobserver类似,其中一个进程*保存Spark上下文,多个客户端与服务器对话。在python中,Spark上下文包括用于与JVM SparkContext通信的网络套接字,而网络套接字并不是真正的可序列化对象。看看py4j(Spark用来在python和JVM之间通信的库),多线程可以工作,因为它们可以共享套接字,但多个进程并不多。

centralspark服务器听起来不错,但仍然存在如何创建超时机制的问题。我找到了这篇文章,所以我得出结论,最好使用进程而不是线程。我做了一些测试,如果我在父进程中打开一个文件/套接字并将其传递给子进程,它仍然可以写入。除了我帖子中的错误外,下一个“doJob”可以使用从父进程传递给它的上下文正常工作。因此,如果上下文对象中的套接字正常,就不会有任何问题了?