Spark找不到JDBC驱动程序

Spark找不到JDBC驱动程序,jdbc,apache-spark,apache-spark-sql,Jdbc,Apache Spark,Apache Spark Sql,因此,我一直在使用sbt和assembly将所有依赖项打包到一个jar中,用于spark作业。我做过几项工作,使用c3p0设置连接池信息,广播出来,然后在RDD上使用foreachPartition获取连接,并将数据插入数据库。在我的sbt构建脚本中,我包括 "mysql" % "mysql-connector-java" % "5.1.33" 这确保JDBC连接器与作业一起打包。一切都很好 因此,最近我开始使用SparkSQL,并意识到使用1.3.0 我得到以下异常: java.sql.SQ

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

"mysql" % "mysql-connector-java" % "5.1.33"
这确保JDBC连接器与作业一起打包。一切都很好

因此,最近我开始使用SparkSQL,并意识到使用
1.3.0

我得到以下异常:

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

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

SPARK_CLASSPATH=/path/where/mysql-connector-is.jar

最终我想知道的是,为什么这项工作不能找到司机,而它应该打包在一起?我的其他工作从来没有这个问题。据我所知,
c3p0
和数据帧代码都使用了
java.sql.DriverManager
(它可以根据我所知为您导入所有内容),所以它应该可以正常工作??如果有什么东西阻止组装方法工作,我需要做什么才能使其工作?

此人也有类似问题:

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

Map options=newhashmap();
options.put(“url”,“jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
看跌期权(“dbtable”、“video”);
options.put(“driver”、“com.mysql.cj.jdbc.driver”)//在这里
DataFrame jdbcDF=sqlContext.load(“jdbc”,选项);

在spark/conf/spark-defaults.conf中,您还可以将spark.driver.extraClassPath和spark.executor.extraClassPath设置为MySql驱动程序的路径。jar有一个简单的Java技巧可以解决您的问题。您应该指定
Class.forName()
instance。例如:

 val customers: RDD[(Int, String)] = new JdbcRDD(sc, () => {
       Class.forName("com.mysql.jdbc.Driver")
       DriverManager.getConnection(jdbcUrl)
      },
      "SELECT id, name from customer WHERE ? < id and id <= ?" ,
      0, range, partitions, r => (r.getInt(1), r.getString(2)))
val客户:RDD[(Int,String)]=新的JdbcRDD(sc,()=>{
Class.forName(“com.mysql.jdbc.Driver”)
DriverManager.getConnection(jdbcUrl)
},

选择id,name from customer WHERE?
spark.driver.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.driver.extraClassPath=/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath=/mysql-connector-java-5.1.36.jar

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

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

在SPARK 1.0+中,环境变量SPARK_CLASSPATH已被弃用

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

--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"
例如,对于TeraData,您需要terajdbc4.jar和tdgssconfig.jar

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

JDBC驱动程序类必须对客户端会话和所有执行器上的原始类加载器可见。这是因为Java的DriverManager类执行安全检查,导致在打开连接时忽略原始类加载器不可见的所有驱动程序所有工作节点上的ute_classpath.sh,以包括驱动程序JAR


我在集群模式下在Mesos集群上运行作业时遇到了同样的问题

要使用JDBC驱动程序,必须将依赖项添加到系统类路径,而不是框架类路径。我只找到了在集群的每个实例的文件
spark defaults.conf
中添加依赖项的方法


要添加的属性是
spark.driver.extraClassPath
spark.executor.extraClassPath
,并且路径必须在本地文件系统中。

我将jar文件添加到spark-env.sh中的spark_类路径,它可以工作

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/local/spark-1.6.3-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar

在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()
见正式文件


在我的例子中,spark不是从cli命令启动的,而是从django framework启动的:
--driver class path postgresql-9.4.1207.jar--jars postgresql-9.4.1207.jar

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

但是,正确的方法是在spark提交后立即指定这些选项:

--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"

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
当我试图从我的windows机器上运行spark shell命令时,我遇到了同样的问题您传递给驱动程序位置以及您将要使用的jar的内容应该在双引号中,否则它会被误解,您将无法获得所需的确切输出

您还必须从以下链接安装SQL server的JDBC驱动程序:

我已使用以下命令在windows计算机上正常工作:

spark shell--驱动程序类路径“C:\Program Files\Microsoft JDBC driver 6.0 for SQL Server\sqljdbc_6.0\chs\jre8\sqljdbc42.jar”--jars“C”