2015-03-10 26 views
15

Wykonałem już instalację iskry i wykonałem kilka testów ustawiając węzły główne i robocze. Powiedział, że mam bardzo grubą pomyłkę, co dokładnie oznacza praca w kontekście Sparka (nie SparkContext). Mam poniżej pytania:Co to jest praca Spark?

  • Czym różni się praca od programu Driver.
  • Aplikacja sama w sobie jest częścią programu Driver?
  • Spark poddać się w pewien sposób to praca?

Przeczytałem Spark documention, ale nadal nie jest to dla mnie jasne.

Powiedziawszy, moja implementacja polega na pisaniu prac iskrowych {programowo}, które byłyby wynikiem iskrzenia.

Prosimy o pomoc w przypadku niektórych przykładów, jeśli to możliwe. Byłoby bardzo pomocne.

Uwaga: Prosimy nie umieszczać ogniw iskrowych, ponieważ już je wypróbowałem. Chociaż pytania brzmią naiwnie, ale nadal potrzebuję większej jasności w zrozumieniu.

Odpowiedz

24

Cóż, terminologia może być zawsze trudna, ponieważ zależy od kontekstu. W wielu przypadkach można użyć do "przesłania pracy do klastra", która za iskrę byłaby przesłaniem programu kierowcy.

Powiedział, Spark ma własną definicję „pracy”, bezpośrednio z Słowniczek:

pracy równoległej obliczeniowy składający się z wielu zadań, które dostaje zrodził się w odpowiedzi na działanie Spark (np uratować, zebrać); zobaczysz ten termin używany w dziennikach sterownika.

Więc ten kontekst, powiedzmy, że trzeba wykonać następujące czynności:

  1. załadować plik z ludźmi, nazwiska i adresy do RDD1
  2. załadować plik z ludźmi, nazwiskami i telefonami do RDD2
  3. Dołącz RDD1 i RDD2 według nazwy, aby uzyskać RDD3
  4. mapę na RDD3 aby uzyskać ładny prezentacji HTML dla każdej osoby jako RDD4
  5. Zapisz RDD4 do pliku.
  6. Mapa RDD1 wyodrębnić zipcodes z adresów dostać RDD5
  7. Agregat na RDD5 dostać rachubę ilu ludzi żyje na każdego kodu pocztowego jako RDD6
  8. Zbierz RDD6 i drukuje tych statystyk na standardowe wyjście.

Więc

  1. Program kierowca jest cały ten fragment kodu, bieganie wszystkie 8 kroków.
  2. Produkcja całą kartę HTML ustawiony na punkcie 5 jest praca (jasne, ponieważ używamy zapisać działania, a nie transformacja). To samo z zbierać na etapie 8
  3. Inne kroki zostaną zorganizowane w etapach, z każda praca jest rezultatem sekwencji etapów. W przypadku prostych rzeczy zadanie może mieć jeden etap, ale potrzeba dzielenia danych na partycje (na przykład połączenie w kroku 3) lub czegokolwiek, co zakłóca lokalizację danych, zazwyczaj powoduje pojawienie się kolejnych etapów. Sceny można traktować jako obliczenia, które dają pośrednie wyniki, które w rzeczywistości mogą być utrzymane. Na przykład możemy przetrwać RDD1, ponieważ będziemy go używać więcej niż raz, unikając ponownego obliczania.
  4. Wszystkie 3 powyżej w zasadzie mówią o tym, jak zostanie rozwiązana logika danego algorytmu. W przeciwieństwie do tego, pewien szczególny fragment danych , który przechodzi przez dany etap, na danym executorze.

Nadzieję, że to sprawia, że ​​rzeczy wyraźniejsze ;-)

+0

jasne jest dla mnie teraz :) ale mimo wszystko mam zapytanie o pisanie harmonogramu zadań. Czytałem dokumenty, ale nie mogłem uzyskać podpięcia kodu. – chaosguru

+1

Cóż, to zależy w dużej mierze od rodzaju infrastruktury, którą posiadasz (czy na przykład używasz Spark on Yarn?) Nie mojego silnego koloru, ale w zasadzie uruchamiam wszystkie moje programy sterowników ze skryptów Bash (w celu zapamiętania parametrów, tworzyć foldery wyjściowe itp.). Każde normalne narzędzie do planowania, zdolne do uruchamiania polecenia konsoli, powinno działać w trybie IMHO. Jeśli każde zadanie wykorzystuje wszystkie zasoby w klastrze, możesz po prostu przesłać programy i będą czekać na uwolnienie zasobów. –

+0

Byłoby miło, gdybyś mógł zaakceptować odpowiedź, gdyby to wyjaśniło. Pomaga osobom, które szukają pytań bez odpowiedzi, a tym samym więcej odpowiedzi na pytania ;-) –

0

Hej tu coś, co przedtem, nadzieję, że to działa dla Ciebie:

#!/bin/bash 
# Hadoop and Server Variables 
HADOOP="hadoop fs" 
HDFS_HOME="hdfs://ha-edge-group/user/max" 
LOCAL_HOME="/home/max" 

# Cluster Variables 
DRIVER_MEM="10G" 
EXECUTOR_MEM="10G" 
CORES="5" 
EXECUTORS="15" 

# Script Arguments 
SCRIPT="availability_report.py" # Arg[0] 
APPNAME="Availability Report" # arg[1] 

DAY=`date -d yesterday +%Y%m%d` 

for HOUR in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
do 
     #local directory to getmerge to 
     LOCAL_OUTFILE="$LOCAL_HOME/availability_report/data/$DAY/$HOUR.txt" 

     # Script arguments 
     HDFS_SOURCE="webhdfs://1.2.3.4:0000/data/lbs_ndc/raw_$DAY'_'$HOUR" # arg[2] 
     HDFS_CELLS="webhdfs://1.2.3.4:0000/data/cells/CELLID_$DAY.txt" # arg[3] 
     HDFS_OUT_DIR="$HDFS_HOME/availability/$DAY/$HOUR" # arg[4] 

     spark-submit \ 
     --master yarn-cluster \ 
     --driver-memory $DRIVER_MEM \ 
     --executor-memory $EXECUTOR_MEM \ 
     --executor-cores $CORES \ 
     --num-executors $EXECUTORS \ 
     --conf spark.scheduler.mode=FAIR \ 
     $SCRIPT $APPNAME $HDFS_SOURCE $HDFS_CELLS $HDFS_OUT_DIR 

     $HADOOP -getmerge $HDFS_OUT_DIR $LOCAL_OUTFILE 
done