2017-03-01 10 views
0

私はScala SparkアプリケーションでJDBCを使用しようとしていますが、私はsbtを使ってコンパイルしています。しかし、私がClass.forName("com.mysql.jdbc.Driver")行を追加すると、ClassNotFoundExceptionがスローされます。SparkがSBTからJDBCドライバを見つけられない

マイSBTファイルはこれです:

name := "SparkApp" 
version := "1.0" 
scalaVersion := "2.11.8" 
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0" 
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.0" 
libraryDependencies += "com.databricks" %% "spark-csv" % "1.5.0" 
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.1.0" 
libraryDependencies += "mysql" % "mysql-connector-java" % "6.0.5" 

限り、私は最後の行は、私は、JDBCドライバを追加する必要があるはずですが、それは動作していないようですすべてであると言うことができるように。私もClass.forName("com.mysql.jdbc.Driver").newInstance()を試しましたが、結果は同じです。したがって、問題はjdbcクラスが正しく追加されていないと仮定します。

答えて

1

データフレームをロードするためにJDBCを使用するために、クラス名を指定する必要はありません。

val host: String = ??? 
val port: Int = ??? 
val database: String = ??? 
val table: String = ??? 
val user: String = ??? 
val password: String = ??? 

val options = Map(
     "url" -> s"jdbc:mysql://$host:$port/$database?zeroDateTimeBehavior=convertToNull", 
     "dbtable" -> table, 
     "user" -> user, 
     "password" -> password) 

val df = spark.read.format("jdbc").options(options).load() 

あなたがスパークするようにアプリケーションを提出する場合、あなたはどちらかに持っている:Spark SQL documentationに続いて、あなただけのデータソース形式として"jdbc"を供給(そして実際に依存関係としてコネクタを追加)し、右のオプションを設定する必要があります最終的なjarファイルにMySQLのコネクタを含む、または依存関係としてパッケージを取得するために​​を伝える:

spark-submit --packages mysql:mysql-connector-java:6.0.5 ... 

このフラグはまたspark-shellまたはpysparkに取り組んでいます。

+0

DBへの書き込みはどうですか?私の最終目標は、私が持っているDataFrameをMySQLのテーブルに書き込むことでした。私はこのようにしようとしましたが、 "No suitable driver"エラーを受け取りました: 'val prop = new java.util.Properties() prop.setProperty(" user "、" username ") prop.setProperty(" – cogm

+0

書き込みも同様に動作するはずですが、書き込みは同じでなければなりません。同じオプション。どのようにコードを実行しますか?提出する場合は、依存関係が利用可能であることを確認してください。 – sgvd

+0

パッケージの引数を追加し、ドライバの問題を解決したようです。最初は廃止されたエラーが出ましたが、私は 'com.mysql.cj.jdbc.Driver'に変更しなければなりませんでした。 sbtの依存関係が十分であると考えていたでしょうか。ありがとう! – cogm

0

mysqlドライバクラスcom.mysql.jdbc.Driver実行時にクラスパス上に存在しません。あなたは、少なくとも2つの選択肢持っているよりも、あなたは火花提出であなたの火花ジョブを実行している場合:

  • をMySQLのパスを指定する--jarオプションを提供 - (このpostを参照してください)* jarファイルを。あなたはmysql-が含まれます
  • ビルドユーバージャー(脂肪ジャー)(労働者とドライバーの両方がクラスを必要とするならば、spark.executor.extraJavaOptionsspark.driver.extraJavaOptionsに近い見てみましょう)*アプリケーションのjarファイルのクラス(postを参照)
  • $POSTGRESQL_JAR_PATH$MYSQL_JAR_PATHはjarファイルへのHDFSパスに設定する必要があります
0

spark-submit \ --class com.mypack.MyClass \ --master yarn --deploy-mode cluster \ --conf spark.executor.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \ --conf spark.driver.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \

これが役に立ちます。

spark.executor.extraClassPathクラスタモードで実行している場合。ローカルで実行している場合は spark.driver.extraClassPathです。

より安全な側に両方のオプションを設定することをお勧めします。

0

以下のようなスパークジョブを送信しているときは、ドライバのjarを渡す必要があります。

1) 火花提出--jarsのmysql-コネクタ-javaの-5.1.39.jarと残りのパラメータあなたは渡しているとして

2)シェルを使ってローカルで試してみたい場合 spark-shell --jars mysql-connector-java-5.1.39。jar

ドライバを既に入手可能なものにアップデートし、その絶対パスを指定してください

関連する問題