【发布时间】:2016-07-14 09:36:24
【问题描述】:
我正在尝试多处理一个列表的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 (池)而不是简单的 map 在我的 RDD 列表中。
【问题讨论】:
-
您尝试过使用多处理库吗?
-
1) 因为你不处理普通的 Python 状态。使用线程stackoverflow.com/q/38048068/1560062(不,这里 GIL 不是问题)2) 除非您对资源进行微观管理,否则可能不会但没有真实的上下文,这只是猜测。
-
您能否详细说明/提供对“普通 Python 状态”的引用?当您说普通的python状态(特定于问题中的代码)时,您是在谈论“副作用”吗?
-
我的意思是 PySpark“驱动程序”只是 Java 的一个小客户端,而不是一个独立的驱动程序。所以与其说是 Python 对象,不如说是 JVM 和 Py4J 网关。关于线程,只有实现非阻塞提交和并行化一些辅助完成任务。这些不会触及核心处理。
标签: python apache-spark pyspark list-comprehension