Używam klastra EMR (wersja emr-4.2.0) dla Sparka przy użyciu flagi Amazon specyficznej maximizeResourceAllocation
, zgodnie z dokumentacją here. Zgodnie z tymi dokumentami "ta opcja oblicza maksymalne zasoby obliczeniowe i pamięci dostępne dla executora w węźle w grupie węzłów rdzenia i ustawia odpowiednie ustawienia wartości iskrzenia z tymi informacjami".Spark + EMR z ustawieniem "maximResourceAllocation" w Amazon nie używa wszystkich rdzeni/voidów
Używam klastra za pomocą instancji m3.2xlarge dla węzłów roboczych. Używam pojedynczego m3.xlarge dla mastera YARN - najmniejszej instancji m3, na którą mogę ją uruchomić, ponieważ nie robi zbyt wiele.
Sytuacja jest następująca: Kiedy uruchamiam zadanie Spark, liczba żądanych rdzeni dla każdego executora wynosi 8. (Mam to tylko po skonfigurowaniu "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
, którego nie ma w dokumentacji, ale dygresja). Wydaje się to mieć sens, ponieważ zgodnie z these docs m3.2xlarge ma 8 "vCPUs". Jednak w samych rzeczywistych instancjach, w węźle /etc/hadoop/conf/yarn-site.xml
, każdy węzeł jest skonfigurowany jako yarn.nodemanager.resource.cpu-vcores
ustawiony na 16
. Chciałbym (jak sądzę) sądzić, że musi to być spowodowane hiperwentylacją lub być może jakąś inną fancyzmem sprzętowym.
Problem polega na tym, że gdy używam maximizeResourceAllocation
, otrzymuję liczbę "vCPU", które ma typ Amazon Instance, który wydaje się być tylko połową liczby skonfigurowanych "VCores", które YARN działa na węzeł; w rezultacie executor używa tylko połowy rzeczywistych zasobów obliczeniowych instancji.
Czy to błąd w Amazon EMR? Czy inne osoby doświadczają tego samego problemu? Czy jest jeszcze jakaś magiczna nieudokumentowana konfiguracja, której mi brakuje?
Pokazuje to; ale problem polega na tym, że rdzenie "8" są w rzeczywistości tylko 8 z 16 "VCores" przydzielonych przez YARN; połowa rzeczywistych zasobów procesora w komputerze pozostaje bezczynna. Ponieważ próbuję uruchomić intensywne zadania CPU, jest to strata CPU (i oczywiście pieniędzy!) – retnuH
Rdzenie są po prostu abstrakcją samego typu instancji. Nie ma faktycznego powiązania z rdzeniami, więc executorzy wykorzystają jak najwięcej CPU żądań aplikacji. Jedyne wiązanie przychodzi podczas używania DominantResourceCalculator dla harmonogramu. Jedną z rzeczy do zapamiętania jest dla tej instancji domyślna konfiguracja EMR podwójna wartość vcore opowiedziana przędzy, aby poprawić wykorzystanie procesora za pomocą MapReduce. Właściwość MaximumResourceAllocation analizowała definicję rdzenia typu instancji. – ChristopherB