CDSW环境安装PyArrow失败,运行PySpark Pandas UDF报依赖缺失如何解决?
解决方案
核心原因
该报错的本质是PySpark调用的执行器(Worker节点)Python环境中未检测到符合版本要求的PyArrow依赖,仅在驱动节点安装PyArrow无法同步到Worker节点,因此运行pandas UDF时会抛出缺失依赖的错误。
可用解决方法
- 方法1:全集群统一安装依赖+配置Spark Python路径
首先在集群所有Worker节点的Python 3.6环境中安装兼容版本的PyArrow,根据你的Spark版本选择适配版本:- Spark 2.4.x 推荐安装PyArrow 0.15.1
- Spark 3.x 推荐安装PyArrow 4.0.0
执行安装命令:
随后在CDSW代码中显式指定Spark使用的Python解释器路径,并开启Arrow支持,在初始化Spark会话后添加如下配置:pip3 install pyarrow==0.15.1import os # 替换为你环境中Python3.6的实际可执行文件路径 os.environ['PYSPARK_PYTHON'] = '/usr/bin/python3.6' os.environ['PYSPARK_DRIVER_PYTHON'] = '/usr/bin/python3.6' # 开启Arrow相关支持 spark.conf.set("spark.sql.execution.arrow.enabled", "true") # Spark3.x额外添加以下配置 spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true") - 方法2:CDSW会话级打包虚拟环境分发
若你没有权限修改Worker节点的系统Python环境,可以在CDSW会话内创建独立虚拟环境,打包后自动分发到所有Worker节点使用:- 终端执行命令创建虚拟环境并安装依赖:
# 创建Python3.6虚拟环境 virtualenv -p python3.6 spark_venv source spark_venv/bin/activate # 安装所有需要的依赖 pip install pandas scipy pyarrow==0.15.1 deactivate # 打包虚拟环境 zip -r spark_venv.zip spark_venv- 初始化Spark会话时添加虚拟环境分发配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.yarn.dist.archives", "spark_venv.zip#spark_venv") \ .config("spark.executorEnv.PYSPARK_PYTHON", "./spark_venv/bin/python") \ .getOrCreate() - 方法3:无需PyArrow的临时规避方案
若暂时无法解决依赖问题,可以把pandas UDF替换为普通PySpark UDF,运行不需要PyArrow依赖,代码修改如下:import pyspark.sql.functions as F from pyspark.sql.functions import udf from scipy.stats import norm # 普通UDF实现相同逻辑 @udf('double') def probnorm(v): return float(norm.cdf(v)) # 调用方式不变 df = df.withColumn('pnorm', probnorm(F.col('value')))
内容的提问来源于stack exchange,提问作者Amy Jack
相关产品推荐
相关产品推荐

