2015-08-28 11 views
9

Nach dem Spark on Mesos docs man die spark.executor.uri die auf eine Zündverteiler einstellen muss:Wie Pre-Paket externen Bibliotheken bei der Verwendung von Funken auf einer Mesos Cluster

val conf = new SparkConf() 
    .setMaster("mesos://HOST:5050") 
    .setAppName("My app") 
    .set("spark.executor.uri", "<path to spark-1.4.1.tar.gz uploaded above>") 

Die docs beachten Sie auch, dass man eine benutzerdefinierte bauen Version der Spark-Distribution.

jetzt meine Frage, ob es möglich/wünschenswert ist, im Voraus Paket externen Bibliotheken wie

  • Funken Streaming-kafka
  • Elasticsearch Funken
  • Funken csv

, die in den meisten Job-Gläsern verwendet werden, die ich über spark-submit an

senden werde
  • die Zeit sbt assembly Notwendigkeit reduzieren die Fett Gläser
  • reduzieren die Größe der Fett Gläser, die

Wenn dies der Fall vorgelegt werden müssen, um verpacken, wie kann dies erreicht werden? Gibt es im Allgemeinen einige Hinweise darauf, wie die Herstellung von Fettimpulsen im Auftragseingabeprozess beschleunigt werden kann?

Hintergrund ist, dass ich einige Code-Generierung für Spark-Jobs ausführen möchte, und diese sofort absenden und die Ergebnisse in einem Browser-Frontend asynchron zeigen. Der Frontend-Teil sollte nicht zu kompliziert sein, aber ich frage mich, wie der Backend-Teil erreicht werden kann.

+0

Wenn Sie Pre-Paket sagen meinen verteilen Sie wirklich an alle Slaves und die Arbeitsplätze einrichten, diese Pakete zu verwenden, so dass Sie diese nicht jedes Mal herunterladen müssen? Das mag eine Option sein, klingt aber etwas umständlich. – hartem

Antwort

0

Nachdem ich das Spark JobServer Projekt entdeckt, entschied ich mich, dass dies die am besten geeignete für meinen Anwendungsfall ist.

Es unterstützt die dynamische Kontext-Erstellung über eine REST-API sowie das Hinzufügen von JARs zum neu erstellten Kontext manuell/programmgesteuert. Es ist auch in der Lage, synchrone Jobs mit geringer Latenz auszuführen, was genau das ist, was ich brauche.

Ich habe eine Dockerfile erstellt, so dass Sie es mit den neuesten (unterstützten) Versionen von Spark (1.4.1), Spark JobServer (0.6.0) und eingebauten Mesos-Unterstützung (0.24.1) ausprobieren können:

Referenzen:

2

Wenn Sie Pre-Package sagen, meinen Sie wirklich, an alle Slaves zu verteilen und die Jobs einzurichten, um diese Pakete zu verwenden, so dass Sie diese nicht jedes Mal herunterladen müssen? Das mag eine Option sein, aber es klingt ein bisschen umständlich, weil es nicht einfach ist, alles an die Slaves zu verteilen und alle Pakete auf dem neuesten Stand zu halten.

Wie wäre es, wenn Sie Ihre .tar.gz in kleinere Teile zerlegen, so dass Ihre Aufträge statt einer einzigen Datei mehrere kleinere Dateien enthalten? In diesem Fall sollte es möglich sein, die Mesos Fetcher Cache zu nutzen. So sehen Sie schlechte Leistung, wenn der Agent-Cache kalt ist, aber sobald es sich aufwärmt (d. H. Sobald ein Auftrag ausgeführt wird und die gemeinsamen Dateien lokal herunterlädt), werden fortlaufende Aufträge schneller abgeschlossen.

+0

Es handelt sich um eine Spark-Distribution, die mit 'spark.executor.uri' übergeben wurde und die für die Spark-Jobs benötigten Jars enthält, so dass die erzeugten fetten Jars kleiner werden können – Tobi

2

Ja, Sie können die Abhängigkeiten zu den Arbeitern kopieren und sie in das systemweite Verzeichnis jvm lib stellen, um sie in den Klassenpfad zu bekommen.

Dann können Sie diese Abhängigkeiten wie in Ihrem sbt-Build angegeben markieren und sie werden nicht in die Assembly aufgenommen. Dies beschleunigt die Montage und die Übertragungszeit.

Ich habe dies nicht auf Mesos speziell versucht, aber habe es auf Funken Standalone für Dinge, die in jeder Arbeit sind und selten ändern.

3

Erstellen Sie Beispiel Maven-Projekt mit allen Abhängigkeiten und verwenden Sie dann Maven-Plugin maven-shade-plugin. Es wird ein Schattenglas in Ihrem Zielordner erstellt.

Hier Probe pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com</groupId> 
    <artifactId>test</artifactId> 
    <version>0.0.1</version> 
    <properties> 
     <java.version>1.7</java.version> 
     <hadoop.version>2.4.1</hadoop.version> 
     <spark.version>1.4.0</spark.version> 
     <version.spark-csv_2.10>1.1.0</version.spark-csv_2.10> 
     <version.spark-avro_2.10>1.0.0</version.spark-avro_2.10> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>${java.version}</source> 
        <target>${java.version}</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <!-- <minimizeJar>true</minimizeJar> --> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
           <exclude>org/bdbizviz/**</exclude> 
          </excludes> 
         </filter> 
        </filters> 
        <finalName>spark-${project.version}</finalName> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> <!-- Hadoop dependency --> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-client</artifactId> 
      <version>${hadoop.version}</version> 
      <exclusions> 
       <exclusion> 
        <artifactId>servlet-api</artifactId> 
        <groupId>javax.servlet</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>guava</artifactId> 
        <groupId>com.google.guava</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <dependency> <!-- Spark Core --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-core_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark SQL --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-sql_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark CSV --> 
      <groupId>com.databricks</groupId> 
      <artifactId>spark-csv_2.10</artifactId> 
      <version>${version.spark-csv_2.10}</version> 
     </dependency> 
     <dependency> <!-- Spark Avro --> 
      <groupId>com.databricks</groupId> 
      <artifactId>spark-avro_2.10</artifactId> 
      <version>${version.spark-avro_2.10}</version> 
     </dependency> 
     <dependency> <!-- Spark Hive --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark Hive thriftserver --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive-thriftserver_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Wie in meiner Frage geschrieben, benutze ich SBT als Build Werkzeug ... Vielleicht werde ich den Maven-Weg morgen versuchen ... Danke trotzdem – Tobi

+0

yeah Sie können versuchen, Maven ist ein guter Weg, um diese Art von Dingen zu tun. – Kaushal