web-dev-qa-db-ja.com

Apache Spark:JDBC接続が機能していません

以前にもこの質問をしましたが、回答がありませんでした( pyspark Shellでjdbcを使用してpostgresに接続できません )。

ローカルウィンドウにSpark 1.3.0を正常にインストールし、サンプルプログラムを実行してpysparkShellを使用してテストしました。

ここで、Postgresqlに保存されているデータに対してMllibから相関を実行したいのですが、postgresqlに接続できません。

を実行して、クラスパスに必要なjarを正常に追加しました(このjarをテストしました)

pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar"

Jarが環境UIに正常に追加されていることがわかります。

PysparkShellで以下を実行すると-

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[Host]/[dbname]", dbtable="[schema.table]")  

このエラーが発生します-

>>> df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[Host]/[dbname]", dbtable="[schema.table]")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\pyspark\sql\context.py", line 482, in load
    df = self._ssql_ctx.load(source, joptions)
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.Zip\py4j\Java_gateway.py", line 538, in __call__
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.Zip\py4j\protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o20.load.
: Java.sql.SQLException: No suitable driver found for     jdbc:postgresql://[Host]/[dbname]
        at Java.sql.DriverManager.getConnection(DriverManager.Java:602)
        at Java.sql.DriverManager.getConnection(DriverManager.Java:207)
        at org.Apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:94)
        at org.Apache.spark.sql.jdbc.JDBCRelation.<init>    (JDBCRelation.scala:125)
        at  org.Apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114)
        at org.Apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290)
        at org.Apache.spark.sql.SQLContext.load(SQLContext.scala:679)
        at org.Apache.spark.sql.SQLContext.load(SQLContext.scala:667)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
        at Java.lang.reflect.Method.invoke(Method.Java:597)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.Java:231)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.Java:379)
        at py4j.Gateway.invoke(Gateway.Java:259)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.Java:133)
        at py4j.commands.CallCommand.execute(CallCommand.Java:79)
        at py4j.GatewayConnection.run(GatewayConnection.Java:207)
        at Java.lang.Thread.run(Thread.Java:619)
10
Soni Shashank

私はmysql/mariadbでこの正確な問題を抱えていて、 この質問 から大きな手がかりを得ました

したがって、pysparkコマンドは次のようになります。

pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>

また、「警告:ローカルjar ...が存在しません、スキップします」などのpysparkの起動時のエラーにも注意してください。および「ERRORSparkContext:Jar not found at ...」、これらはおそらくパスのスペルが間違っていることを意味します。

12
8forty

もう少しエレガントな解決策:

val props = new Properties
props.put("driver", "org.postgresql.Driver")
sqlContext.read.jdbc("jdbc:postgresql://[Host]/[dbname]", props)
4
jake256

Jake256が示唆したように

「ドライバー」、「org.postgresql.Driver」

キーと値のペアがありませんでした。私の場合、pysparkを次のように起動しました:

pyspark --jars /path/to/postgresql-9.4.1210.jar

次の手順で:

  from pyspark.sql import DataFrameReader

  url = 'postgresql://192.168.2.4:5432/postgres'
  properties = {'user': 'myUser', 'password': 'myPasswd', 'driver': 'org.postgresql.Driver'}
  df = DataFrameReader(sqlContext).jdbc(
      url='jdbc:%s' % url, table='weather', properties=properties
  )
  df.show()

  +-------------+-------+-------+-----------+----------+
  |         city|temp_lo|temp_hi|       prcp|      date|
  +-------------+-------+-------+-----------+----------+
  |San Francisco|     46|     50|       0.25|1994-11-27|
  |San Francisco|     43|     57|        0.0|1994-11-29|
  |      Hayward|     54|     37|0.239999995|1994-11-29|
  +-------------+-------+-------+-----------+----------+

テスト済み:

  • Ubuntu 16.04

  • PostgreSQLサーバーバージョン9.5。

  • 使用されるPostgresqlドライバーはpostgresql-9.4.1210.jarです。

  • およびSparkバージョンはspark-2.0.0-bin-hadoop2.6です

  • しかし、spark-2.0.0-bin-hadoop2.7でも機能するはずだと確信しています。

  • Java JDK 1.864ビット

他のJDBCドライバーは次の場所にあります: https://www.petefreitag.com/articles/jdbc_urls/

私が従ったチュートリアルは次のとおりです: https://developer.ibm.com/clouddataservices/2015/08/19/speed-your-sql-queries-with-spark-sql/

同様の解決策が次の場合にも提案されました: pyspark mysql jdbc load o23.loadの呼び出し中にエラーが発生しました適切なドライバーがありません

2
aks

この投稿を参照してください。すべてのオプションの後にスクリプトを配置してください。 これを参照

0
zhaozhi

間違ったバージョンのJDBCドライバーを使用すると、このエラーがスローされるようです。 https://jdbc.postgresql.org/download.html をチェックして、正しいものがあることを確認します。

特に注意してください:

JDK 1.1-JDBC 1.8.0リリースではJDBC1のサポートが削除されているため、サーバーを更新するときにJDKを更新するようにしてください。

JDK 1.2、1.3-JDBC 2. JDK 1.3 + J2EE-JDBC2EE。これには、javax.sqlクラスの追加サポートが含まれています。

JDK 1.4、1.5-JDBC3。これにはSSLおよびjavax.sqlのサポートが含まれていますが、J2SEリリースに追加されているためJ2EEは必要ありません。 JDK1.6-JDBC4。 JDBC4メソッドのサポートは完全ではありませんが、メソッドの大部分は実装されています。

JDK 1.7、1.8-JDBC41。 JDBC4メソッドのサポートは完全ではありませんが、メソッドの大部分は実装されています。

0
Will McGinnis