我正在尝试多进程 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列表上。
答案 0 :(得分:2)
这是因为当您使用多进程时,必须先将RDD序列化/ pickle,然后再发送到其他进程。每当尝试序列化RDD时,Spark都会执行检查,并抛出该错误。