3

pyspark の postgres sql データベースから読み取る必要があります。herehere 、および他の多くの場所などでこれが以前に尋ねられたことは知っていますが、そこでの解決策は、ローカルの実行中のディレクトリで jar を使用するか、すべてのワーカーに手動でコピーします。

postgresql-9.4.1208 jar をダウンロードして、/tmp/jars に配置しました。次に、 --jars および --driver-class-path スイッチを使用して pyspark を呼び出しました。

pyspark --master yarn --jars /tmp/jars/postgresql-9.4.1208.jar --driver-class-path /tmp/jars/postgresql-9.4.1208.jar

私がやったpysparkの中で:

df = sqlContext.read.format("jdbc").options(url="jdbc:postgresql://ip_address:port/db_name?user=myuser&password=mypasswd", dbtable="table_name").load()
df.count()

ただし、 --jars と --driver-class-path を使用すると、作成した jar では問題なく機能しましたが、jdbc では失敗し、ワーカーから例外が発生しました。

 java.lang.IllegalStateException: Did not find registered driver with class org.postgresql.Driver

jar を手動ですべてのワーカーにコピーし、--conf spark.executor.extraClassPath と --conf spark.driver.extraClassPath を追加すると、(同じ jar で) 機能します。ドキュメントでは、非推奨のSPARK_CLASSPATH を使用すると、実際にこれら 2 つのスイッチが追加されることが示唆されています (ただし、必要な --jars オプションを使用して OTHER jar を追加できないという副作用があります)。

私の質問は、jdbc ドライバーが機能しない特別な点と、すべてのワーカーに手動でコピーすることなく追加するにはどうすればよいかということです。

アップデート:

さらに調べたところ、ドキュメントで次のことがわかりました。ドライバーは、接続を開こうとしたときに原始クラス ローダーに表示されません。これを行う便利な方法の 1 つは、すべてのワーカー ノードの compute_classpath.sh を変更して、ドライバー JAR を含めることです。".

問題は、computer_classpath.sh が見つからないように見えることと、原始クラス ローダーの意味を理解できないことです。

これは、基本的にこれをローカルで行う必要があることを説明しています。また、基本的に修正があると言っているこれも見つけましが、バージョン 1.6.1 ではまだ利用できません。

4

3 に答える 3

4

うまくいく解決策を見つけました(それが最善の解決策かどうかわからないので、コメントを続けてください)。どうやら、次のオプションを追加すると、driver="org.postgresql.Driver" が正しく動作するようです。つまり、私の全行(pyspark内)は次のとおりです。

df = sqlContext.read.format("jdbc").options(url="jdbc:postgresql://ip_address:port/db_name?user=myuser&password=mypasswd", dbtable="table_name",driver="org.postgresql.Driver").load()
df.count()

別のこと: すでに独自のファット jar を使用している場合 (私は完全なアプリケーションを使用しています)、次のように jdbc ドライバーを pom ファイルに追加するだけです。

    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>9.4.1208</version>
    </dependency>

ドライバーを別の jar として追加する必要はありません。依存関係のある jar を使用するだけです。

于 2016-03-31T08:57:39.057 に答える
0

参照しているドキュメントのバージョンは何ですか? しばらく前に廃止されたようcompute-classpath.shです-Spark 1.3.1の時点で:

$ unzip -l spark-1.3.1.zip | egrep '\.sh' | egrep classpa
 6592  2015-04-11 00:04   spark-1.3.1/bin/compute-classpath.sh

$ unzip -l spark-1.4.0.zip | egrep '\.sh' | egrep classpa

何も生成しません。

クラスパスを設定するには、load-spark-env.sh を使用する必要があると思います。

$/opt/spark-1.6.0-bin-hadoop2.6/bin/load-spark-env.sh

ファイルに SPARK_CLASSPATH を設定する必要があり$SPARK_HOME/conf/spark-env.shます (テンプレート ファイルからコピーします$SPARK_HOME/conf/spark-env.sh.template)。

于 2016-03-31T07:52:32.820 に答える
0

これは、 https ://github.com/apache/spark/pull/12000 で説明および修正された問題の別の症状であると思います。私はその修正を 3 週間前に作成しましたが、動きはありません。他の人もその影響を受けたという事実を表明すれば、それは助けになるかもしれませんか?

于 2016-04-13T14:04:11.703 に答える