Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 BigQuery连接器访问_Apache Spark_Google Bigquery_Google Cloud Dataproc - Fatal编程技术网

Apache spark 跨项目的DataProc BigQuery连接器访问

Apache spark 跨项目的DataProc BigQuery连接器访问,apache-spark,google-bigquery,google-cloud-dataproc,Apache Spark,Google Bigquery,Google Cloud Dataproc,我正在编写一个Spark作业,以便在项目a中的DataProc集群上运行,但该作业本身将使用BigQuery连接器从项目B中的BigQuery实例中提取数据。我对这两个项目都有所有者权限,但作业是使用服务帐户运行的。我在堆栈跟踪中得到的响应如下: { "code" : 403, "errors" : [ { "domain" : "global", "message" : "Access Denied: Table ABC:DEF.ghi: The user me-com

我正在编写一个Spark作业,以便在项目a中的DataProc集群上运行,但该作业本身将使用BigQuery连接器从项目B中的BigQuery实例中提取数据。我对这两个项目都有所有者权限,但作业是使用服务帐户运行的。我在堆栈跟踪中得到的响应如下:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Access Denied: Table ABC:DEF.ghi: The user me-compute@developer.gserviceaccount.com does not have bigquery.tables.get permission for table ABC:DEF.ghi.",
    "reason" : "accessDenied"
  } ],
  "message" : "Access Denied: Table ABC:DEF.ghi: The user me-compute@developer.gserviceaccount.com does not have bigquery.tables.get permission for table ABC:DEF.ghi."
}

正如您所注意到的,Dataproc集群代表服务帐户而不是单个用户运行;这是有意的,因为不同的用户可能正在共享项目中创建Dataproc集群,他们不希望自己的个人权限在使用同一项目的组织的其他成员之间泄露,而是应该根据服务帐户定义权限,每个帐户代表特定的工作负载范围

在这种情况下,您所要做的就是进入项目B,并将项目A中的服务帐户添加为可以访问项目B中BQ的角色之一。如果这不是一个包含大量用户和不同团队的复杂安排,您可以将其添加为项目B中的“项目查看器”,否则您将需要更细粒度的服务,如“bigquery查看器”或“bigquery编辑器”


添加该服务帐户的方式与将任何用户添加到项目B的方式相同。

正如您所注意到的,Dataproc群集代表服务帐户而不是单个用户运行;这是有意的,因为不同的用户可能在共享项目中创建Dataproc群集,他们不希望自己的个人权限在其他项目中泄漏使用相同项目的组织成员,应该根据服务帐户定义权限,每个帐户代表特定的工作负载范围

在这种情况下,您所要做的就是进入项目B,并将项目A中的服务帐户添加为可以访问项目B中BQ的角色之一。如果这不是一个包含大量用户和不同团队的复杂安排,您可以将其添加为项目B中的“项目查看器”,否则您将需要更细粒度的服务,如“项目查看器”“bigquery查看器”或“bigquery编辑器”


添加该服务帐户的方式与将任何用户添加到project B中的方式相同。

为该服务帐户提供正确的访问权限已解决了该问题,但现在spark作业似乎挂起了。如果您在非归档导出模式下使用BigQuery连接器,则该作业必须等待BigQuery将数据导出到GCS,然后才能开始处理。S硬导出模式应允许更快地开始处理,但效率可能较低。如果您要重复读取数据而不改变数据,您也可以先手动将BQ导出到GCS,然后使用标准文件输入格式直接从spark作业中的GCS文件读取。嗯,好的,分片导出模式是不是是否可以启用?如果可以,如何启用?它由
mapred.bq.input.sharded.export.enable控制:但是,默认值实际上是“true”“已经,所以不清楚你的工作是否真的因为等待BigQuery导出而挂起。我想至少值得一试,把它打开和关闭;您可以在创建BigQuery输入时在代码中设置它,也可以在创建集群时将其设置为a,或者您可以在/etc/hadoop/conf/mapred-site.xml中手动设置它,为服务帐户提供正确的访问权限已修复了该问题,但现在如果您在非归档导出模式下使用BigQuery连接器,spark作业似乎会挂起,然后,作业必须等待BigQuery将数据导出到GCS,然后才能开始处理它。分片导出模式应允许更快地开始处理,但可能效率较低。如果您将重复读取数据而不改变数据,您也可以先手动从BQ导出到GCS,然后使用标准文件输入格式直接从spark作业中的GCS文件读取。嗯,好的,分片导出模式是我可以打开的吗?如果是,如何控制?它由
mapred.bq.input.sharded.export.enable控制:但是,默认值实际上已经是“true”,因此不清楚您的作业是否确实因为等待BigQuery导出而挂起。我想至少值得一试,把它打开和关闭;您可以在创建BigQuery输入时在代码中设置它,也可以在创建集群时将其设置为,或者可以在/etc/hadoop/conf/mapred-site.xml中手动设置它