2015-06-17 13 views
6

Prowadzę pracę Sparka i wydaje się, że zadania nie są dobrze rozmieszczone (patrz załącznik). Czy istnieje sposób na równomierne rozłożenie zadań? Dzięki!Zadania Iskra nie wydają się być dobrze rozmieszczone.

enter image description here

+0

U oznacza równomiernie rozdzielić zadania wśród executorów lub kontrolować brak zadań? –

+0

Czy możesz podać więcej informacji na temat swojej aplikacji i sposobu jej uruchomienia za pomocą iskry? Na pierwszy rzut oka wydaje się, że liczba zadań jest równomiernie rozłożona, więc zgaduję, że każde zadanie ma inny nakład pracy. Ponownie, więcej informacji byłoby dobrze. –

Odpowiedz

0

myślę zadaniem są równomiernie rozłożone po drugiej różnymi pracownikami, ponieważ każde zadanie ma inny numer portu w kolumnie adresu.

0

Patrząc tylko na zrzut ekranu, trudno jest coś z tym zrobić. Istnieje jednak dwie rzeczy, które warto rozważyć:

  • Spark UI (jak z 1.3.1, nie próbowałem jeszcze w 1.4.0) jest wyświetlana tylko sumę statystyk dla gotowych zadań. Jeśli zrobiłeś ten zrzut ekranu podczas działania aplikacji, możliwe jest, że niektóre zadania zostały uruchomione i po prostu nie pojawiły się jeszcze w statystykach!

  • Na danej scenie Iskra nie można mieć więcej zadań niż partycja danych. Bez więcej kodu, trudno powiedzieć, ale może chcesz używać rdd.partition() funkcji, zazwyczaj można użyć rdd.repartition(sparkContext.getConf.getInt("spark.executor.instances", defaultValueInt) generować więcej partycji przed obróbką, a tym samym wygładzenie obciążenia nad wykonawców

0

Jeśli chcą równego podziału, można użyć funkcji partycji iskry podczas ładowania pliku do RDD,

val ratings = sc.textFile(File_name,partition) 

jak masz 10 węzłów 2 rdzenie każdy, wówczas można mieć wartość 20 partycji i podobnie.

0

Biorąc bliżej do Dołączona grafika, mogę zidentyfikować dwa zasadnicze fakty:

  • Numer zadań została równomiernie, przy czym maksymalna różnica 20 zadań.
  • Czas działania przydzielony dla każdego executora różni się istotnie, od 3,0 min (~ 80 zadań) do 17,0 min (~ 60 zadań).

To sprawia, że ​​zastanawiam się nad naturą twojej aplikacji. Czy wszystkie zadania są takie same, czy też niektóre z nich potrzebują więcej czasu na ukończenie niż inne? Jeśli zadania są niejednorodne, należy bardziej ostrożnie przeanalizować problem. Wyobraźmy sobie następujący scenariusz:

  • liczba zadań: 20, gdzie każdy z nich potrzebuje sekund, aby zakończyć z wyjątkiem tego ostatniego:

    Task 01: 10 seconds 
    Task 02: 10 seconds 
    Task 03: 10 seconds 
    Task ... 
    Task 20: 120 seconds 
    
  • Ilość wykonawców: (każdy z jednym rdzeniem)

Gdybyśmy musieli równomiernie rozdzielić zadania, zobaczylibyśmy że każdy wykonawca będzie musiał przetwarzać łącznie 5 zadań.Biorąc pod uwagę, że jedna wykonawca jest przypisana 20 zadań, co wymaga 120 sekund do wykonania, przepływ wykonania będzie następujący:

  • przez drugi 40, z których każdy wykonawca będzie w stanie wykonać pierwsze 4 zadania , biorąc pod uwagę, że 20 zadanie zostało na końcu.
  • W drugim 50, każdy wykonawca, ale jeden zakończy wszystkie swoje zadania. Pozostały executor nadal będzie obliczał 20 zadań, które zakończyłyby się po 120 sekundach.

Na końcu interfejs użytkownika wyświetli wynik podobny do twojego, z liczbą zadań równomiernie rozłożonych, ale nie rzeczywistym czasem obliczeniowym.

Executor 01 -> tasks completed: 5 -> time: 0:50 minutes 
Executor 02 -> tasks completed: 5 -> time: 0:50 minutes 
Executor 03 -> tasks completed: 5 -> time: 0:50 minutes 
Executor 04 -> tasks completed: 5 -> time: 2:40 minutes 

Mimo że nie jest to to samo, podobna sytuacja może mieć miejsce w Twojej sytuacji.

+2

Czy istnieje zalecane rozwiązanie dla zadań o nierównomiernym obciążeniu pracą? – sthomps

Powiązane problemy