首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.sql.SQLException:在将DataFrame加载到Spark中时找不到合适的驱动程序

java.sql.SQLException:在将DataFrame加载到Spark中时找不到合适的驱动程序
EN

Stack Overflow用户
提问于 2015-04-28 23:35:31
回答 4查看 14.4K关注 0票数 13

当试图将JDBC加载到Spark中时,我遇到了非常奇怪的问题。

我尝试了几个星团-纱线,独立的集群和伪分布式模式在我的笔记本电脑。它在星火1.3.0和1.3.1上都是可复制的。这个问题既发生在spark-shell中,也发生在用spark-submit执行代码时。我尝试过MySQL &MySQL驱动程序,但没有成功。

考虑以下样本:

代码语言:javascript
复制
val driver = "com.mysql.jdbc.Driver"
val url = "jdbc:mysql://localhost:3306/test"

val t1 = {
  sqlContext.load("jdbc", Map(
    "url" -> url,
    "driver" -> driver,
    "dbtable" -> "t1",
    "partitionColumn" -> "id",
    "lowerBound" -> "0",
    "upperBound" -> "100",
    "numPartitions" -> "50"
  ))
}

到目前为止,模式得到了正确的解析:

代码语言:javascript
复制
t1: org.apache.spark.sql.DataFrame = [id: int, name: string]

但是当我评估DataFrame时:

代码语言:javascript
复制
t1.take(1)

出现以下例外情况:

代码语言:javascript
复制
15/04/29 01:56:44 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 192.168.1.42): java.sql.SQLException: No suitable driver found for jdbc:mysql://<hostname>:3306/test
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    at org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1.apply(JDBCRDD.scala:158)
    at org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1.apply(JDBCRDD.scala:150)
    at org.apache.spark.sql.jdbc.JDBCRDD$$anon$1.<init>(JDBCRDD.scala:317)
    at org.apache.spark.sql.jdbc.JDBCRDD.compute(JDBCRDD.scala:309)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
    at org.apache.spark.scheduler.Task.run(Task.scala:64)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

当我试图在executor上打开JDBC连接时:

代码语言:javascript
复制
import java.sql.DriverManager

sc.parallelize(0 until 2, 2).map { i =>
  Class.forName(driver)
  val conn = DriverManager.getConnection(url)
  conn.close()
  i
}.collect()

它工作得很完美:

代码语言:javascript
复制
res1: Array[Int] = Array(0, 1)

当我在本地Spark上运行相同的代码时,它也运行得非常完美:

代码语言:javascript
复制
scala> t1.take(1)
...
res0: Array[org.apache.spark.sql.Row] = Array([1,one])

我使用星火预建与Hadoop2.4支持。

重现问题的最简单方法是使用start-all.sh脚本以伪分布式模式启动Spark,并运行以下命令:

代码语言:javascript
复制
/path/to/spark-shell --master spark://<hostname>:7077 --jars /path/to/mysql-connector-java-5.1.35.jar --driver-class-path /path/to/mysql-connector-java-5.1.35.jar

有办法解决这个问题吗?这看起来是个严重的问题,所以谷歌搜索在这里没有帮助是很奇怪的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-29 10:55:27

显然,最近有人报道了这一问题:

https://issues.apache.org/jira/browse/SPARK-6913

问题是在java.sql.DriverManager中,除了引导ClassLoader之外,没有看到由ClassLoaders加载的驱动程序。

作为一种临时解决方法,可以添加必要的驱动程序来引导执行者的类路径。

更新:此拉请求修复了问题:https://github.com/apache/spark/pull/5782

更新2:修复程序合并到Spark1.4

票数 4
EN

Stack Overflow用户

发布于 2015-10-13 14:07:47

用于将数据写入MySQL

在spark 1.4.0中,您必须在写入MySQL之前加载它,因为它在加载函数上加载驱动程序,而不是在写函数上加载驱动程序。我们必须在每个工作节点上放置jar,并在每个节点上设置火花-defaults.conf文件中的路径。这个问题已在spark 1.5.0中得到修正。

https://issues.apache.org/jira/browse/SPARK-10036

票数 3
EN

Stack Overflow用户

发布于 2015-10-06 16:36:00

我们被困在火星1.3 (Cloudera5.4),所以我发现这个问题和野火的答案有帮助,因为它让我停止了我的头撞墙。

我想分享一下如何让驱动程序进入引导类路径:我们只需将其复制到所有节点上的/opt/cloudera/parcels/CDH-5.4.0-1.cdh5.4.0.p0.27/lib/hive/lib中即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29931759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档