以下のように、PySpark を使用して SQL Server データベースに接続しようとしています。
from pyspark.sql import SparkSession
import traceback
def connect_and_read(spark: SparkSession):
url = 'jdbc:sqlserver://DUMMY1234.DUMMY.COM\DUMMY1234;databaseName=Dummy_DB;encrypt=false'
driver = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
try:
dataframe = spark.read.format('jdbc').option('url', url). \
option('driver', driver). \
option('user', 'username'). \
option('password', 'password'). \
option('dbtable', 'TABLENAME'). \
load()
print(f'Count: {dataframe.count()}')
dataframe.take(10)
except Exception as ex:
traceback.print_exc(type(ex), ex, ex.__traceback__)
pass
if __name__ == '__main__':
spark = SparkSession.builder.master('yarn').config('spark.app.name', 'read_data_sqlserver').config('spark.driver.extraClassPath', 'path_to_/mssql-jdbc-9.2.0.jre8.jar').config('spark.driver.extraClassPath', 'path_to_/spark-mssql-connector-1.0.1.jar').getOrCreate()
connect_and_read(spark)
このコードを Google Cloud Platform から実行しています。このオペレーション用のクラスタを作成し、そこにジョブを送信する Dataproc インスタンスがあります。ジョブは以下の例外で失敗します:
py4j.protocol.Py4JJavaError: o70.load の呼び出し中にエラーが発生しました。
: com.microsoft.sqlserver.jdbc.SQLServerException: ドライバーは、Secure Sockets Layer (SSL) 暗号化を使用して SQL Server への安全な接続を確立できませんでした。エラー: 「接続リセット ClientConnectionId:1223412f-9879702-wfwd-134qq-2143d123e1q」。com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate (SQLServerConnection.java:3208)
で com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL (IOBuffer.java:1916)
で com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper で(SQLServerConnection.java:2760)
com.microsoft.sqlserver.jdbc.SQLServerConnection.login (SQLServerConnection.java:2418) で com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal (SQLServerConnection.java:2265) で com.microsoft.sqlserver.jdbc.SQLServerConnection.connect (SQLServerConnection.java:1291) com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:881) で java.lang.Thread.run(Thread.java:748) 原因: java.io.IOException:接続リセット ClientConnectionId:1223412f-9879702-wfwd-134qq-2143d123e1q. com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.readInternal(IOBuffer.java:862) で com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.read(IOBuffer.java:849) で com.microsoft.sqlserver.jdbc で.TDSChannel$ProxyInputStream.readInternal(IOBuffer.java:1019) com.microsoft.sqlserver.jdbc.TDSChannel$ProxyInputStream.トレースバック (最新の呼び出しが最後):
ファイル "/tmp/portw/pattern.py"、24 行目、
connect_and_read(spark)内ファイル "/tmp/portw/pattern.py"、18 行目、connect_and_read
traceback.print_exc(type(ex), ex, ex. traceback )内ファイル「/opt/conda/default/lib/python3.8/traceback.py」、163 行目、print_exc の
print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)ファイル「/opt/conda/default/lib/python3.8/traceback.py」、103 行目、print_exception
の行の TracebackException(ファイル「/opt/conda/default/lib/python3.8/traceback.py」、509 行目、init
self.stack = StackSummary.extract(ファイル "/opt/conda/default/lib/python3.8/traceback.py"、340 行目、
制限が 0 以上の場合の抽出:TypeError: 'type' と 'int' のインスタンス間で '>=' はサポートされていません
21/02/09 13:59:59 INFO org.sparkproject.jetty.server.AbstractConnector: 停止した Spark@1aa73a6d{HTTP/1.1, (http/1.1)}
以前、URL に含まれていなかったので、encrypt=false
参考文献を見て追加しました。
プレーンな Python コードでは API の同じホストに接続できますが、Spark では接続できません。
ここで私が犯している間違いとそれを修正する方法を誰かに教えてもらえますか。
どんな助けでも大歓迎です。