2016-04-05 41 views
0

我在spark中写了一个简单的程序来写入一个数据框到mySql中的表中。Spark:线程“main”中的异常java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

的程序如下:

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 
import org.apache.spark.rdd.RDD 
import org.apache.spark.sql.SQLContext 
import org.apache.spark.sql.hive.HiveContext 

import org.apache.spark.SparkContext._ 
import org.apache.spark.rdd._ 
//import org.apache.spark.rdd.RDD 

import org.apache.spark.sql.types._ 
import org.apache.spark.sql.Row; 

import java.util.Properties 

import java.sql.{ Connection, DriverManager, SQLException } 

object MySQLTrial { 
    def main(args: Array[String]) { 
    val sparkConf = new SparkConf().setAppName("AnalyseBusStreaming") 
    val sc = new SparkContext(sparkConf) 
    val df = sc.parallelize(Array((1, 234), (2, 1233))) 
    val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
    import sqlContext.implicits._ 
    val prop = new Properties() 
    prop.put("user", "admin") 
    prop.put("password", "admin") 

    val driver = "com.mysql.jdbc.Driver" 
    Class.forName(driver) 
    val dfWriter = df.toDF().write.mode("append") 
    dfWriter.jdbc("jdbc:mysql://127.0.0.1:3306/IOT_DB", "table1", prop) 
    } 
} 

为我的项目的POM文件如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>ggi.bigdata</groupId> 
    <artifactId>internet_of_things</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-sql_2.10</artifactId> 
      <version>1.6.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive_2.10</artifactId> 
      <version>1.6.0</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.38</version> 
     </dependency> 
    </dependencies> 
</project> 

我正在使用的火花提交此程序(尝试在本地和纱模式) 。我没有明确包含任何jar文件来运行此代码。我不断收到错误:

异常线程 “main” 抛出java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

你应该了解这一点呢?

回答

1

这是因为你的驱动程序不存在于您提交到集群是否是一个独立的集群或纱线或mesos尤伯杯罐子等

解决方案1:由于您使用maven,你可以使用程序集插件来构建你的超级jar包和所有需要的依赖项。有关maven assembly plugin here的更多信息

解决方案2:当您使用--jars选项提交应用程序时,在运行时提供这些依赖库。我建议您在官方文档中阅读关于advanced dependencies managementsubmitting applications的矿石信息。

e.g它可以是这样的:

./bin/spark-submit \ 
    --class <main-class> 
    --master <master-url> \ 
    --jars /path/to/mysql-connector-java*.jar 

我希望这有助于!

+0

我一直在eclipse上使用maven插件,并没有过这个问题。这是否意味着一个简单的“maven install”来创建一个胖罐子是不够的?我不想去'--jars'路由,因为所有的执行者(或其他URI)都必须有那个jar –

+0

不,安装选项是不够的。除非你想一个接一个地安装你的所有依赖。 – eliasah

+0

关于maven插件,我实际上并不了解你在评论中说的是什么。我提到了用于构建超级jar的程序集插件(作为许多人之一),我也向你分享了它的链接:-) – eliasah

0

Eliasah是对的。 M2Eclipse确实创建了一个jar文件,但它不是一个胖/超级jar文件。如果我在eclipse上显式安装“maven assembly”插件,我可以创建一个包含依赖jar的胖jar包,因此程序将运行。

相关问题