Wskazówki dotyczące dostrajania wydajności platformy Spark w usłudze HDInsight i Azure Data Lake Storage Gen1

Podczas dostrajania wydajności na platformie Spark należy wziąć pod uwagę liczbę aplikacji, które będą uruchomione w klastrze. Domyślnie można uruchamiać cztery aplikacje jednocześnie w klastrze usługi HDI (Uwaga: ustawienie domyślne może ulec zmianie). Możesz zdecydować się na użycie mniejszej liczby aplikacji, aby można było zastąpić ustawienia domyślne i użyć większej liczby klastrów dla tych aplikacji.

Wymagania wstępne

Parametry

Podczas uruchamiania zadań platformy Spark poniżej przedstawiono najważniejsze ustawienia, które można dostosować w celu zwiększenia wydajności Data Lake Storage Gen1:

  • Num-executors — liczba współbieżnych zadań, które można wykonać.

  • Funkcja wykonawcza—pamięć — ilość pamięci przydzielonej do każdego wykonawcy.

  • Funkcje wykonawcze — liczba rdzeni przydzielonych do każdego modułu wykonawczego.

Funkcje wykonawcze num Num-executors ustawi maksymalną liczbę zadań, które mogą być uruchamiane równolegle. Rzeczywista liczba zadań, które mogą być uruchamiane równolegle, jest powiązana z pamięcią i zasobami procesora CPU dostępnymi w klastrze.

Pamięć funkcji wykonawczej Jest to ilość pamięci przydzielanej do każdego modułu wykonawczego. Pamięć wymagana dla każdego wykonawcy jest zależna od zadania. W przypadku złożonych operacji pamięć musi być wyższa. W przypadku prostych operacji, takich jak odczyt i zapis, wymagania dotyczące pamięci będą niższe. Ilość pamięci dla każdej funkcji wykonawczej można wyświetlić w narzędziu Ambari. W systemie Ambari przejdź do platformy Spark i wyświetl kartę Configs (Konfiguracje ).

Rdzenie wykonawcze Określa liczbę rdzeni używanych dla funkcji wykonawczej, która określa liczbę równoległych wątków, które mogą być uruchamiane dla funkcji wykonawczej. Na przykład jeśli funkcje wykonawcze = 2, każda funkcja wykonawcza może uruchamiać 2 równoległe zadania w funkcji wykonawczej. Potrzebne rdzenie wykonawcze będą zależeć od zadania. Zadania z dużą liczbą operacji we/wy nie wymagają dużej ilości pamięci na zadanie, dzięki czemu każda funkcja wykonawcza może obsługiwać więcej zadań równoległych.

Domyślnie dwa wirtualne rdzenie usługi YARN są definiowane dla każdego rdzenia fizycznego podczas uruchamiania platformy Spark w usłudze HDInsight. Ta liczba zapewnia dobrą równowagę między współbieżnością i ilością przełączania kontekstu z wielu wątków.

Wskazówki

Podczas uruchamiania obciążeń analitycznych platformy Spark do pracy z danymi w Data Lake Storage Gen1 zalecamy użycie najnowszej wersji usługi HDInsight w celu uzyskania najlepszej wydajności z Data Lake Storage Gen1. Gdy zadanie jest intensywniejsze w operacji we/wy, można skonfigurować pewne parametry w celu zwiększenia wydajności. Data Lake Storage Gen1 to wysoce skalowalna platforma magazynu, która może obsługiwać wysoką przepływność. Jeśli zadanie składa się głównie z operacji odczytu lub zapisu, zwiększenie współbieżności operacji we/wy do i z Data Lake Storage Gen1 może zwiększyć wydajność.

Istnieje kilka ogólnych sposobów zwiększania współbieżności zadań intensywnie korzystających z operacji we/wy.

Krok 1. Określenie liczby aplikacji uruchomionych w klastrze — musisz wiedzieć, ile aplikacji jest uruchomionych w klastrze, w tym bieżącej. Wartości domyślne dla każdego ustawienia platformy Spark zakładają, że jednocześnie działa 4 aplikacje. W związku z tym dla każdej aplikacji będzie dostępnych tylko 25% klastra. Aby uzyskać lepszą wydajność, można zastąpić wartości domyślne, zmieniając liczbę funkcji wykonawczych.

Krok 2. Ustawienie funkcji wykonawczej pamięci — pierwszą rzeczą do ustawienia jest pamięć wykonawcza. Pamięć będzie zależeć od zadania, które zostanie uruchomione. Współbieżność można zwiększyć, przydzielając mniej pamięci na funkcję wykonawczą. Jeśli podczas uruchamiania zadania są widoczne wyjątki braku pamięci, należy zwiększyć wartość tego parametru. Jedną z alternatyw jest uzyskanie większej ilości pamięci przy użyciu klastra, który ma wyższą ilość pamięci lub zwiększenie rozmiaru klastra. Większa ilość pamięci umożliwi użycie większej liczby funkcji wykonawczych, co oznacza większą współbieżność.

Krok 3. Ustawianie rdzeni funkcji wykonawczej — w przypadku obciążeń intensywnie korzystających z operacji we/wy, które nie mają złożonych operacji, warto rozpocząć od dużej liczby rdzeni funkcji wykonawczej w celu zwiększenia liczby zadań równoległych na funkcję wykonawcza. Ustawienie wartości 4 rdzeni funkcji wykonawczej na 4 jest dobrym początkiem.

executor-cores = 4

Zwiększenie liczby rdzeni funkcji wykonawczej zapewni większą równoległość, dzięki czemu można eksperymentować z różnymi rdzeniami funkcji wykonawczej. W przypadku zadań, które mają bardziej złożone operacje, należy zmniejszyć liczbę rdzeni na funkcję wykonawcza. Jeśli elementy wykonawcze są ustawione wyżej niż 4, odzyskiwanie pamięci może stać się nieefektywne i obniżyć wydajność.

Krok 4. Określanie ilości pamięci usługi YARN w klastrze — te informacje są dostępne w systemie Ambari. Przejdź do usługi YARN i wyświetl kartę Contigs. W tym oknie zostanie wyświetlona pamięć usługi YARN. Pamiętaj, że gdy jesteś w oknie, możesz również zobaczyć domyślny rozmiar kontenera usługi YARN. Rozmiar kontenera usługi YARN jest taki sam jak pamięć na parametr funkcji wykonawczej.

Łączna ilość pamięci usługi YARN = węzły * pamięć YARN na węzeł

Krok 5. Obliczanie funkcji wykonawczej liczby

Obliczanie ograniczenia pamięci — parametr funkcji wykonawczej num jest ograniczony przez pamięć lub procesor CPU. Ograniczenie pamięci zależy od ilości dostępnej pamięci usługi YARN dla aplikacji. Weź łączną pamięć usługi YARN i podziel je przez funkcję wykonawcza pamięci. Ograniczenie musi zostać coskalowane dla liczby aplikacji, więc dzielimy przez liczbę aplikacji.

Ograniczenie pamięci = (łączna ilość pamięci YARN /pamięć wykonawcza) / liczba aplikacji

Obliczanie ograniczenia procesora CPU — ograniczenie procesora CPU jest obliczane jako łączna liczba rdzeni wirtualnych podzielona przez liczbę rdzeni na funkcję wykonawcza. Dla każdego rdzenia fizycznego istnieje 2 rdzenie wirtualne. Podobnie jak w przypadku ograniczenia pamięci, dzielimy liczbę aplikacji.

rdzenie wirtualne = (węzły w klastrze * liczba rdzeni fizycznych w węźle * 2) ograniczenie procesora CPU = (łączna liczba rdzeni wirtualnych / liczba rdzeni na funkcję wykonawcza) / liczba aplikacji

Ustaw num-executors — parametr funkcji wykonawczej num jest określany przez ograniczenie pamięci i ograniczenie procesora CPU.

num-executors = Min (łączna liczba rdzeni wirtualnych / liczba rdzeni na funkcję wykonawcza, dostępna pamięć YARN / pamięć wykonawcza) Ustawienie wyższej liczby funkcji wykonawczej niekoniecznie zwiększa wydajność. Należy wziąć pod uwagę, że dodanie większej liczby funkcji wykonawczych spowoduje dodatkowe obciążenie dla każdego dodatkowego modułu wykonawczego, co może potencjalnie obniżyć wydajność. Funkcje wykonawcze Num są ograniczone przez zasoby klastra.

Przykładowe obliczenie

Załóżmy, że obecnie masz klaster składający się z 8 węzłów D4v2, na których są uruchomione dwie aplikacje, w tym jeden, który ma zostać uruchomiony.

Krok 1. Określenie liczby aplikacji uruchomionych w klastrze — wiesz, że masz dwie aplikacje w klastrze, w tym aplikację, którą zamierzasz uruchomić.

Krok 2. Ustawienie funkcji wykonawczej pamięci — na potrzeby tego przykładu ustalimy, że 6 GB pamięci wykonawczej będzie wystarczające dla zadań intensywnie korzystających z operacji we/wy.

executor-memory = 6GB

Krok 3. Ustawianie rdzeni funkcji wykonawczej — ponieważ jest to zadanie intensywnie korzystające z operacji we/wy, możemy ustawić liczbę rdzeni dla każdego wykonawcy na cztery. Ustawianie rdzeni na funkcję wykonawcza większą niż cztery może powodować problemy z odzyskiwaniem pamięci.

executor-cores = 4

Krok 4. Określenie ilości pamięci usługi YARN w klastrze — przechodzimy do systemu Ambari, aby dowiedzieć się, że każdy D4v2 ma 25 GB pamięci YARN. Ponieważ istnieje 8 węzłów, dostępna pamięć usługi YARN jest mnożona przez 8.

Całkowita pamięć YARN = węzły * pamięć YARN* na węzeł Całkowita pamięć YARN = 8 węzłów * 25 GB = 200 GB

Krok 5. Obliczanie funkcji wykonawczej liczby — parametr funkcji wykonawczej num jest określany przez pobranie minimalnego ograniczenia pamięci i ograniczenia procesora CPU podzielonego przez liczbę aplikacji uruchomionych na platformie Spark.

Obliczanie ograniczenia pamięci — ograniczenie pamięci jest obliczane jako łączna ilość pamięci YARN podzielona przez pamięć na funkcję wykonawcza.

Ograniczenie pamięci = (łączna pamięć YARN / pamięć wykonawcza) / liczba aplikacji ograniczenie pamięci = (200 GB / 6 GB) / 2 ograniczenie pamięci = 16 (zaokrąglone) Obliczanie ograniczenia procesora CPU — ograniczenie procesora CPU jest obliczane jako łączna liczba rdzeni yarn podzielona przez liczbę rdzeni na funkcję wykonawcza.

Rdzenie usługi YARN = węzły w klastrze * liczba rdzeni na węzeł * 2 rdzenie YARN = 8 węzłów * 8 rdzeni na D14 * 2 = 128 ograniczeń procesora CPU = (łączna liczba rdzeni YARN / liczba rdzeni na funkcję wykonawcza) / liczba ograniczeń procesora CPU aplikacji = (128 / 4) / 2 ograniczenie procesora CPU = 16

Ustawianie funkcji wykonawczej num

num-executors = Min (ograniczenie pamięci, ograniczenie procesora CPU) num-executors = Min (16, 16) num-executors = 16