为什么cythonize代码工作时,运行在Spark独立和YARN客户端部署模式,而不是在YARN集群部署?



我有一个Python库,我有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

特别是,我得到这个错误。

泡菜。PicklingError: Can't pickle

我对Spark不是很熟悉,但我希望"客户端"mode运行在同一个Python进程中,因此不需要序列化任何东西(对象可以简单地创建和使用)。"cluster"Mode大概是设计为在一堆不同的计算机上运行,因此需要将数据传递给pickle和unpickle的单独进程以分发它。

我相信cloudpickledill可以查看常规Python函数和lambda的内部,提取字节码,然后重建函数。这在Cython中显然是不可能的。在当前版本的Cython中,函数是按名称进行pickle的(因此lambda不可pickle,任何内部函数也不可pickle)。

你的选择是:

  1. 用可pickleable类(使用__call__函数)重写所有捕获变量的函数或lambda;用在函数或类作用域中定义的def函数替换其他lambda

  2. 尝试这个实验分支,它使大部分Cython函数可pickle。

相关内容

  • 没有找到相关文章