2017-06-28 3 views
0

私は潜在的に愚かな質問をしています。ローカルでSparkを実行しているときにこの問題を修正しましたが、AWS EMRでSparkを実行しているときに解決できませんでした。Amazon EMR SparkをMySQLに接続(データ書き込み)

基本的には、データを読み込み、操作し、スパークデータフレームに処理し、AWS RDSの別の場所で既にホストしているMySQLテーブルに書き込むpysparkスクリプトがあります。

これは私がMySQLのコネクタ( "mysqlの-コネクタのjava-5.1.42-bin.jarを")の最新ドライバをダウンロードして、私のインスタンスにそれらを置くスパーク2.1.1

とEMR 5.6であり、マスターノード(基本的にはローカルのラップトップにダウンロードして、それをマスターノードに置くためにscpを使います)。

私は、その後の/ etc /火花/ confの下の私の火花defaults.confにファイルを見つけて、次のパラメータを編集した:これらの両方に

spark.driver.extraClassPath 
spark.executor.extraClassPath 

を、私は、私のmysql-コネクタファイルへのパスを追加しました/home/hadoop/mysql-connector-java-5.1.42-bin.jarにあります。

このSO投稿(Adding JDBC driver to Spark on EMR)に基づいて、私は次のコマンドを使用して( "extraClassPath "):

spark-submit sample_script.py --driver-class-path /home/hadoop/mysql-connector-java-5.1.42-bin.jar:/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/* 
私のコードで

、私は火花データフレームと次のコードを持っているデータベースへの書き込みです:私が得る

SQL_CONN = "jdbc:mysql://name.address.amazonaws.com:8000/dbname?user=user&password=pwd" 
spark_df.write.jdbc(SQL_CONN, table="tablename", mode="append", properties={"driver":'com.mysql.jdbc.Driver'}) 

特定のエラーはこれです:

java.lang.ClassNotFoundException (com.mysql.jdbc.Driver) [duplicate 51] 

任意の入力が認識されるであろう。 ..これは、私が本当に愚かな間違いのように感じて、私が正確に指摘することができない。

+0

'{" driver ": 'com.mysql.jdbc.Driver'}'ここでは二重引用符ではいけませんか?実際には問題に関連していません。 'spark-submit'を実行しているユーザーが指定されたクラスパスのパスにアクセスできるかどうかを最初に確認します。後でそれらのクラスパスが実際にロードされた場合はログをチェックインします。 –

+0

私はそれが実際に私のスレーブですノードにはjarファイルがありません。本当に素早く試してみましょう。 – shishy

答えて

1

修正済み - 私は愚かで、jarファイルをスレーブノードにも入れないことを忘れました。 --driver-class-pathはjarを私のスレーブに自動的に配布しないことを忘れていました。

jarファイルを自分のマスターノードと同じルートディレクトリ(つまり、私の場合は/ home/hadoop)に入れたら、うまくいきました。

これが役に立ちます。

関連する問題