복붙노트

[HADOOP] Spark : 스레드 "main"의 예외 java.lang.ClassNotFoundException : com.mysql.jdbc.Driver

HADOOP

Spark : 스레드 "main"의 예외 java.lang.ClassNotFoundException : com.mysql.jdbc.Driver

필자는 spark에서 dataframe을 mySql 테이블에 작성하는 간단한 프로그램을 작성했다.

프로그램은 다음과 같습니다 :

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. ==============================

    1.이것은 독립 실행 형 클러스터 또는 원사 또는 mesos 여부에 관계없이 클러스터에 제출하는 드라이버가 uber-jar에 없기 때문입니다.

    이것은 독립 실행 형 클러스터 또는 원사 또는 mesos 여부에 관계없이 클러스터에 제출하는 드라이버가 uber-jar에 없기 때문입니다.

    해결 방법 1 : 당신이 maven을 사용하고 있기 때문에 어셈블리 플러그인을 사용하여 필요한 모든 의존성을 가진 uber-jar를 빌드 할 수 있습니다. Maven 어셈블리 플러그인에 대한 자세한 정보는 여기에 있습니다.

    해결책 2 : --jars 옵션을 사용하여 응용 프로그램을 제출할 때 런타임에 이러한 종속성 라이브러리를 제공하십시오. 고급 의존성 관리에 대한 광석 정보를 읽고 공식 문서에 응용 프로그램을 제출하도록 조언합니다.

    예를 들면 다음과 같이 보일 수 있습니다 :

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

    이게 도움이 되길 바란다 !

  2. ==============================

    2.엘리야는 옳았다. M2Eclipse는 jar 파일을 생성하지만 fat / uber jar 파일은 아닙니다. Eclipse에 "Maven 어셈블리"플러그인을 명시 적으로 설치하면, 종속 항아리가 포함 된 팻 항아리를 만들 수 있으므로 프로그램이 실행됩니다.

    엘리야는 옳았다. M2Eclipse는 jar 파일을 생성하지만 fat / uber jar 파일은 아닙니다. Eclipse에 "Maven 어셈블리"플러그인을 명시 적으로 설치하면, 종속 항아리가 포함 된 팻 항아리를 만들 수 있으므로 프로그램이 실행됩니다.

  3. from https://stackoverflow.com/questions/36435532/spark-exception-in-thread-main-java-lang-classnotfoundexception-com-mysql-j by cc-by-sa and MIT license