2016-04-05 2 views
0

Я написал простую программу в искры, чтобы написать dataframe в таблицу в 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 явно для запуска этого кода. Я получаю сообщение об ошибке:

Исключение в потоке «основной» java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Что должно быть сделано по этому поводу?

ответ

1

Это потому, что водитель не присутствует в убер-банку, который вы отправляете в кластер, будь-то автономный кластер или пряжи или Mesos и т.д.

Решение 1: Поскольку вы используете maven, вы можете использовать плагин сборки для создания вашей uber-jar со всеми необходимыми зависимостями. Дополнительная информация о maven assembly plugin here.

Решение 2: Предоставьте эти библиотеки зависимостей во время выполнения при отправке приложения с использованием опции --jars. Я советую вам прочитать рудную информацию о advanced dependencies management и submitting applications в официальной документации.

например он может выглядеть следующим образом:

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

Я надеюсь, что это помогает!

+0

Я использую плагин maven на затмении и раньше не имел этих проблем. Означает ли это, что простой «maven install» для создания толстой банки недостаточно? Я не хочу идти на маршрут '--jars', потому что все исполнители (или какой-то другой URI) должны были бы иметь эту банку –

+0

Нет, опции установки недостаточно. Если вы не хотите устанавливать все свои зависимости на своих подчиненных один за другим. – eliasah

+0

Что касается плагина maven, я не понимаю, о чем вы говорите в комментарии. Я упомянул плагин сборки (как один из mavens many), который будет использоваться для сборки uber-jar, и я поделился с вами ссылкой на него :-) – eliasah

0

Eliasah был прав. M2Eclipse действительно создает файл jar, но это не салфетка/uber. Если я явно устанавливаю плагин «maven assembly» на eclipse, я могу создать толстую банку с включенными банками зависимостей, и, следовательно, программа запускается.

Смежные вопросы