2014-06-05 8 views
9

Ho un piccolo cluster con 3 macchine e un'altra macchina per lo sviluppo e il testing. Durante lo sviluppo, ho impostato SparkContext su local. Quando tutto è a posto, voglio distribuire il file Jar che costruisco su ogni nodo. Fondamentalmente ho spostato manualmente questo jar su cluster e copiato su HDFS condiviso dal cluster. Poi ho potuto cambiare il codice per:Come semplificare la distribuzione del mio Jar a Spark Cluster in modalità standalone?

//standalone mode 
val sc = new SparkContext(
    "spark://mymaster:7077", 
    "Simple App", 
    "/opt/spark-0.9.1-bin-cdh4", //spark home 
    List("hdfs://namenode:8020/runnableJars/SimplyApp.jar") //jar location 
) 

a correre nel mio IDE. La mia domanda: c'è un modo più semplice per spostare questo vaso sul cluster?

risposta

23

In Spark, il programma che crea SparkContext è chiamato "il driver". È sufficiente che il file jar con il tuo lavoro sia disponibile al file system locale del driver per poterlo prelevare e spedirlo al master/worker.

In concreto, la vostra configurazione sarà simile:

//favor using Spark Conf to configure your Spark Context 
val conf = new SparkConf() 
      .setMaster("spark://mymaster:7077") 
      .setAppName("SimpleApp") 
      .set("spark.local.ip", "172.17.0.1") 
      .setJars(Array("/local/dir/SimplyApp.jar")) 

val sc = new SparkContext(conf) 

Sotto il cofano, il conducente inizia un server in cui i lavoratori scaricare il file jar (s) dal driver. È quindi importante (e spesso un problema) che i lavoratori abbiano accesso alla rete al conducente. Questo può essere spesso garantito impostando 'spark.local.ip' sul driver in una rete accessibile/instradabile dai lavoratori.

+4

Puoi anche usare 'SparkContext.jarOfClass (this.getClass)' invece di codificarlo con 'Array ("/local/dir/SimplyApp.jar ")'. – samthebest

+2

@samthebest quel metodo determina il jar da cui è stata caricata la classe fornita e funziona bene per le dipendenze ma potrebbe non funzionare per la classe driver che in un IDE non sarà stata caricata da un JAR. Il modo più semplice è quello di costruire un uberjar con Maven Shade o l'assembly SBT e fornirlo come dipendenza unica. – maasg

+2

Solo FWIW questa risposta dipende dall'accettare l'impostazione predefinita per --deploy-mode che è client, se si utilizza il cluster --deploy-mode allora non si sa su quale nodo di lavoro verrà eseguito il driver, quindi quindi si è necessario che questi vasi siano visibili a tutti i lavoratori, per Advanced Dependency Management è comunque una buona idea perché riduce il traffico di rete. http://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management. Inoltre i vasi non vengono spediti al master in quanto il master non tratta il codice, ma solo la programmazione del codice, ovvero "applicazioni" in Spark – JimLohse

Problemi correlati