Optymalizacja konfiguracji klastra dla platformy Apache Spark

W tym artykule omówiono sposób optymalizacji konfiguracji klastra Apache Spark w celu uzyskania najlepszej wydajności w usłudze Azure HDInsight.

Omówienie

W zależności od obciążenia klastra Spark można określić, że nie domyślna konfiguracja platformy Spark spowoduje bardziej zoptymalizowane wykonywanie zadań platformy Spark. Przetestuj testy porównawcze z przykładowymi obciążeniami, aby zweryfikować wszystkie konfiguracje klastra inne niż domyślne.

Poniżej przedstawiono kilka typowych parametrów, które można dostosować:

Parametr Opis
--num-executors Ustawia odpowiednią liczbę funkcji wykonawczych.
--executor-cores Ustawia liczbę rdzeni dla każdego wykonawcy. Zazwyczaj należy mieć funkcje wykonawcze o średnim rozmiarze, ponieważ inne procesy zużywają część dostępnej pamięci.
--executor-memory Ustawia rozmiar pamięci dla każdego modułu wykonawczego, który kontroluje rozmiar sterty w usłudze YARN. Pozostaw część pamięci na potrzeby nakładu pracy.

Wybierz prawidłowy rozmiar funkcji wykonawczej

Podczas podejmowania decyzji o konfiguracji funkcji wykonawczej należy wziąć pod uwagę obciążenie związane z odzyskiwaniem pamięci w języku Java (GC).

  • Czynniki zmniejszające rozmiar funkcji wykonawczej:

    1. Zmniejsz rozmiar sterty poniżej 32 GB, aby utrzymać obciążenie < 10%.
    2. Zmniejsz liczbę rdzeni, aby utrzymać obciążenie < GC na 10%.
  • Czynniki zwiększające rozmiar funkcji wykonawczej:

    1. Zmniejsz obciążenie komunikacji między funkcjami wykonawczej.
    2. Zmniejsz liczbę otwartych połączeń między funkcjami wykonawczej (N2) w większych klastrach (>100 funkcji wykonawczych).
    3. Zwiększ rozmiar sterty w celu uwzględnienia zadań intensywnie korzystających z pamięci.
    4. Opcjonalnie: Zmniejsz obciążenie pamięci na funkcję wykonawczej.
    5. Opcjonalnie: Zwiększ użycie i współbieżność przez nadmierne subskrybowanie procesora CPU.

Ogólnie rzecz biorąc, podczas wybierania rozmiaru funkcji wykonawczej:

  1. Zacznij od 30 GB na funkcję wykonawcza i dystrybuuj dostępne rdzenie maszyn.
  2. Zwiększ liczbę rdzeni funkcji wykonawczej dla większych klastrów (> 100 funkcji wykonawczych).
  3. Zmodyfikuj rozmiar na podstawie przebiegów próbnych i na poprzednich czynnikach, takich jak obciążenie GC.

Podczas uruchamiania zapytań współbieżnych rozważ:

  1. Zacznij od 30 GB na funkcję wykonawcza i wszystkich rdzeni komputera.
  2. Utwórz wiele równoległych aplikacji Spark przez nadmierne subskrybowanie procesora CPU (około 30% poprawy opóźnienia).
  3. Dystrybuuj zapytania w aplikacjach równoległych.
  4. Zmodyfikuj rozmiar na podstawie przebiegów próbnych i na poprzednich czynnikach, takich jak obciążenie GC.

Aby uzyskać więcej informacji na temat konfigurowania funkcji wykonawczych przy użyciu systemu Ambari, zobacz Ustawienia platformy Apache Spark — funkcje wykonawcze platformy Spark.

Monitoruj wydajność zapytań pod kątem wartości odstających lub innych problemów z wydajnością, przeglądając widok osi czasu. Wykres SQL, statystyki zadań itd. Aby uzyskać informacje na temat debugowania zadań platformy Spark przy użyciu usługi YARN i serwera historii platformy Spark, zobacz Debugowanie zadań platformy Apache Spark uruchomionych w usłudze Azure HDInsight. Aby uzyskać porady dotyczące korzystania z serwera osi czasu usługi YARN, zobacz Uzyskiwanie dostępu do dzienników aplikacji usługi Apache Hadoop YARN.

Zadania wolniejsze w niektórych funkcjach wykonawczych lub węzłach

Czasami jeden lub kilka funkcji wykonawczych jest wolniejszych niż inne, a wykonywanie zadań trwa znacznie dłużej. To spowolnienie często występuje w większych klastrach (> 30 węzłów). W takim przypadku należy podzielić pracę na większą liczbę zadań, aby harmonogram mógł zrekompensować powolne zadania. Na przykład ma co najmniej dwa razy więcej zadań niż liczba rdzeni funkcji wykonawczej w aplikacji. Można również włączyć spekulacyjne wykonywanie zadań za pomocą polecenia conf: spark.speculation = true.

Następne kroki