2017-02-05 57 views
5

Utworzono 3-węzłowy (1 główny, 2 pracowników) klaster Apache Spark w AWS. Mogę przesłać zadania do klastra od mistrza, ale nie mogę go uruchomić zdalnie.Podłączanie do zdalnego Mistrza Spark - Java/Scala

/* SimpleApp.scala */ 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 

object SimpleApp { 
    def main(args: Array[String]) { 
    val logFile = "/usr/local/spark/README.md" // Should be some file on your system 
    val conf = new SparkConf().setAppName("Simple Application").setMaster("spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077") 
    val sc = new SparkContext(conf) 
    val logData = sc.textFile(logFile, 2).cache() 
    val numAs = logData.filter(line => line.contains("a")).count() 
    val numBs = logData.filter(line => line.contains("b")).count() 
    println(s"Lines with a: $numAs, Lines with b: $numBs") 
    sc.stop() 
    } 
} 

widzę od mistrza:

Spark Master at spark://ip-171-13-22-125.ec2.internal:7077 
URL: spark://ip-171-13-22-125.ec2.internal:7077 
REST URL: spark://ip-171-13-22-125.ec2.internal:6066 (cluster mode) 

więc kiedy wykonanie SimpleApp.scala z moim komputerze lokalnym, to nie trafia do żadnego z tej Spark Master:

2017-02-04 19:59:44,074 INFO [appclient-register-master-threadpool-0] client.StandaloneAppClient$ClientEndpoint (Logging.scala:54) [] - Connecting to master spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077... 
2017-02-04 19:59:44,166 WARN [appclient-register-master-threadpool-0] client.StandaloneAppClient$ClientEndpoint (Logging.scala:87) [] - Failed to connect to spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077 
org.apache.spark.SparkException: Exception thrown in awaitResult 
    at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:77) ~[spark-core_2.10-2.0.2.jar:2.0.2] 
    at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:75) ~[spark-core_2.10-2.0.2.jar:2.0.2] 
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) ~[scala-library-2.10.0.jar:?] 
    at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59) ~[spark-core_2.10-2.0.2.jar:2.0.2] 

Jednak ja wiem, że zadziałałoby, gdybym ustawił mastera na local, ponieważ wtedy działałby lokalnie. Jednak chcę, aby mój klient łączył się z tym zdalnym wzorcem. Jak mogę to zrobić? Konfiguracja Apache wygląda jak plik. Mogę nawet telnet do tego publicznego DNS i portu, skonfigurowałem także /etc/hosts z publicznym DNS i nazwą hosta dla każdej instancji EC2. Chcę móc przesyłać zadania do tego zdalnego pilota, czego mi brakuje?

Odpowiedz

5

Aby powiązać główną nazwę hosta/IP, przejdź do katalogu conf instalacji iskry (spark-2.0.2-bin-hadoop2.7/conf) i utwórz plik spark-env.sh, używając poniższego polecenia.

Otwórz plik spark-env.sh w edytorze vi i dodaj poniżej wiersz z nazwą hosta/adresu IP urządzenia master.

SPARK_MASTER_HOST=ec2-54-245-111-320.compute-1.amazonaws.com 

Zatrzymaj i uruchom Spark za pomocą polecenia stop-all.sh i start-all.sh. Teraz można go użyć do podłączenia zdalnego mistrz używając

val spark = SparkSession.builder() 
    .appName("SparkSample") 
    .master("spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077") 
    .getOrCreate() 

Aby uzyskać więcej informacji na temat ustawiania zmiennych środowiskowych sprawdź http://spark.apache.org/docs/latest/spark-standalone.html#cluster-launch-scripts

+0

Zrobiłem dokładnie to i nadal nie działa :-( – cybertextron

+0

Abaghel, mogę tworzyć pojedyncza instancja w AWS i po prostu edytuj spark-env? – cybertextron

+0

Czy umieścisz swój pełny ślad stosu? Czy używasz tej samej wersji iskry do połączenia? Sprawdź http://stackoverflow.com/questions/38559597/failed-to- connect-to-spark-masterinvalidclassexception-org-apache-spark-rpc-rp – abaghel