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

时间:2016-01-13 10:41:26

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

我正在使用

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

这种纱线客户端模式对我有用。

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

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驱动程序”错误。

3 个答案:

答案 0 :(得分:3)

有3种可能的解决方案,

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

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

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

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

答案 1 :(得分:1)

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

Driver driver = new Driver();

构造函数使用DriverManager注册驱动程序,它解决了我的SQLException问题。

答案 2 :(得分:0)

使用driver的{​​{1}}函数时,我必须添加sparkSession选项。

read

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

根据依赖关系的设置方式,您会注意到,例如,在Gradle中包含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() 之类的内容时,它将在compile group: 'org.postgresql', name: 'postgresql', version: '42.2.8'处包含Driver类,这就是您所需要的想指示火花加载。