多处理RDD列表

时间:2016-07-14 09:36:25

标签: python apache-spark pyspark list-comprehension

我正在尝试多进程 RDD的列表,如下所示

from pyspark.context import SparkContext
from multiprocessing import Pool



def square(rdd_list):
    def _square(i):
        return i*i
    return rdd_list.map(_square)

sc = SparkContext('local', 'Data_Split')
data = sc.parallelize([1,2,3,4,5,6])

dataCollection = [data, data, data]

p = Pool(processes=2)
result = p.map(square, dataCollection)
print result[0].collect()

我期待输出中的RDD列表,每个元素包含来自 data 的平方元素。

但是运行代码会导致以下错误:

  

例外:您似乎正在尝试广播RDD或   引用动作或转换中的RDD。 RDD转换   并且操作只能由驱动程序调用,而不能在其他内部调用   变换;例如,rdd1.map(lambda x:rdd2.values.coun \ t()   * x)无效,因为无法在rdd1.map转换中执行值转换和计数操作。更多   信息,请参阅SPARK-5063。

我的问题是: -

1)为什么代码不按预期工作?我该如何解决这个问题?

2)如果我使用 p.map (池)而不是简单的地图在我的RDD列表上。

1 个答案:

答案 0 :(得分:2)

这是因为当您使用多进程时,必须先将RDD序列化/ pickle,然后再发送到其他进程。每当尝试序列化RDD时,Spark都会执行检查,并抛出该错误。