Mam aplikację świecy zapłonowej, która jest zabijana przez przędzę za przekroczenie limitów pamięci. Mam krok, który wymaga załadowania niektórych zasobów, które są nieco ciężkie (500+ MB), więc używam mapPartitions. Zasadniczo:Wykorzystanie pamięci Spark/przędzy Python
def process_and_output(partition):
resources = load_resources()
for record in partition:
yield transform_record(resources, record)
input = sc.textFile(input_location)
processed = input.mapPartitions(process_and_output)
processed.saveAsTextFile(output_location)
Kiedy pracuje, ja konsekwentnie dostać ten błąd:
ERROR YarnScheduler: Przegrane wykonawca 1 na (adres usunięte): Pojemnik zabity przez przędzy za przekroczenie limitów pamięci. Wykorzystano 11,4 GB pamięci fizycznej 11,2 GB. Rozważ wzmocnienie spark.yarn.executor.memoryOverhead.
Próbowałem podwyższać wartość parametru MemoryOver do bardzo wysokiego, ale wciąż tego samego problemu. Pobiegłem z:
--conf "spark.python.worker.memory=1200m" \
--conf "spark.yarn.executor.memoryOverhead=5300" \
--conf "spark.executor.memory=6g" \
Z pewnością wystarczy pamięci MemoryOverhead?
Chyba bardziej ogólnie, staram się zrozumieć, w jaki sposób pamięć robotów Pythona jest kontrolowana/liczona w ogólnej sumie. Czy jest jakaś dokumentacja tego?
Chciałbym również zrozumieć, czy użycie funkcji generatora zmniejszy zużycie pamięci. Czy będzie przesyłać strumieniowo dane w procesie Pythona (jak mam nadzieję), czy też zbuforuje to wszystko przed wysłaniem z powrotem do infrastruktury JVM/iskry?
Miłość to wyjaśnienie. Dzięki, że zachowałeś to, co prawdziwe. – deepelement
Pomógł mi! dzięki – g07kore