无法使用 Spark 中的 GSC 连接器连接 Google Storage 文件

Posted

技术标签:

【中文标题】无法使用 Spark 中的 GSC 连接器连接 Google Storage 文件【英文标题】:Unable to connect Google Storage file using GSC connector from Spark 【发布时间】:2018-03-06 13:39:41 【问题描述】:

我在本地机器上编写了一个 spark 作业,它使用像 https://cloud.google.com/dataproc/docs/connectors/cloud-storage 中提到的 gs://storage.googleapis.com/ 之类的 google hadoop 连接器从 google 云存储读取文件/p>

我已设置具有计算引擎和存储权限的服务帐户。 我的 spark 配置和代码是

SparkConf conf = new SparkConf();
conf.setAppName("SparkAPp").setMaster("local");
conf.set("google.cloud.auth.service.account.enable", "true");
conf.set("google.cloud.auth.service.account.email", "xxx-compute@developer.gserviceaccount.com");
conf.set("google.cloud.auth.service.account.keyfile", "/root/Documents/xxx-compute-e71ddbafd13e.p12");
conf.set("fs.gs.project.id", "xxx-990711");
conf.set("fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem");
conf.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem"); 

SparkContext sparkContext = new SparkContext(conf);
JavaRDD<String> data = sparkContext.textFile("gs://storage.googleapis.com/xxx/xxx.txt", 0).toJavaRDD();
data.foreach(line -> System.out.println(line));

我设置了环境变量,也名为 GOOGLE_APPLICATION_CREDENTIALS,它指向密钥文件。我尝试使用两个关键文件,即 jsonP12。但无法访问该文件。 我得到的错误是

java.net.UnknownHostException: metadata
java.io.IOException: Error getting access token from metadata server at: http://metadata/computeMetadata/v1/instance/service-accounts/default/token
        at com.google.cloud.hadoop.util.CredentialFactory.getCredentialFromMetadataServiceAccount(CredentialFactory.java:208)
        at com.google.cloud.hadoop.util.CredentialConfiguration.getCredential(CredentialConfiguration.java:70)

我正在使用 java 8、spark 2.2.0 依赖项和 gcs-connector 1.6.1.hadoop2 从 eclipse 运行我的工作。 我只需要使用服务帐户而不是通过 OAuth 机制进行连接。

提前致谢

【问题讨论】:

您是否尝试在sparkContext.hadoopConfiguration 而不是SparkConf 中设置参数? 【参考方案1】:

您是在本地尝试吗?如果是,那么您需要将环境变量GOOGLE_APPLICATION_CREDENTIALS 设置为您的key.json 或将其设置为HadoopConfiguration,而不是将其设置为SparkConf,例如:

    Configuration hadoopConfiguration = sparkContext.hadoopConfiguration();
    hadoopConfiguration.set("google.cloud.auth.service.account.enable", true);
    hadoopConfiguration.set("google.cloud.auth.service.account.email", "xxx-compute@developer.gserviceaccount.com");
    hadoopConfiguration.set("google.cloud.auth.service.account.keyfile", "/root/Documents/xxx-compute-e71ddbafd13e.p12");

【讨论】:

以上是关于无法使用 Spark 中的 GSC 连接器连接 Google Storage 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 HDP 3.1 中的仓库连接器的情况下将表从 spark 中写入 hive

无法在本地连接 S3 和 Spark

Spark 结构化流中的外部连接

无法使用 Spark 连接器从 GreenPlum 读取

无法使用 Spark cassandra 连接器 1.5.0 连接 Cassandra 3.0

无法从使用 mongo spark 连接器读取的 spark DF 中显示/写入。