2016-02-02 25 views
6

Stworzyłem klaster Spark na Openstack działającym na Ubuntu14.04 z 8gb pamięci RAM. Stworzyłem dwie maszyny wirtualne o pojemności 3 gb każda (z zachowaniem 2 GB na system macierzysty). Ponadto tworzę master i 2 pracowników z pierwszej wirtualnej maszyny i 3 pracowników z drugiej maszyny.Apache Spark: "nie udało się uruchomić org.apache.spark.deploy.worker.Worker" lub Master

Plik spark-env.sh ma podstawowe ustawienie z

export SPARK_MASTER_IP=10.0.0.30 
export SPARK_WORKER_INSTANCES=2 
export SPARK_WORKER_MEMORY=1g 
export SPARK_WORKER_CORES=1 

Ilekroć rozmieścić klaster z start-all.sh, ja się „nie udało się uruchomić org.apache.spark.deploy.worker. Pracownik "i kilka razy" nie uruchomił org.apache.spark.deploy.master.Master ". Kiedy widzę plik dziennika, aby szukać błędu pojawia się następujący

Spark Polecenie:/usr/lib/jvm/java-7-openjdk-amd64/bin/java Cp>/home/ubuntu/iskrę -1.5.1/sbin /../ conf /:/home/ubuntu/spark-> 1.5.1/assembly/target/scala-2.10/spark-assembly-1.5.1-> hadoop2.2.0.jar:/home /ubuntu/spark-1.5.1/lib_managed/jars/datanucleus-api->jdo-3.2.6.jar:/home/ubuntu/spark-1.5.1/lib_managed/jars/datanucleus-core->3.2.10. jar: /home/ubuntu/spark-1.5.1/lib_managed/jars/datanucleus-rdbms-> 3.2.9.jar -Xms1g -Xmx1g -XX: MaxPermSize = 256m> org.apache.spark.deploy.master.Master - -ip 10.0.0.30 --port 7077 --webui-> port 8080

Chociaż otrzymałem wiadomość o błędzie, ale master lub w orker ożywają po kilku sekundach.

Czy ktoś może wyjaśnić przyczynę?

+1

Przełączyłem logi z ERROR na INFO i zobaczyłem dwa ostrzeżenia. 1. Twoja nazwa hosta, pracownik1 rozpatruje adres zwrotny: 127.0.1.1; zamiast tego używają 10.0.0.30 (na etykiecie interfejsu) i 2. Nie można załadować natywnej biblioteki hadoop dla twojej platformy ... używając klas wbudowanych java tam, gdzie ma to zastosowanie. Czy mogą przeszkadzać we wdrożeniu klastra? – jsingh13

Odpowiedz

6

System konfiguracji Spark to bałagan zmiennych środowiskowych, flag argumentów i plików właściwości Java. Właśnie spędziłem kilka godzin tropienie samo ostrzeżenie, a odkrycie procedurę inicjalizacji Spark, i oto co znalazłem:

  1. sbin/start-all.sh połączeń sbin/start-master.sh (i wtedy sbin/start-slaves.sh)
  2. sbin/start-master.sh połączeń sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master ...
  3. sbin/spark-daemon.sh start ... widły od rozmowy do bin/spark-class org.apache.spark.deploy.master.Master ..., przechwytuje wynikowy identyfikator procesu (pid), śpi przez 2 sekundy, a następnie sprawdza, czy to polecenie polecenia pid to "java"
  4. bin/spark-class to skrypt basha, więc Zaczyna się z nazwą polecenia "bash" i przechodzi do:
    1. (re-) załadować środowiska Spark poprzez pozyskiwanie bin/load-spark-env.sh
    2. znajdzie java wykonywalny
    3. znajdzie prawo iskra Jar
    4. połączeń java ... org.apache.spark.launcher.Main ... aby uzyskać pełną ścieżkę klasy potrzebne do wdrożenia Spark
    5. wreszcie ręce nad kontrolą, poprzez exec, aby java ... org.apache.spark.deploy.master.Master, w którym momencie staje się nazwa polecenia „Java”

Jeśli kroki 4.1 do 4.5 trwać dłużej niż 2 sekundy, co w moim (i Twój) doświadczenie wydaje się dość znacznie nieuniknione na świeżym OS gdzie java nigdy wcześniej uruchomić, dostaniesz „nie udało się uruchom "wiadomość, mimo że nic nie zawiodło.

Niewolnicy będą narzekać z tego samego powodu i będą rzucać się, dopóki mistrz nie będzie w rzeczywistości dostępny, ale powinni kontynuować próbę, dopóki nie uda im się połączyć z mistrzem.

Mam dość standardowe wdrożenie Sparka działające na EC2; Używam:

  • conf/spark-defaults.conf ustawić spark.executor.memory i dodać kilka niestandardowych słoików poprzez spark.{driver,executor}.extraClassPath
  • conf/spark-env.sh ustawić SPARK_WORKER_CORES=$(($(nproc) * 2))
  • conf/slaves do listy moi niewolnicy

Oto jak rozpocząć wdrażanie Spark, z pominięciem niektóre z pól minowych/labiryntów min:

# on master, with SPARK_HOME and conf/slaves set appropriately 
mapfile -t ARGS < <(java -cp $SPARK_HOME/lib/spark-assembly-1.6.1-hadoop2.6.0.jar org.apache.spark.launcher.Main org.apache.spark.deploy.master.Master | tr '\0' '\n') 
# $ARGS now contains the full call to start the master, which I daemonize with nohup 
SPARK_PUBLIC_DNS=0.0.0.0 nohup "${ARGS[@]}" >> $SPARK_HOME/master.log 2>&1 < /dev/null & 

Nadal używam sbin/start-daemon.sh zacząć niewolników, ponieważ jest to łatwiejsze niż nazywając nohup wewnątrz komendy ssh:

MASTER=spark://$(hostname -i):7077 
while read -r; do 
    ssh -o StrictHostKeyChecking=no $REPLY "$SPARK_HOME/sbin/spark-daemon.sh start org.apache.spark.deploy.worker.Worker 1 $MASTER" & 
done <$SPARK_HOME/conf/slaves 
# this forks the ssh calls, so wait for them to exit before you logout 

Nie! Zakłada, że ​​używam wszystkich domyślnych portów i innych rzeczy, i że nie robię głupich rzeczy jak umieszczanie spacji w nazwach plików, ale myślę, że to jest czystsze w ten sposób.