2017-11-22 3 views
2

Ich habe ein Fettglas, in Scala geschrieben, verpackt von sbt. Ich muss es in einem Spark-Cluster in AWS EMR verwenden.AWS EMR Spark Cluster - Schritte mit Scala Fett JAR, nicht finden MainClass

Es funktioniert gut, wenn ich das Glas an den Master manuell die Cluster-spin up, kopieren und eine Funken einreichen Job mit einem Befehl wie folgt ausführen ...

spark-submit --class org.company.platform.package.SparkSubmit --name platform ./platform-assembly-0.1.0.jar arg0 arg1 arg2 

Aber ... wenn ich versuche, Um es dem EMR-Cluster als Schritt hinzuzufügen, schlägt es fehl. Das Protokoll stderr sieht wie folgt aus ...

Exception in thread "main" java.lang.ClassNotFoundException: package.SparkSubmit 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:278) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:214) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 

Die entsprechenden Einstellungen in meinem build.sbt so aussehen ...

lazy val root = (project in file(".")). 
    settings(
    name := "platform", 
    version := "0.1.0", 
    scalaVersion := "2.10.5", 
    organization := "org.company", 
    mainClass in Compile := Some("package/SparkSubmit") 
) 

Die entsprechende Datei mit meinem Mainclass aussieht ...

package org.company.platform.package 

object SparkSubmit { 
    def main(args: Array[String]): Unit = { 
    // do stuff 
    } 
} 

in EMR-Konsole ... im Dialog "Schritt hinzufügen" ... neben der "Argument" -Box, heißt es ...

"Diese werden an die Hauptfunktion im JAR übergeben. Wenn die JAR keine Hauptklasse in seiner Manifest-Datei nicht angeben, können Sie angeben einen neuen Klassennamen als erstes Argument.“

würde ich denken, weil ich eine Hauptklasse in der build.sbt angeben, I "Es geht mir gut ... aber es schlägt fehl und protokolliert nichts über den Fehler. Wenn ich versuche, die Hauptklasse als erstes Argument anzugeben, protokolliert es den oben angegebenen Fehler.

Ich denke, es ist wahrscheinlich ein Formatieren Problem, aber ich kann nicht sortieren, wie es zu beheben, und keine Beispiele kommen.Ich habe versucht, die folgenden als Argumente in der "Add Step" -Dialogfeld ...

arg0 arg1 arg2 
package.SparkSubmit arg0 arg1 arg2 
package/SparkSubmit arg0 arg1 arg2 
org.company.platform.package.SparkSubmit arg0 arg1 arg2 

Ein paar andere auch, aber nichts funktioniert.

Version Info ... EMR 4.3 Spark-1.6 Scala 2.10 sbt 0.13.9

Irgendwelche Ideen, was dumme Fehler, den ich, dass mache ist nicht im Stich gelassen EMR/Funken meine Hauptklasse finden?

Danke.

Antwort

2

BEARBEITEN - haben Sie das zu "arbeiten", indem Sie Probleme 1-6 gehen weg, aber dann der Cluster nur irgendwie saß dort sagen, es war "Laufen" den ersten Schritt, aber es nie beendet. Ich hatte irrtümlicherweise Step-Typ auf "benutzerdefinierte Jar" anstelle von "Funken Anwendung" gesetzt. Nachdem ich das geändert habe, denke ich, dass nur der Fix für "Problem 1" relevant war, und das allein könnte mein Problem behoben haben. Ich musste die Fixes für die Probleme 2, 3 und 5 unten zurückstellen, um es mit "Funkenanwendungs" Schritten zu arbeiten, und ich vermute, dass ich auch den Rest von ihnen zurückgeben kann. ENDE BEARBEITEN

Ich verbrachte eine lange Zeit damit, dies zu arbeiten. Ich poste die Fehler und Fixes für den Fall, dass es für jemand anderen auf der Straße nützlich ist.

Problem 1

egal, was ich als erste arg auf die Mainclass zu versuchen und Punkt passiert in ... Ich habe den gleichen Fehler. Das Problem war in meinem Build.SBT. Ich (fälschlicherweise) dachte, Organisation und Name in root waren genug, um das Paketpräfix bereitzustellen.

Ich änderte Mainclass in build.sbt in ihm mein erklärtes Paket am Anfang der Datei mit meinem SparkSubmit Objekt paßt ...

mainClass in Compile := Some("org.company.platform.package.SparkSubmit") 

dann in dem „Schritt hinzufügen“ -Dialog, ich bestehen nur in den Argumenten keine Klassenbezeichnung ... also einfach "arg0 arg1 arg2".

Interessante Referenz, wenn Sie verschiedene Mainclass ist im Manifest gegen den Lauf setzen wollen ... How to set main class in build?

Problem 2

Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration 

ich diese Referenz gefunden ... https://spark.apache.org/docs/latest/submitting-applications.html#master-urls

Ich wusste nicht, welchen ich verwenden soll, aber da EMR Garn verwendet, setze ich es auf "Garn". Das war falsch. (es als Aufzeichnung des nachfolgenden Fehler verlassen sie erzeugt) In SparkSubmit.main(), habe ich Master-URL wie folgt ...

val conf = 
    new SparkConf() 
    .setMaster("yarn") 
    .setAppName("platform") 

Problem 3

Der Master-URL Fehler ging weg, und jetzt das war mein Fehler ...

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf 

in meinem build.sbt ... ich hatte funken Kern und funkt sQL, die als „zur Verfügung gestellt“ in libraryDependencies ... ich habe keine Ahnung, Warum funktioniert das nicht als ein EMR-Schritt, da der Cluster Spar hat k geladen ... aber ich entfernt, dass und änderte es zu ...

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.6.0", // % "provided", 
    "org.apache.spark" %% "spark-sql" % "1.6.0", // % "provided", 
    ... 
) 

Hinweis - nach dem Entfernen „zur Verfügung gestellt“ habe ich eine neue Fehlermeldung anzeigt, aber eine Änderung der Versionen von Funken-Core und funken SQL 1.6 .0 zu EMR 4.3 zu passen, machte das weg.

Problem gelöst ... neu erstellt!

Problem 4

Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version' 

Die Antwort war ... https://doc.akka.io/docs/akka/snapshot/general/configuration.html#when-using-jarjar-onejar-assembly-or-any-jar-bundler

Grundsätzlich wurde Akka des reference.conf verloren. Meine build.sbt MergeStrategy sah so aus ...

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case _ => MergeStrategy.first 
    } 
} 

Ich änderte es, um stattdessen so auszusehen ...

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case "reference.conf" => MergeStrategy.concat 
    case "application.conf" => MergeStrategy.concat 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case _ => MergeStrategy.first 
    } 
} 

Problem 5

I "Garn" erraten war nicht die richtige Wahl in Problem 2. Ich habe diesen Fehler ...

Exception in thread "main" org.apache.spark.SparkException: Could not parse Master URL: 'yarn' 

änderte ich die URL " local [2] "...

val conf = 
    new SparkConf() 
    .setMaster("local[2]") 
    .setAppName("starling_for_mongo") 

Kein gültiger Grund für diesen Wert ... nicht sicher, wie viele Thre ads, die ich tatsächlich brauche ... oder wo das überhaupt angewendet wird ... ist es im master oder irgendwo in einem vm ... ich bin mir nicht sicher. Muss das mehr verstehen, aber ich habe nur kopiert, was hier war, weil ... uh ... warum nicht? https://spark.apache.org/docs/1.6.1/configuration.html#spark-properties

Sie müssen verstehen, was hier eingestellt wird.

Problem 6

Nächstes viel Serialisierung Fehler kam. Ich verstehe nicht warum, als der ganze Code ohne Probleme als manuelles Funkensenden oder in Spark-Shell lief. Ich reparierte es, indem ich im Wesentlichen durchging und jede Klasse Serializable erweitern ließ.

Ende

Das ist meine Reise ein Arbeits Glas in scala geschrieben war immer und mit sbt zusammengestellt als Schritt in einem EMR Funken Cluster zu funktionieren. Ich hoffe, das hilft jemand anderem da draußen.