我正在尝试从Google Cloud Storage读取pyspark DataFrame,但我不断收到服务帐户没有storage.objects.create权限的错误。该帐户没有 WRITER 权限,但它只是读取镶木地板文件:
spark_session.read.parquet(input_path)
18/12/25 13:12:00 INFO com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl: Repairing batch of 1 missing directories.
18/12/25 13:12:01 ERROR com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl: Failed to repair some missing directories.
com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "***.gserviceaccount.com does not have storage.objects.create access to ***.",
"reason" : "forbidden"
} ],
"message" : "***.gserviceaccount.com does not have storage.objects.create access to ***."
}
我们发现了问题。这是由于GCS连接器中的隐式自动修复功能。我们通过将fs.gs.implicit.dir.repair.enable
设置为 false
来禁用此行为。
请看这个问题:为什么在使用saveAsTextFile时,在Google Dataproc中运行的Spark将临时文件存储在外部存储(GCS)上,而不是本地磁盘或HDFS上?
Spark 将在执行某些操作时创建临时文件。从GCS文件中提取数据并转换为用户定义的对象时,我遇到了这个问题。它也可以在加载到 BQ 时执行此操作,因为写入存储然后从 GCS 执行单个加载更有效。您可以在此处看到执行此操作的更改。
可悲的是,据我所知,我没有具体的链接可以给你,因为这个问题没有记录在案。我会尽力为您找到一个,如果我成功了,我会更新我的回复。