Apache spark 使用Dataproc上的Spark进行跨帐户GCS访问
我正在尝试使用在帐户B的Dataproc上运行的Spark将帐户A的GCS中的数据摄取到帐户B的BigQuery中 我已尝试将Apache spark 使用Dataproc上的Spark进行跨帐户GCS访问,apache-spark,google-cloud-platform,google-bigquery,google-cloud-storage,google-cloud-dataproc,Apache Spark,Google Cloud Platform,Google Bigquery,Google Cloud Storage,Google Cloud Dataproc,我正在尝试使用在帐户B的Dataproc上运行的Spark将帐户A的GCS中的数据摄取到帐户B的BigQuery中 我已尝试将GOOGLE\u应用程序\u凭据设置为服务帐户密钥文件,该文件允许访问帐户A中的必要存储桶。但如果我启动spark shell,则会出现以下错误 Exception in thread "main" java.io.IOException: Error accessing Bucket dataproc-40222d04-2c40-42f9-a5de-413a123f94
GOOGLE\u应用程序\u凭据设置为服务帐户密钥文件,该文件允许访问帐户A中的必要存储桶。但如果我启动spark shell
,则会出现以下错误
Exception in thread "main" java.io.IOException: Error accessing Bucket dataproc-40222d04-2c40-42f9-a5de-413a123f949d-asia-south1
根据我的理解,设置环境变量是将访问权限从帐户B切换到帐户A
是否有一种方法可以同时访问Spark内的帐户,即默认访问帐户B和额外访问帐户a
更新:我试着用符合的配置运行spark shell
,但错误仍然存在。这是我尝试的命令和堆栈跟踪
$ spark-shell --conf spark.hadoop.fs.gs.auth.service.account.json.keyfile=/home/shasank/watchful-origin-299914-fa29998bad08.json --jars gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar
要实现这一点,您需要重新配置GCS和BQ连接器,以使用不同的服务帐户进行身份验证,默认情况下,它们都使用GCE VM服务帐户
为此,请参阅地面军事系统连接器配置手册中的
相同的配置适用于Hadoop BQ连接器,但您需要将属性名称中的fs.gs.
前缀替换为BQ.mapred.
前缀:
spark.hadoop.fs.gs.auth.service.account.json.keyfile=/path/to/local/gcs/key/file.json
spark.hadoop.bq.mapred.auth.service.account.json.keyfile=/path/to/local/bq/key/file.json
更新:
要在GCS连接器初始化期间禁用Dataproc暂存存储桶检查,您需要使用最新的GCS连接器版本(目前为1.9.17),并将GCS连接器系统存储桶属性设置为空字符串:
spark.hadoop.fs.gs.system.bucket=
请注意,在即将推出的GCS connector 2.0中,此系统存储桶功能已被删除,因此这不会成为未来的问题。您是否授权您的服务帐户访问您的存储桶?当你谈到“账户”时,你能说得准确些吗?您是否了解项目或服务帐户?是的,服务帐户有权访问bucket。我所说的“账户”是指“GCP账户”。更具体地说,账户A是我客户的GCP账户,账户B是我构建数据湖的GCP账户。哪个角色?对象读取器或bucket管理员?存储对象查看器角色。嗯,试试存储管理员。我的猜测如下:有时,库在获取对象之前执行bucket.list API调用,但不知道为什么,而且这与语言不同。如果需要,您可以仅使用bucket.list和bucket.get权限创建自定义角色以减少权限。我尝试过这样做,但当我为帐户a使用GCS密钥文件时,DataProc会失去对其自己的GCS的访问权限(我相信它会使用它来存储临时文件)。因此,它导致了与我最初发布的相同的错误。我认为它不允许我在spark.hadoop.fs.gs.auth.service.account.json.keyfile中指定两个密钥文件,但我会尝试。您需要一个在两个项目中具有权限的服务帐户。此外,设置GOOGLE\u APPLICATION\u凭据可能会产生意外后果,因为它不仅适用于地面军事系统和BQ连接器,但对于所有Google API客户端库。当它抱怨访问暂存存储桶时,您是否可以发布一个完整的堆栈跟踪?在这种情况下,您需要创建一个可以访问您想要的GCS和BQ的服务帐户,因为您尝试执行的操作目前不受支持
spark.hadoop.fs.gs.system.bucket=