Spark无法找到JDBC驱动程序

Ada*_*ter 26 jdbc apache-spark apache-spark-sql

所以我一直在使用sbt with assembly将我的所有依赖项打包成一个jar用于我的spark作业.我有几个工作,我c3p0用来设置连接池信息,广播出来,然后foreachPartition在RDD上使用然后获取连接,并将数据插入数据库.在我的sbt构建脚本中,我包含了

"mysql" % "mysql-connector-java" % "5.1.33"
Run Code Online (Sandbox Code Playgroud)

这可确保JDBC连接器与作业打包在一起.一切都很好.

所以最近我开始玩SparkSQL,并意识到简单地采用数据帧并将其保存到具有新功能的jdbc源更容易 1.3.0

我收到以下异常:

java.sql.SQLException:在java.sql中找不到合适的jdbc驱动程序:mysql://some.domain.com/myschema?user = user&password = password at java.sql.DriverManager.getConnection(DriverManager.java:596).的DriverManager.getConnection(DriverManager.java:233)

当我在本地运行时,我通过设置绕过它

SPARK_CLASSPATH=/path/where/mysql-connector-is.jar
Run Code Online (Sandbox Code Playgroud)

最终我想知道的是,为什么这个工作不应该找到驱动程序什么时候应该打包它呢?我的其他工作从未遇到过这个问题.从我可以告诉他们c3p0和数据帧代码都使用java.sql.DriverManager(它处理从我可以告诉你的一切导入所有)所以它应该工作得很好?如果有什么东西阻止汇编方法工作,我需要做些什么来使其工作?

ins*_*iak 31

这个人有类似的问题:http://apache-spark-user-list.1001560.n3.nabble.com/How-to-use-DataFrame-with-MySQL-td22178.html

您是否已将连接器驱动程序更新到最新版本?你在调用load()时也指定了驱动程序类吗?

Map<String, String> options = new HashMap<String, String>();
options.put("url", "jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
options.put("dbtable", "video");
options.put("driver", "com.mysql.cj.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options); 
Run Code Online (Sandbox Code Playgroud)

在spark/conf/spark-defaults.conf中,您还可以将spark.driver.extraClassPath和spark.executor.extraClassPath设置为MySql驱动程序的路径.jar


小智 18

火花驱动程序和执行程序都需要类路径上的mysql驱动程序,所以指定

spark.driver.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
Run Code Online (Sandbox Code Playgroud)


Ayu*_*yan 13

spark文档中明确提到了这些选项:--driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

我正在做的错误是在我的应用程序的jar之后提到这些选项.

但是正确的方法是在spark-submit之后立即指定这些选项:

spark-submit --driver-class-path /somepath/project/mysql-connector-java-5.1.30-bin.jar --jars /somepath/project/mysql-connector-java-5.1.30-bin.jar --class com.package.MyClass target/scala-2.11/project_2.11-1.0.jar

  • 您是救生员。谢谢 (3认同)
  • 如果在 Windows 上通过 Spark-Shell 使用,则可以如下使用:spark-shell --driver-class-path "C:\Program Files\Microsoft JDBC Driver 6.0 for SQL Server\sqljdbc_6.0\enu\jre8\sqljdbc42。 jar" --jars "C:\Program Files\Microsoft JDBC Driver 6.0 for SQL Server\sqljdbc_6.0\enu\jre8\sqljdbc42.jar" (2认同)

小智 10

使用spark 2.2.0,通过在python脚本中为SparkSession会话添加额外的类路径信息为我解决了问题:

    spark = SparkSession \
        .builder \
        .appName("Python Spark SQL basic example") \
        .config("spark.driver.extraClassPath", "/path/to/jdbc/driver/postgresql-42.1.4.jar") \
        .getOrCreate()
Run Code Online (Sandbox Code Playgroud)

请参阅官方文档https://spark.apache.org/docs/latest/configuration.html

就我而言,不是从cli命令启动spark,而是从django框架https://www.djangoproject.com/启动


Gia*_*gna 6

spark.driver.extraClassPath在客户端模式下不起作用:

注意:在客户端模式下,不能直接在应用程序中通过SparkConf设置此配置,因为驱动程序JVM已在此时启动.相反,请通过--driver-class-path命令行选项或在默认属性文件中设置它.

在Spark 1.0+中已弃用Env变量SPARK_CLASSPATH.

您应该首先将jdbc驱动程序jar复制到同一本地文件系统路径下的每个执行程序中,然后在spark-submit中使用以下选项:

--driver-class-path "driver_local_file_system_jdbc_driver1.jar:driver_local_file_system_jdbc_driver2.jar"
--class "spark.executor.extraClassPath=executors_local_file_system_jdbc_driver1.jar:executors_local_file_system_jdbc_driver2.jar"
Run Code Online (Sandbox Code Playgroud)

例如,在TeraData的情况下,您需要terajdbc4.jar和tdgssconfig.jar.

或者在所有工作节点上修改compute_classpath.sh,Spark文档说:

JDBC驱动程序类必须对客户端会话和所有执行程序上的原始类加载器可见.这是因为Java的DriverManager类进行了安全检查,导致它忽略了当打开连接时原始类加载器不可见的所有驱动程序.一种方便的方法是修改所有工作节点上的compute_classpath.sh以包含驱动程序JAR.


小智 5

简单的方法是将“ mysql-connector-java-5.1.47.jar ”复制到“spark-2.4.3\jars\”目录中