【问题标题】:No suitable driver found for jdbc in Spark在 Spark 中找不到适合 jdbc 的驱动程序
【发布时间】:2016-04-18 07:09:43
【问题描述】:

我正在使用

df.write.mode("append").jdbc("jdbc:mysql://ip:port/database", "table_name", properties)

在 MySQL 中插入一个表。

另外,我在我的代码中添加了Class.forName("com.mysql.jdbc.Driver")

当我提交我的 Spark 应用程序时:

spark-submit --class MY_MAIN_CLASS
  --master yarn-client
  --jars /path/to/mysql-connector-java-5.0.8-bin.jar
  --driver-class-path /path/to/mysql-connector-java-5.0.8-bin.jar
  MY_APPLICATION.jar

这种纱线客户端模式适合我。

但是当我使用 yarn-cluster 模式时:

spark-submit --class MY_MAIN_CLASS
  --master yarn-cluster
  --jars /path/to/mysql-connector-java-5.0.8-bin.jar
  --driver-class-path /path/to/mysql-connector-java-5.0.8-bin.jar
  MY_APPLICATION.jar

它不起作用。我也尝试设置“--conf”:

spark-submit --class MY_MAIN_CLASS
  --master yarn-cluster
  --jars /path/to/mysql-connector-java-5.0.8-bin.jar
  --driver-class-path /path/to/mysql-connector-java-5.0.8-bin.jar
  --conf spark.executor.extraClassPath=/path/to/mysql-connector-java-5.0.8-bin.jar
  MY_APPLICATION.jar

但仍然出现“找不到适合 jdbc 的驱动程序”错误。

【问题讨论】:

    标签: mysql jdbc apache-spark apache-spark-sql


    【解决方案1】:

    有3种可能的解决方案,

    1. 您可能希望使用构建管理器(Maven、SBT)组装您的应用程序,因此您无需在 spark-submit cli 中添加依赖项。
    2. 您可以在 spark-submit cli 中使用以下选项:

      --jars $(echo ./lib/*.jar | tr ' ' ',')
      

      解释:假设您的所有 jars 都在项目根目录的 lib 目录中,这将读取所有库并将它们添加到应用程序提交中。

    3. 您也可以尝试在SPARK_HOME/conf/spark-default.conf文件中配置这两个变量:spark.driver.extraClassPathspark.executor.extraClassPath,并将这些变量的值指定为jar文件的路径。确保工作节点上存在相同的路径。

    【讨论】:

    • 我将 mysql-connector-java-5.1.38-bin.jar 添加到我的 jar 中,现在我没有将它包含在我的 spark-submit cli 中。通过这样做,yarn-client 仍然有效,但yarn-cluster 没有。
    • 你也可以尝试在“SPARK_HOME/conf/spark-default.conf”文件中配置这2个变量“spark.driver.extraClassPath”和“spark.executor.extraClassPath”并指定值这些变量作为 jar 文件的路径。确保工作节点上存在相同的路径。
    • 设置“spark.driver.extraClassPath”对我有用,谢谢。
    • 设置“spark.driver.extraClassPath”对我有用.. 但有人可以解释为什么我们应该提供这个,尽管我的 uber-jar 中包含相同的驱动程序 jar
    【解决方案2】:

    我尝试了此处显示的建议,但对我不起作用(使用 mysql)。在通过 DriverManager 代码进行调试时,我意识到我需要注册我的驱动程序,因为这不是通过“spark-submit”自动发生的。因此我添加了

    Driver driver = new Driver();
    

    构造函数向DriverManager注册驱动,为我解决了SQLException问题。

    【讨论】:

      【解决方案3】:

      在使用sparkSessionread 函数时,我必须添加driver 选项。

      .option("driver", "org.postgresql.Driver")

      var jdbcDF - sparkSession.read
        .option("driver", "org.postgresql.Driver")
        .option("url", "jdbc:postgresql://<host>:<port>/<DBName>")
        .option("dbtable", "<tableName>")
        .option("user", "<user>")
        .option("password", "<password>")
        .load()
      

      根据您的依赖项的设置方式,您会注意到,例如,当您在 Gradle 中包含 compile group: 'org.postgresql', name: 'postgresql', version: '42.2.8' 之类的内容时,这将包含位于 org/postgresql/Driver.class 的 Driver 类,这就是您要指示 spark 的类加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 2015-06-15
        • 1970-01-01
        • 2012-07-14
        • 2020-05-02
        • 2013-04-01
        • 2014-07-14
        相关资源
        最近更新 更多