我想使用Google Dataproc和不同的项目ID运行一些pyspark工作,但到目前为止还没有成功。我是pyspark和Google Cloud的新手,但我遵循this示例并运行良好(如果BigQuery数据集是公共的或属于我的GCP项目,即ProjectA)。输入参数如下所示:
bucket = sc._jsc.hadoopConfiguration().get('fs.gs.system.bucket')
projectA = sc._jsc.hadoopConfiguration().get('fs.gs.project.id')
input_directory ='gs://{}/hadoop/tmp/bigquery/pyspark_input'.format(bucket)
conf = {
# Input Parameters
'mapred.bq.project.id': projectA,
'mapred.bq.gcs.bucket': bucket,
'mapred.bq.temp.gcs.path': input_directory,
'mapred.bq.input.project.id': 'projectA',
'mapred.bq.input.dataset.id': 'my_dataset',
'mapred.bq.input.table.id': 'my_table',
}
# Load data in from BigQuery.
table_data = sc.newAPIHadoopRDD(
'com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat',
'org.apache.hadoop.io.LongWritable',
'com.google.gson.JsonObject',
conf=conf)
但我需要的是从ProjectB的BQ数据集运行一个作业(我有查询它的凭据),所以在设置输入参数时,如下所示:
conf = {
# Input Parameters
'mapred.bq.project.id': projectA,
'mapred.bq.gcs.bucket': bucket,
'mapred.bq.temp.gcs.path': input_directory,
'mapred.bq.input.project.id': 'projectB',
'mapred.bq.input.dataset.id': 'the_datasetB',
'mapred.bq.input.table.id': 'the_tableB',
}
并尝试从BQ加载数据,我的脚本保持无限运行。我该如何正确设置?
仅供参考,在我之前提到的example之后,我可以看到在Google Storage中创建了2个地毯(shard-0和shard-1)并包含相应的BQ数据,但我的工作只有碎片-0已创建且为空。
答案 0 :(得分:0)
我和我的同事丹尼斯谈过,这是他的建议:
"嗯,不确定,它应该有效。他们可能想用" bq"主节点内的CLI手动尝试一些" bq extract"将projectB表的工作放入他们的GCS桶中,因为所有的连接器都在引擎盖下。
如果我不得不猜测我怀疑他们只是意味着他们的个人用户名具有查询projectB的凭据,但projectA的默认服务帐户可能没有查询权限。 Dataproc VM中的所有内容都代表分配给VM的计算服务帐户,而不是最终用户。
他们可以
gcloud compute instances describe -m
在那里的某处列出了服务帐户的电子邮件地址。"