首页 > 解决方案 > spark.driver.extraClassPath 在虚拟 PySpark 环境中不起作用

问题描述

我正在将数据保存到 Postgres 数据库,但作业失败,原因如下:

py4j.protocol.Py4JJavaError: 调用 o186.jdbc 时出错。:java.lang.ClassNotFoundException:org.postgresql.Driver

spark/jars直到我在全局安装 spark 时将 postgres jar 下载到该文件夹​​。

我感觉搬到了一台新机器上,而是只通过 pip 在虚拟环境(venv)中安装了 pyspark。

我尝试将 extraClassPath 配置值设置为虚拟目录中的 jar 文件夹,但这不起作用:

session = SparkSession \
         .builder \
         .config("spark.driver.extraClassPath", "/home/me/source/acme/.venv/lib/python3.6/site-packages/pyspark/jars/postgresql-42.2.6.jar") \
         .getOrCreate()

尝试过相对路径和绝对路径以及通配符 (*) 和完整文件名。似乎没有任何效果。

但是,设置spark.jars.packages确实从 Maven 正确加载了包:

     .config('spark.jars.packages', 'org.postgresql:postgresql:42.2.6') \ 

如何使 extraClassPath 工作?

标签: apache-sparkpyspark

解决方案


您还需要在执行程序类路径中添加 jar。

session = SparkSession \
         .builder \
         .config("spark.driver.extraClassPath", "/home/me/source/acme/.venv/lib/python3.6/site-packages/pyspark/jars/postgresql-42.2.6.jar") \
         .config("spark.executor.extraClassPath", "/home/me/source/acme/.venv/lib/python3.6/site-packages/pyspark/jars/postgresql-42.2.6.jar") \
         .getOrCreate()

编辑:要进行语义复制spark.jars.package,您可以使用spark.jarsjar 文件的绝对路径。还要确保检查你的 jar 并确认它有适当的驱动程序 MENIFEST。


推荐阅读