2016-07-04 14 views
1

Ich habe Spark Stand-alone-Setup auf EC2-Instanzen. Ich versuche, den Cluster-Modus zum Übermitteln einer Spark-Anwendung zu verwenden. Das Jar befindet sich in S3 und der Zugriff darauf wird über IAM-Rollen eingerichtet. Ich kann aws s3 cp s3: //bucket/dir/foo.jar ausführen. um die JAR-Datei zu bekommen - das funktioniert gut. Wenn ich jedoch Folgendes ausführe:Spark senden Cluster-Modus von s3

spark-submit --master spark://master-ip:7077 --class Foo 
--deploy-mode cluster --verbose s3://bucket/dir/foo/jar 

Ich bekomme den unten beschriebenen Fehler. Wenn die IAM-Rollen in den Boxen so konfiguriert sind, dass sie den Zugriff erlauben, wie würde der Job dann korrekt übermittelt? Der Job selbst verwendet S3 überhaupt nicht ... das Problem scheint den Jar von S3 zu holen.

Jede Hilfe wird geschätzt.

16/07/04 11:44:09 ERROR ClientEndpoint: Exception from cluster was: java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3 URL, or by setting the fs.s3.awsAccessKeyId or fs.s3.awsSecretAccessKey properties (respectively). 
java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3 URL, or by setting the fs.s3.awsAccessKeyId or fs.s3.awsSecretAccessKey properties (respectively). 
     at org.apache.hadoop.fs.s3.S3Credentials.initialize(S3Credentials.java:66) 
     at org.apache.hadoop.fs.s3.Jets3tFileSystemStore.initialize(Jets3tFileSystemStore.java:82) 
     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 org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:85) 
     at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:62) 
     at com.sun.proxy.$Proxy5.initialize(Unknown Source) 
     at org.apache.hadoop.fs.s3.S3FileSystem.initialize(S3FileSystem.java:77) 
     at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1446) 
     at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:67) 
     at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1464) 
     at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:263) 
     at org.apache.spark.util.Utils$.getHadoopFileSystem(Utils.scala:1686) 
     at org.apache.spark.util.Utils$.doFetchFile(Utils.scala:598) 
     at org.apache.spark.util.Utils$.fetchFile(Utils.scala:395) 
     at org.apache.spark.deploy.worker.DriverRunner.org$apache$spark$deploy$worker$DriverRunner$$downloadUserJar(DriverRunner.scala:150) 
     at org.apache.spark.deploy.worker.DriverRunner$$anon$1.run(DriverRunner.scala:79) 
+0

Ich bin nicht sicher, Spark weiß, wie man mit IAM-Rollen arbeitet. Ich denke, wir haben es auch hier ausprobiert und es ist fehlgeschlagen. Beim Senden von Funke-Jobs im Cluster-Modus wird der Port standardmäßig auf 6066 gesetzt, wenn ich mich richtig erinnere, Sie können ihn in der Spark-Benutzeroberfläche oben links ansehen. –

+0

Was hast du am Ende gemacht? Ich habe versucht, das Glas herunterzuladen. Der Client-Modus funktioniert, aber der Cluster-Modus scheint das Jar nicht auf die Knoten zu kopieren. – ashic

+0

Der Client-Modus funktioniert, weil Spark einen Jetty-HTTP-Server einrichtet, der die Jars an die Worker verteilt, wo sie im Cluster-Modus auf S3 zugreifen müssen. Wir führen derzeit unseren Streaming-Job im Client-Modus aus. –

Antwort

0

Ich habe einen Workaround gefunden. Ich legte das Glas in einen statischen HTTP-Server und verwenden Sie http://server/foo.jar in Spark-submit. Das scheint zu funktionieren.

+0

Sie können den Zugriffsschlüssel und den geheimen Schlüssel immer in der S3-URL angeben :) –

+0

Das ist ein Problem, da ich keinen Zugriff und keinen geheimen Schlüssel habe ... die Boxen erhalten Zugriff mit IAM-Rollen. :) – ashic

+0

Es muss eine bessere Möglichkeit geben, mit AWS zu arbeiten. Ich teste gerade die Ausfallsicherheit mit dem Cluster-Modus und dem Flag "--supervise". Funktioniert nicht wirklich, wenn der Arbeitscomputer beendet wird, auf dem der Treiber ausgeführt wird. Wenn ich das sortiert habe, werde ich versuchen, mit S3 zu arbeiten, damit die IAM-Rolle funktioniert. –