【发布时间】:2021-11-19 08:17:02
【问题描述】:
我有一个 Python 库,我有一个使用 this approach 的 cythonized。在我的所有 Spark 集群节点上,我都安装了 whl 文件,如下所示。
pip install myapi-0.0.1-cp38-cp38-linux_x86_64.whl
当我按如下方式向 Spark 独立提交作业时,代码运行良好。
spark-submit \
--master spark://172.18.0.32:7077 \
test.py
当我使用客户端部署模式通过 YARN 提交作业时,代码也运行良好。
spark-submit \
--master yarn \
--deploy-mode client \
test.py
但是,当我通过 YARN 集群部署模式提交作业时,代码会中断。
spark-submit \
--master yarn \
--deploy-mode cluster \
test.py
特别是,我收到此错误。
pickle.PicklingError: Can't pickle
: 在 myapi 上查找属性 lambda。
代码myapi.utils.Data 没什么特别的,看起来像这样。
class Data:
def __init__(self, rdd):
self.rdd = rdd
def compute(self):
return self.rdd.map(change_it).reduce(lambda a, b: a + b)
def change_it(n):
a = lambda v: v
b = lambda v: v
c = lambda v: v
d = lambda v: v
e = lambda v: v
f = lambda v: a(b(c(d(e(v)))))
return f(n)
few places 讨论了使用 PySpark、pickle、cloudpickle 和 cythonized 模块酸洗(Web 和 SO)嵌套函数的困难。但是,答案似乎不是blanket 的答案,无法解释为什么它在一种情况下有效,而在我上面实验过的其他情况下无效。
任何关于我为什么得到这些观察结果的进一步解释将不胜感激。
我使用 Spark 的环境设置如下。
- Spark v3.3.1
- Hadoop v3.2.1
- Python v3.8
【问题讨论】:
标签: apache-spark pyspark cython cloudpickle