在Spark中找不到适合jdbc的驱动程序

Xia*_*hen 7 mysql jdbc apache-spark apache-spark-sql

我在用

df.write.mode("append").jdbc("jdbc:mysql://ip:port/database", "table_name", properties)
Run Code Online (Sandbox Code Playgroud)

插入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
Run Code Online (Sandbox Code Playgroud)

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

但是当我使用纱线群集模式时:

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
Run Code Online (Sandbox Code Playgroud)

它不起作用.我也试过设置"--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
Run Code Online (Sandbox Code Playgroud)

但仍然得到"找不到适合jdbc的驱动程序"错误.

eli*_*sah 7

有3种可能的解决方案,

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

    --jars $(echo ./lib/*.jar | tr ' ' ',')
    
    Run Code Online (Sandbox Code Playgroud)

    说明:假设您将所有 jar 文件都放在lib项目根目录中的目录中,这将读取所有库并将它们添加到应用程序提交中。

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

  • 您还可以尝试在“SPARK_HOME/conf/spark-default.conf”文件中配置这两个变量“spark.driver.extraClassPath”和“spark.executor.extraClassPath”,并将这些变量的值指定为jar的路径文件。确保工作节点上存在相同的路径。 (2认同)

小智 6

driver使用sparkSession'sread函数时,我必须添加该选项。

.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()
Run Code Online (Sandbox Code Playgroud)

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