使用 BigQuery Spark 连接器通过 Datalab 从 Dataproc 连接到 BigQuery 时出错(从元数据服务器获取访问令牌时出错)

2024-04-25

我有 BigQuery 表、Dataproc 集群(带有 Datalab),并且遵循本指南:https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example

bucket = spark._jsc.hadoopConfiguration().get("fs.gs.system.bucket")
project = spark._jsc.hadoopConfiguration().get("fs.gs.project.id")

# Set an input directory for reading data from Bigquery.
todays_date = datetime.strftime(datetime.today(), "%Y-%m-%d-%H-%M-%S")
input_directory = "gs://{}/tmp/bigquery-{}".format(bucket, todays_date)

# Set the configuration for importing data from BigQuery.
# Specifically, make sure to set the project ID and bucket for Cloud Dataproc,
# and the project ID, dataset, and table names for BigQuery.

conf = {
    # Input Parameters
    "mapred.bq.project.id": project,
    "mapred.bq.gcs.bucket": bucket,
    "mapred.bq.temp.gcs.path": input_directory,
    "mapred.bq.input.project.id": project,
    'mapred.bq.input.dataset.id': 'my-test-dataset',
    'mapred.bq.input.table.id': 'test-table'
}

# Read the data from BigQuery into Spark as an RDD.
table_data = spark.sparkContext.newAPIHadoopRDD(
    "com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat",
    "org.apache.hadoop.io.LongWritable",
    "com.google.gson.JsonObject",
    conf=conf)

当我尝试连接时该脚本工作正常public数据集。但是,当我尝试连接到我的private数据集,我收到以下错误:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: java.io.IOException: Error getting access token from metadata server at: http://metadata/computeMetadata/v1/instance/service-accounts/default/token
    at com.google.cloud.hadoop.util.CredentialFactory.getCredentialFromMetadataServiceAccount(CredentialFactory.java:210)
    at com.google.cloud.hadoop.util.CredentialConfiguration.getCredential(CredentialConfiguration.java:75)
    at com.google.cloud.hadoop.io.bigquery.BigQueryFactory.createBigQueryCredential(BigQueryFactory.java:82)
    at com.google.cloud.hadoop.io.bigquery.BigQueryFactory.getBigQuery(BigQueryFactory.java:102)
    at com.google.cloud.hadoop.io.bigquery.BigQueryFactory.getBigQueryHelper(BigQueryFactory.java:90)
    at com.google.cloud.hadoop.io.bigquery.AbstractBigQueryInputFormat.getBigQueryHelper(AbstractBigQueryInputFormat.java:357)
    at com.google.cloud.hadoop.io.bigquery.AbstractBigQueryInputFormat.getSplits(AbstractBigQueryInputFormat.java:108)
    at org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:125)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
    at org.apache.spark.rdd.RDD$$anonfun$take$1.apply(RDD.scala:1333)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
    at org.apache.spark.rdd.RDD.take(RDD.scala:1327)
    at org.apache.spark.api.python.SerDeUtil$.pairRDDToPython(SerDeUtil.scala:203)
    at org.apache.spark.api.python.PythonRDD$.newAPIHadoopRDD(PythonRDD.scala:587)
    at org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD(PythonRDD.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:280)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.UnknownHostException: metadata
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:93)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
    at com.google.cloud.hadoop.util.CredentialFactory$ComputeCredentialWithRetry.executeRefreshToken(CredentialFactory.java:159)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
    at com.google.cloud.hadoop.util.CredentialFactory.getCredentialFromMetadataServiceAccount(CredentialFactory.java:208)
    ... 35 more

一些附加信息:

  1. 我通过 Datalab 使用 python (pySpark)(这是通过https://github.com/GoogleCloudPlatform/dataproc-initialization-actions/tree/master/datalab https://github.com/GoogleCloudPlatform/dataproc-initialization-actions/tree/master/datalab)
  2. BigQuery 数据位于美国,Dataproc 集群位于欧盟
  3. Dataproc 映像是最新的 (1.2)
  4. Dataproc 集群配置为具有 Google 范围内的 API 访问权限

根据您收到的错误消息(Error getting access token from metadata server at: http://metadata/computeMetadata/v1/instance/service-accounts/default/token [...] Caused by: java.net.UnknownHostException: metadata),看起来错误是在服务帐户无法检索访问令牌 https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#applications正确。

为了简化您的用例场景,我建议您首先缩小正在使用的产品范围(因为失败可能发生在不同的步骤中)。为此,我建议您直接从已运行的 Dataproc 集群运行 PySpark 代码,如下所示文档中解释了 https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example#reading_and_writing_data_from_bigquery:

  1. 转到 GCP Console 中的 Dataproc > 集群菜单。
  2. 进入您正在使用的集群,然后进入“VM 实例”选项卡。
  3. 单击主节点名称旁边的“SSH”按钮,通过 SSH 连接到主节点。
  4. 创建脚本words.py包含您要运行的 PySpark 代码。
  5. 使用命令运行脚本spark-submit words.py.

执行此操作后,检查是否收到相同的错误消息。如果这样做,问题应该出在 Dataproc/BigQuery 端。如果不这样做,它很可能位于 Datalab 中。我的猜测是您会收到相同的错误消息,因为它看起来像是凭据问题。

一旦您(可能)确定了问题所在,通过 SSH 连接到集群中的主节点后,通过在终端中运行以下命令来查看您正在使用哪个服务帐户:

gcloud auth list

还要确保环境变量GOOGLE_APPLICATION_CREDENTIALS通过运行以下命令为空。如果为空,则运行该节点的VM实例将使用GCE的默认服务帐户(该帐户应该是您在运行时获得的帐户)gcloud auth list,因为 Dataproc 在 GCE 实例上运行)。如果它不为空,它将使用此环境变量指向的凭据文件。使用默认凭据还是自定义凭据是一种实现选择。

echo $GOOGLE_APPLICATION_CREDENTIALS

一旦您知道正在使用哪个服务帐户,请移至控制台中的 IAM 选项卡,并检查该服务帐户是否具有权限访问 BigQuery 的角色和权限 https://cloud.google.com/bigquery/docs/access-control#predefined_roles_details.

我的猜测是该问题可能与正在使用的服务帐户有关,并且可能GOOGLE_APPLICATION_CREDENTIALS指向错误的位置,因此您应该首先确保您的身份验证配置正确;为此,我将直接从主节点内部运行代码,以简化用例并减少涉及的组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BigQuery Spark 连接器通过 Datalab 从 Dataproc 连接到 BigQuery 时出错(从元数据服务器获取访问令牌时出错) 的相关文章

  • 将仅限 HTTPS 的自定义域正确分配给 flex env

    将自定义域映射到 Google App Engine 项目的正确方法是什么 我已经添加了自定义域 设置了所有 DNS 记录等 并且它正在工作 但如何仅强制执行 HTTPS 就像生成的自定义域一样 从阅读周围many我看过的帖子secure
  • 项目未出现在“gcloud 项目列表”中

    我在 Google Cloud 控制台中添加了一个项目 但使用 gcloud SDK gcloud 项目列表 未显示该项目 我是在做一些愚蠢的事情还是我错过了什么 Edit 您是否为新帐户使用不同的凭据 否 该帐户是在控制台和sdk控制台上
  • 使用 Airflow BigqueryOperator 向 BigQuery 表添加标签

    我必须向 bigquery 表添加标签 我知道可以通过 BigQuery UI 来完成此操作 但如何通过气流运算符来完成此操作 Use case 用于计费和搜索目的 由于多个团队在同一项目和数据集下工作 我们需要将各个团队创建的所有表组合在
  • bigquery url 解码

    有没有一种简单的方法可以在 BigQuery 查询语言中进行网址解码 我正在使用一个表 该表有一列包含某些值中的 URL 编码字符串 例如 http xyz com example php url http 3A 2F 2Fwww exam
  • 谷歌云sftp的权限

    我正在使用 wordpress 和 google cloud 并将其设置为 sftp 连接 文件夹的权限是755 文件的权限是644 即使我已经将Cloud API访问范围更改为 允许完全连接 当我尝试通过 WordPress 后端添加插件
  • 解析 dockerfile 路径时出错:请使用 --dockerfile 在构建上下文中提供 Dockerfile 的有效路径

    apiVersion v1 kind Pod metadata name kaniko spec containers name kaniko image gcr io kaniko project executor latest args
  • Jenkinsfile 泊坞窗

    我正在 docker 容器内的 GCE 上运行一个 jenkins 实例 并希望从此 Jenkinsfile 和 Github 执行多分支管道 我正在使用GCE詹金斯 https cloud google com solutions con
  • 从 Google Build 部署 Google Cloud 功能

    当尝试部署一个简单的功能时 我遇到了 403 错误 这是我的完整 yaml steps Install Dependencies name python id Pip install args pip3 install r requirem
  • 无法在 GAE 应用程序中使用 google-cloud

    我的 Google App Engine 应用程序中的以下行 webapp py 无法导入谷歌云 https googlecloudplatform github io google cloud python 图书馆 from google
  • 根据 Google BigQuery 中的查询结果创建表

    我们正在使用谷歌大查询 https developers google com bigquery 通过Python API 如何根据查询结果创建一张表 新表或覆盖旧表 我回顾了查询文档 https developers google com
  • next-auth google 提供商无法正常工作,访问被阻止:此应用程序的请求无效

    这整个星 期我都在摸索 我已经尝试了几乎所有的方法 我正在尝试使用 next auth google 提供商 在 GCP 中 在授权网址和重定向网址中 本地主机 3000 真实域名网站 本地主机 3000 api auth callback
  • kubernetes nginx ingress 无法将 HTTP 重定向到 HTTPS

    我有一个托管在 Google Cloud 平台中的网络应用程序 该应用程序位于负载均衡器后面 而负载均衡器本身位于入口后面 入口设置了 SSL 证书 并按预期接受 HTTPS 连接 但有一个问题 我无法让它将非 HTTPS 连接重定向到 H
  • 如何更改 google dataprep 的数据流作业运行的区域/区域

    我可以在 google dataprep 中设置生成的数据流作业将运行的区域吗 例如 我正在将欧洲存储桶中的 CSV 数据转换为欧洲的 BigQuery 数据集 但数据流作业在 US central 1 中运行 效果不好 提前感谢您的帮助
  • Bigquery:如何声明数组变量并使用 select 语句设置数据?

    我试图在 BigQuery 上声明一个数组变量 但无法在变量中放入 SQL 语句 我找不到任何与此相关的主题 我想将表的所有列名放入变量中 所以我尝试了以下方法 DECLARE my array ARRAY
  • 以有效的方式从 BigQuery 读取到 Spark 中?

    使用时BigQuery 连接器 https cloud google com hadoop examples bigquery connector spark example要从 BigQuery 读取数据 我发现它首先将所有数据复制到 G
  • Google云平台项目限制

    我可以在 Google Cloud Platform 帐户上创建的项目有限制吗 我将为同一客户托管多个应用程序 我的想法是每个应用程序一个项目 这是一个好主意吗 或者最好将所有应用程序拆分为前端和后端两个项目 您可以创建的项目数量有配额 2
  • 使用 NodeJS 从 GCP 存储下载对象

    我在用着 google cloud 存储 https www npmjs com package google cloud storage从节点应用程序访问 Google Cloud Storage 存储桶内的对象 但我无法使其工作 我已在
  • 如何更改谷歌云数据存储类型名称?

    我们正在使用google cloud datastore存储数据 不幸的是最初没有遵循命名约定kinds现在我们想要改变数据存储中已存在的种类的名称 我们已经积累了大量的数据 并且生成这些数据涉及大量的计算 因此仅仅为了重命名一种类型而再次
  • 使用 TensorFlow 2.1 的 Cloud TPU v3 Pod 的 TPUClusterResolver 出现错误

    我正在尝试在带有 TensorFlow 2 1 的 Google Cloud Compute Engine VM 上使用我的 抢占式 Cloud TPU v3 256 但它似乎无法正常工作TPUClusterResolver抛出一个Coul
  • GKE 出现错误:ImagePullBackOff 和错误:ErrImagePull 错误

    当 kubectl 应用 yaml 将自定义构建的 docker 映像部署到 GCP 中的集群 编辑掉敏感信息 时 我收到以下错误 已尝试以下但没有运气 手动部署镜像 检查以确保防火墙规则允许 443 并且没有任何东西阻止它 尝试将容器注册

随机推荐