2016-06-24 2 views
9

필자는 spark 파이썬 응용 프로그램을 사용하여 메모리 한도를 초과하여 실에 의해 사망하고 있습니다. 약간 무거운 (500 MB 이상) 리소스를로드하는 단계가 있으므로 mapPartitions를 사용하고 있습니다. 기본적으로 :파이썬 스파크/얀 메모리 사용량

오류 YarnScheduler :

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) 

실행, 내가 지속적으로이 오류 얻을에 분실 집행자 1 (주소 제거) : 컨테이너 메모리 제한을 초과 원사에 의해 살해. 11.4GB의 11.2GB 실제 메모리가 사용되었습니다. spark.yarn.executor.memoryOverhead를 높이는 것을 고려하십시오.

나는 memoryOverhead를 매우 높게 상승 시키려고했지만 여전히 같은 문제가 있습니다. 나는 다음과 같이 달렸다 :

--conf "spark.python.worker.memory=1200m" \ 
--conf "spark.yarn.executor.memoryOverhead=5300" \ 
--conf "spark.executor.memory=6g" \ 

확실하게, 그것은 충분한 메모리 오버 헤드인가?

필자는 더 일반적으로, 나는 파이썬 작업자의 메모리가 전반적인 총계에서 제어/계산되는 방법을 이해하는 데 어려움을 겪고있다. 이것에 대한 문서가 있습니까?

제너레이터 기능을 사용하면 실제로 메모리 사용량이 줄어들 것인지 여부도 알고 싶습니다. 파이썬 프로세스를 통해 데이터를 스트리밍 할 것인가? (예를 들어 내가 원한대로) JVM/스파크 인프라로 다시 보내기 전에 버퍼를 모두 버퍼링 할 것인가?

답변

3

11.2GB는 원사로 만든 컨테이너의 최대 메모리입니다. 이는 executor 메모리 + 오버 헤드와 동일합니다. 그래서 파이썬 메모리는 계산되지 않습니다.

예외는 오버 헤드를 늘리기를 원하지만 오버 헤드 메모리를 늘리지 않고도 실행 메모리를 늘릴 수 있습니다. 그게 전부 하나의 유언 집행자가 왜 그렇게 많은 메모리를 필요로하는지 알지 못하면서 말할 수 있습니다. 그래서 많은 메모리가 필요할 수있는 데카르트 또는 이와 비슷한 것일 수 있습니다.

5

원사 집행을 죽이는 때의 당신이 유효한 예외처럼 보이는 설정에서

memory usage > (executor-memory + executor.memoryOverhead)

.

(memory usage)11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)

--conf "spark.yarn.executor.memoryOverhead=6144"

+0

사랑이 설명과 함께하려고합니다. 진짜를 가져 주셔서 감사합니다. – deepelement

+0

도와 줬어! 고마워 – g07kore