如何使用 jdbc 将 google cloudspanner 与 pyspark 以及 databricks 连接?

问题描述 投票:0回答:1

我有 Spark 版本 3.5.0 和 scala 2.12,我正在使用 'spark-3.1-spanner-1.0.0.jar'

import os
from google.oauth2 import service_account
from pyspark.sql import SparkSession



spark = SparkSession.builder.master("local[*]") \
.config("spark.jars","/home/arvind/Downloads/spark-3.1-spanner-1.0.0.jar")\
.appName("cloud spanner Testing").getOrCreate()
print(spark)
credentialFilePath = "/home/arvind/Downloads/jsonKeysFiles/citric-sol-436208-r8-099f62042467.json"
spark.conf.set("google.cloud.auth.service.account.json.keyfile", credentialFilePath)

# credentials = service_account.Credentials.from_service_account_file(credentialFilePath)
# print(credentials)
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentialFilePath



try:
   df = spark.read.format('cloud-spanner') \
      .option("projectId", "citric-sol-436208-r8") \
      .option("instanceId", "cloudspanner2") \
      .option("databaseId", "testcloudspanner") \
      .option("table", "moonatable1") \
      .load()
   df.show()


except Exception as error:
   print("Error ==",error)

我这样做是为了连接,但随后我也收到错误 调用 o39.load 时出错。 :com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.SpannerException:INVALID_ARGUMENT:指定的凭据路径无效:连接字符串中没有设置凭据,并且未设置或未设置默认应用程序凭据指向无效或不存在的文件。 请检查 GOOGLE_APPLICATION_CREDENTIALS 环境变量和/或使用 Google Cloud SDK gcloud auth application-default login 命令设置的凭据 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.SpannerExceptionFactory.newSpannerExceptionPreformatted(SpannerExceptionFactory.java:291) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.SpannerExceptionFactory.newSpannerExceptionPreformatted(SpannerExceptionFactory.java:297) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException(SpannerExceptionFactory.java:61) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.CredentialsService.createCredentials(CredentialsService.java:71) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.ConnectionOptions。(ConnectionOptions.java:748) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.ConnectionOptions。(ConnectionOptions.java:85) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.ConnectionOptions$Builder.build(ConnectionOptions.java:617) 在com.google.cloud.spark.spanner.SpannerUtils.connectionFromProperties(SpannerUtils.java:180) 在 com.google.cloud.spark.spanner.SpannerTable。(SpannerTable.java:62) 在com.google.cloud.spark.spanner.Spark31SpannerTableProvider.inferSchema(Spark31SpannerTableProvider.java:39) 在 org.apache.spark.sql.execution.datasources.v2.DataSourceV2Utils$.getTableFromProvider(DataSourceV2Utils.scala:90) 在 org.apache.spark.sql.execution.datasources.v2.DataSourceV2Utils$.loadV2Source(DataSourceV2Utils.scala:140) 在 org.apache.spark.sql.DataFrameReader.$anonfun$load$1(DataFrameReader.scala:210) 在 scala.Option.flatMap(Option.scala:271) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:208) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:172) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182) 在 py4j.ClientServerConnection.run(ClientServerConnection.java:106) 在 java.base/java.lang.Thread.run(Thread.java:829) 原因:java.io.IOException:应用程序默认凭据不可用。如果在 Google Compute Engine 中运行,则它们可用。否则,必须定义环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向定义凭据的文件。请参阅 https://developers.google.com/accounts/docs/application-default-credentials 了解更多信息。 在 com.google.cloud.spark.spanner.repackaged.com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:127) 在 com.google.cloud.spark.spanner.repackaged.com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:129) 在 com.google.cloud.spark.spanner.repackaged.com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:101) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.CredentialsService.internalGetApplicationDefault(CredentialsService.java:98) 在 com.google.cloud.spark.spanner.repackaged.com.google.cloud.spanner.connection.CredentialsService.createCredentials(CredentialsService.java:55) ... 24 更多

我认为驱动程序有问题,我使用的驱动程序是正确的还是我应该使用其他驱动程序..

pyspark jdbc google-bigquery databricks google-cloud-spanner
1个回答
0
投票

该错误表示 JDBC 驱动程序找不到 Google Cloud 的任何凭据。您正在设置

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentialFilePath
,但那是针对您的 Python 运行时环境的。

我认为问题是这个环境变量没有应用于你的 Spark 运行时。为此,您应该设置

spark.executorEnv.["GOOGLE_APPLICATION_CREDENTIALS"] = credentialFilePath

另请参阅 https://spark.apache.org/docs/latest/configuration.html#runtime-environment 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.