【问题标题】:Adding PostgresSQL JDBC Driver to all-spark-notebook using docker-compose使用 docker-compose 将 PostgresQL JDBC 驱动程序添加到 all-spark-notebook
【发布时间】:2021-07-07 18:14:13
【问题描述】:

我是 docker 和 python spark 的初学者,我正在尝试一些 spark 示例,从本地 PostgreSQL 数据库中提取数据。我在运行 LTS Ubuntu 20.04 的 Windows 10 机器上进行了本地试验。我的 docker-compose 版本是 1.28。 但是,我一直遇到同样的问题,如何将某某驱动程序添加到我的 docker 映像中。在这种情况下,它是 postgresql jdbc 驱动程序。我的问题与this question 非常相似。但是,我使用的是 docker-compose 而不是普通的 docker。

这里是 all-spark-notebook 映像的 docker-compose 部分:

services:
  spark:
    image: jupyter/all-spark-notebook:latest
    ports:
      - "8888:8888"
    working_dir: /home/$USER/work
    volumes:
      - $PWD/work:/home/$USER/work
    environment:
      PYSPARK_SUBMIT_ARGS: --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.1 --jars /usr/share/java/postgresql.jar pyspark-shell

packages 条目是让我的 kafka 集成在 jupyter 中工作所必需的(它确实如此)。 --jars 条目是我尝试使用以下方法引用安装在 ubuntu LTS 终端中的 postgresql jdbc 驱动程序:

sudo apt-get install libpostgresql-jdbc-java libpostgresql-jdbc-java-doc

在python中,我试过这个:

conf = SparkConf()
conf.set("spark.jars", "/usr/share/java/postgresql.jar")

findspark.init()

spark = SparkSession \
    .builder \
    .config(conf=conf) \
    .appName("My App") \
    .getOrCreate()


dataframe = spark.read.format('jdbc').options(\
        url = "jdbc:postgresql://host.docker.internal:5432/postgres?user=user&password=***",\
        database='postgres',
        dbtable='cloud.some-table'
    ).load()

dataframe.show()

但是,我收到以下错误消息:

java.sql.SQLException:没有合适的驱动程序

就像引用的以前的海报一样。

有什么想法吗?这应该很容易,但我很挣扎。

【问题讨论】:

    标签: postgresql jdbc pyspark docker-compose


    【解决方案1】:

    好的,因为没有人回来回答我会发布对我有用的东西(最后)。我并不是说这是正确的方法,我很高兴有人发布更好的答案,但这可能会让某人摆脱困境。

    由于不同的配置(和版本!)需要不同的解决方案,我将首先定义我的设置。我正在使用带有 Docker Engine V20.10.5 的 Windows 10 的 docker 桌面。我正在使用 docker-compose 1.29.0 版管理我的 docker 容器。我正在使用最新的 all-spark-notebook(无论是什么版本)和 postgresql-42.2.19 jdbc 驱动程序。

    我还要说这是在我安装了 LTS 的本地 Windows 机器上运行的,仅用于实验。

    对我有用的技巧是: a) 使用带有 spark 的 jdbc 驱动程序包。这样,spark 在运行时(当您在 Jupyter 中创建 spark 实例时)从 maven 安装包,然后...

    volumes:
      - $PWD/work:/home/$USER/work
    environment:
      PYSPARK_SUBMIT_ARGS: --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.1,org.postgresql:postgresql:42.2.19 --driver-class-path /home/jovyan/.ivy2/jars/org.postgresql_postgresql-42.2.19.jar pyspark-shell
    

    b) 了解包 jar 的解压位置并使用该目录告诉 spark 在哪里可以找到相关的 jar。在我的例子中,我使用这个命令在 Jupyter notebook 中启动 spark:

    spark = SparkSession \
        .builder \
        .config("spark.driver.extraClassPath", "/home/jovyan/.ivy2/jars/org.postgresql_postgresql-42.2.19.jar") \
        .appName("My App") \
        .getOrCreate()
    

    还有一点需要注意,这可能有点不稳定。如果 spark 认为它需要从 maven 中重新提取文件(很明显,它会在第一次这样做),那么库不会被拾取并且连接失败。但是,运行 stop 和 up -d 来回收容器并重新运行 python 脚本会使连接变得愉快。我不假装我知道为什么,但我怀疑我的设置方式存在一些依赖性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 2015-12-21
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2018-11-12
      • 2014-06-26
      • 2013-10-27
      相关资源
      最近更新 更多