2

Comme indiqué dans le blog ci-dessous,Comment lire le fichier texte simple de Google Cloud Storage en utilisant programme local Spark-Scala

https://cloud.google.com/blog/big-data/2016/06/google-cloud-dataproc-the-fast-easy-and-safe-way-to-try-spark-20-preview

Je tentais de lire le fichier de Google Cloud Storage en utilisant Spark-scala. Pour que j'ai importé Google Cloud Storage Connector et Google Cloud Storage comme ci-dessous,

// https://mvnrepository.com/artifact/com.google.cloud/google-cloud-storage 
compile group: 'com.google.cloud', name: 'google-cloud-storage', version: '0.7.0' 

// https://mvnrepository.com/artifact/com.google.cloud.bigdataoss/gcs-connector 
compile group: 'com.google.cloud.bigdataoss', name: 'gcs-connector', version: '1.6.0-hadoop2' 

Après cela créé un simple fichier objet scala comme ci-dessous, (créé un sparkSession)

val csvData = spark.read.csv("gs://my-bucket/project-data/csv") 

Mais jette ci-dessous erreur,

17/03/01 20:16:02 INFO GoogleHadoopFileSystemBase: GHFS version: 1.6.0-hadoop2 
17/03/01 20:16:23 WARN HttpTransport: exception thrown while executing request 
java.net.SocketTimeoutException: connect timed out 
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:308) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:326) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1169) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:933) 
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:93) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981) 
    at com.google.cloud.hadoop.util.CredentialFactory$ComputeCredentialWithRetry.executeRefreshToken(CredentialFactory.java:158) 
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 
    at com.google.cloud.hadoop.util.CredentialFactory.getCredentialFromMetadataServiceAccount(CredentialFactory.java:205) 
    at com.google.cloud.hadoop.util.CredentialConfiguration.getCredential(CredentialConfiguration.java:70) 
    at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.configure(GoogleHadoopFileSystemBase.java:1816) 
    at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:1003) 
    at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:966) 
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2433) 
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88) 
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467) 
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449) 
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367) 
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:287) 
    at org.apache.spark.sql.execution.datasources.DataSource.hasMetadata(DataSource.scala:317) 
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:354) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149) 
    at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:413) 
    at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:349) 
    at test$.main(test.scala:41) 
    at test.main(test.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

J'ai installé tous les authentifications aussi bien. Vous ne savez pas comment le délai d'attente clignote.

Modifier

Je suis en train de passer au-dessus du code à travers IntelliJ Idea (Windows). Le fichier JAR pour le même code fonctionne correctement sur Google Cloud DataProc mais donne une erreur ci-dessus lorsque je l'exécute sur le système local. J'ai installé des plugins Spark, Scala, Google Cloud dans IntelliJ.

Une chose, j'avais créé par exemple Dataproc et a essayé de se connecter à l'adresse IP externe comme indiqué dans la documentation, https://cloud.google.com/compute/docs/instances/connecting-to-instance#standardssh

Il n'a pas été en mesure de se connecter au serveur donnant erreur Délai d'attente

Répondre

2

Merci Dennis d'avoir montré la direction du problème. Comme j'utilise Windows OS, il n'y a pas core-site.xml car hadoop n'est pas disponible pour Windows.

J'ai téléchargé étincelle pré-construit et dans le code lui-même configuré le paramètre mentionné par vous comme indiqué ci-dessous

créé un SparkSession et en utilisant le paramètre Hadoop configuré variable comme spark.SparkContext.hadoopConfiguration.set("google.cloud.auth.service.account.json.keyfile","<KeyFile Path>") et tous les autres paramètres dont nous avons besoin pour configurer dans le core-site.xml. Après avoir configuré tous ces paramètres, Programme peut accéder aux fichiers à partir de Google Cloud Storage.

3

Vous devez définir google.cloud.auth.service.account.json.keyfile sur le chemin d'accès local d'un fichier d'informations d'identification json pour un compte de service que vous créez en suivant these instructions for generating a private key. La trace de la pile montre que le connecteur pense qu'il est sur une machine virtuelle GCE et tente d'obtenir des informations d'identification à partir d'un serveur de métadonnées local. Si cela ne fonctionne pas, essayez de définir fs.gs.auth.service.account.json.keyfile à la place.

Lorsque vous essayez de SSH, avez-vous essayé gcloud compute ssh <instance name>? Vous devrez peut-être également vérifier vos règles de pare-feu Compute Engine pour vous assurer que vous autorisez les connexions entrantes sur le port 22.

+0

J'ai téléchargé le fichier de justificatif json pour une clé de compte de service et l'ai défini sur la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS car j'utilise Windows OS et j'ai essayé d'exécuter le programme mais j'ai eu la même erreur TimeOut. J'espère que j'ai pris la bonne façon de mettre en œuvre la suggestion que vous avez faite concernant google.cloud.auth.service.account.json.keyfile au chemin local d'un fichier json. Sinon, corrigez-moi s'il vous plaît. Je ne suis pas sûr où placer fs.gs.auth.service.account.json.keyfile. Si un document est disponible, veuillez suggérer toutes les configurations nécessaires pour travailler à partir de Windows OS. – Shawn

+0

En essayant de SSH, j'ai essayé gcloud de calculer ssh comme mentionné par vous mais il m'a aussi donné l'erreur TimeOut. – Shawn

+0

À ma grande surprise, je peux créer un compartiment dans Google Cloud Storage à l'aide de la classe Storage. Vous ne savez pas quel est le problème avec la lecture du fichier à partir du compartiment. – Shawn