pyspark の postgres sql データベースから読み取る必要があります。here、here 、および他の多くの場所などでこれが以前に尋ねられたことは知っていますが、そこでの解決策は、ローカルの実行中のディレクトリで 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 ではまだ利用できません。