Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用Dataproc上的Spark进行跨帐户GCS访问_Apache Spark_Google Cloud Platform_Google Bigquery_Google Cloud Storage_Google Cloud Dataproc - Fatal编程技术网

Apache spark 使用Dataproc上的Spark进行跨帐户GCS访问

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

我正在尝试使用在帐户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-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=