【问题标题】:df.show returning java.lang.ClassNotFoundException: org.postgresql.Driverdf.show 返回 java.lang.ClassNotFoundException: org.postgresql.Driver
【发布时间】:2020-11-03 18:01:06
【问题描述】:

请仔细阅读这不是this的重复。

我正在尝试通过 AWS 上的 EMR 访问 RDS 数据库。我在 Zeppelin 上做到了这一点:

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.jars", "/home/hadoop/postgresql-42.2.18.jar") \
    .getOrCreate()

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://host:5432/base") \
    .option("dbtable", "tab") \
    .option("user", "xx") \
    .option("password", "xx") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.printSchema()

当我执行时,我得到了这个错误:

java.lang.ClassNotFoundException: org.postgresql.Driver 

所以我找到了this,它运行良好,因为我可以看到我的表的架构(我在解释器配置中添加了 spark.driver.extraClassPath 变量):

root
 |-- domaine: string (nullable = true)
 |-- traitement: string (nullable = true)
 |-- parquet: string (nullable = true)
 |-- status: string (nullable = true)
 |-- date: date (nullable = true) 

但是,当我尝试使用 df.show() 查看表格的内容时,它会返回与之前相同的错误:

Py4JJavaError: An error occurred while calling o118.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, host, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
    at org.apache.spark.repl.ExecutorClassLoader.findClass(ExecutorClassLoader.scala:124)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)

我不明白为什么我能看到架构但看不到内容。

有什么帮助吗?谢谢。

【问题讨论】:

    标签: postgresql jdbc pyspark amazon-rds amazon-emr


    【解决方案1】:

    当您提交 hadoop 作业应用程序时,可以在您的任何工作节点(包括主节点)上创建主节点(取决于您的配置)。 如果您使用的是 EMR,则默认情况下,您的应用程序主节点会在您的任何工作节点(CORE 节点)上创建,但不会在主节点上创建。

    您的文件存在于/home/hadoop/postgresql-42.2.18.jar 我假设这意味着在主节点上。
    您的程序将在应用程序主节点所在的节点上搜索此文件,并且绝对不在您的主节点上,因为这样您不会收到任何错误。


    解决这个问题:

    1. 将 jar 放入每个核心节点(不是可扩展的解决方案)
    2. 使用hdfs://。将它放在 HDFS 中是更好的选择。这里 HDFS 与所有 CORE & TASK 实例共享。
    3. 与 HDFS 相同,而不是 S3,并通过 EMRFS (s3://) 获取它

    PS:我不知道你是如何使用spark.driver.extraClassPath查看架构的

    【讨论】:

      【解决方案2】:

      我通过在 Zeppelin 解释器菜单中添加以下参数解决了这个问题:

      spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar 
      spark.jars.packages=org.postgresql:postgresql:42.2.18
      

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2015-07-19
        • 1970-01-01
        • 2020-10-06
        • 2023-01-17
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多