9

我在本地機器上寫了一個Spark作業,該作業使用谷歌雲端存儲從Google雲端存儲中讀取該文件,如gs://storage.googleapis.com/ as在https://cloud.google.com/dataproc/docs/connectors/cloud-storage中提到無法使用來自Spark的GSC連接器連接Google存儲文件

我已設置服務帳戶具有計算引擎和存儲權限。 我的火花配置和代碼是

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", "[email protected]"); 
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指向密鑰文件。我試過使用兩個密鑰文件,即json & P12。但無法訪問該文件。 這是我得到的錯誤是

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,火花2.2.0依賴和GCS-連接器1.6.1.hadoop2。 我只需要使用服務帳戶而不是OAuth機制進行連接。

在此先感謝

+0

您是否嘗試過設置'sparkContext.hadoopConfiguration'您的參數,而不是' SparkConf'? –

回答

0

你在本地嘗試嗎?如果是的話,那麼你需要的環境變量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", "[email protected]"); 
    hadoopConfiguration.set("google.cloud.auth.service.account.keyfile", "/root/Documents/xxx-compute-e71ddbafd13e.p12");