df.showがjava.lang.ClassNotFoundExceptionを返す:org.postgresql.Driver

Nov 04 2020

これは重複のないcarrefullyお読みくださいこの。

AWSでEMRを介してRDSデータベースにアクセスしようとしています。私はツェッペリンでこれをしました:

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.jars", "/home/hadoop/postgresql-42.2.18.jar") \
    .getOrCreate()

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://host:5432/base") \
    .option("dbtable", "tab") \
    .option("user", "xx") \
    .option("password", "xx") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.printSchema()

私が実行したとき、私はこのエラーを受け取りました:

java.lang.ClassNotFoundException: org.postgresql.Driver 

だから私はこれを見つけ、テーブルのスキーマを見ることができるのでうまくいきました(インタープリター構成にspark.driver.extraClassPath変数を追加しました):

root
 |-- domaine: string (nullable = true)
 |-- traitement: string (nullable = true)
 |-- parquet: string (nullable = true)
 |-- status: string (nullable = true)
 |-- date: date (nullable = true) 

しかし、df.show()テーブルの内容を確認しようとすると、以前と同じエラーが返されます。

Py4JJavaError: An error occurred while calling o118.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, host, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
    at org.apache.spark.repl.ExecutorClassLoader.findClass(ExecutorClassLoader.scala:124)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)

スキーマは表示されますが、コンテンツは表示されない理由がわかりません。

何か助けはありますか?ありがとうございました。

回答

Snigdhajyoti Nov 05 2020 at 02:41

Hadoopジョブを送信すると、アプリケーションマスターは、マスターノードを含む任意のワーカーノードで作成できます(構成によって異なります)。EMRを使用している場合、アプリケーションマスターはデフォルトで任意のワーカーノード(COREノード)に作成されますが、マスターには作成されません。

あなたのファイル/home/hadoop/postgresql-42.2.18.jarは、マスターノード上にあると思います。
プログラムは、アプリケーションマスターが存在するノードでこのファイルを検索しますが、マスターノードでは間違いなく検索しません。そのため、エラーは発生しません。


この問題を解決するには:

  1. jarをすべてのコアノードに配置します(スケーラブルなソリューションではありません)
  2. を使用しhdfs://ます。それをHDFSに入れると、はるかに優れたオプションになります。ここで、HDFSはすべてのCOREおよびTASKインスタンスと共有されます。
  3. S3の代わりにHDFSと同じで、EMRFSを介してフェッチします(s3://

PS:スキーマをどのように見ることができるかわかりません spark.driver.extraClassPath

Haha Nov 06 2020 at 20:53

Zeppelinインタープリターメニューに次のパラメーターを追加することで、この問題を解決しました。

spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar 
spark.jars.packages=org.postgresql:postgresql:42.2.18