2016-10-27 2 views
1

입력 데이터 세트가 약 150G입니다. 나는스파크 : 실행 메모리가 물리적 한계를 초과합니다

--conf spark.cores.max=100 
--conf spark.executor.instances=20 
--conf spark.executor.memory=8G 
--conf spark.executor.cores=5 
--conf spark.driver.memory=4G 

을 설정하고 있지만, 데이터가 균등하게 집행에 분산되지 않기 때문에, 나는

Container killed by YARN for exceeding memory limits. 9.0 GB of 9 GB physical memory used 

를 받고 계속 여기 내 질문이 있습니다 :

1. Did I not set up enough memory in the first place? I think 20 * 8G > 150G, but it's hard to make perfect distribution, so some executors will suffer 
2. I think about repartition the input dataFrame, so how can I determine how many partition to set? the higher the better, or? 
3. The error says "9 GB physical memory used", but i only set 8G to executor memory, where does the extra 1G come from? 

감사합니다! 0.1 * 당신의 유언 집행 메모리 설정에

spark.yarn.executor.memoryOverhead 

이 기본값 :

+0

당신은 spark 실행자 인스턴스를 20으로 설정하고 있습니다. 이것은 정확하게 기억한다면 8G 각각의 20 명의 실행자를 시작할 것임을 의미합니다. 줄이려고 시도해 볼 수 있습니까? 1로 줄이면 시작됩니다. – ar7

+0

안녕하세요, 저는 Executor를 1로 줄이면 8G 메모리가있는 실행 프로그램이 1 개만 있고 150G 입력은 – user2628641

+0

에 들어 가지 않습니다. 원사 컨테이너가 충분한 메모리로 구성되지 않았기 때문일 수 있습니다. 직면하고있는 오류에 대한 가능한 해결책은 무엇입니까? http://stackoverflow.com/a/33118489/6199146 및 http://m.blog.csdn.net/article/details?id=50387104 – ar7

답변

2

9기가바이트는 .1로 설정된 파라미터로 추가 spark.yarn.executor.memoryOverhead 기가 바이트 실행기 메모리로 구성되므로, 용기의 총 메모리 8GB + (.1 * 8GB) ≈ 9GB이다 spark.yarn.executor.memoryOverhead + (spark.yarn.executor.memoryOverhead * spark.yarn.executor.memoryOverhead)이다.

단일 실행 프로그램을 사용하여 전체 프로세스를 실행할 수는 있지만 시간이 오래 걸립니다. To understand this you need to know the notion of partitions and tasks. 파티션 수는 입력과 작업에 의해 정의됩니다. 예를 들어, hdfs에서 150GB의 csv를 읽고 hdfs의 블록 크기가 128MB 일 경우, 150 * 1024/128 = 1200 파티션으로 끝날 것이며, 이는 Spark UI에서 1200 개의 작업으로 직접 매핑됩니다.

모든 단일 태스크는 실행 프로그램에 의해 선택됩니다. 메모리에 150GB를 모두 저장할 필요가 없습니다. 예를 들어, 하나의 집행자가있는 경우 분명히 Spark의 병렬 기능을 사용하지 않아도되지만 첫 번째 작업부터 시작하여 데이터를 처리 한 다음 dfs에 다시 저장하고 다음 작업. 당신은

을 확인해야하는 것 :

  • 는 얼마나 큰 입력 파티션은? Is the input file splittable at all? 단일 실행 프로그램이 방대한 양의 메모리를로드해야하는 경우 메모리가 부족합니다.
  • 어떤 종류의 작업을 수행하고 있습니까? 예를 들어, 카디널리티가 매우 낮은 조인을 수행하면 특정 값을 가진 모든 행이 동일한 파티션에서 끝나기 때문에 방대한 파티션으로 끝납니다.
  • 매우 비싸거나 비효율적 인 동작이 수행됩니까?모든 직교 제품 등

희망이 도움이됩니다. 행복한 sparking!

2

원사를 사용하여, 당신의 집행을위한 실 컨테이너 요청을하는 방법에 큰에 수치 또 다른 설정이 있습니다. 이 코드는 실행기 메모리로 지정하는 것 이외에 추가로 오버 헤드 메모리를 요구하는 양을 정의합니다. 먼저이 숫자를 늘려보십시오.

또한 실 컨테이너는 사용자에게 임의의 크기의 메모리를 제공하지 않습니다. 은 "오버 슈팅"당신의 위험을 줄일 수 적은 수의 해당 설정

yarn.scheduler.minimum-allocation-mb 

: 그것은 단지이 설정에 의해 제어되는 그것의 여러 최소 할당 크기의 인 메모리 크기, 할당 용기를 반환합니다 당신이 요구 한 금액.

또한 일반적으로 아래의 키를 원하는 용기 크기보다 큰 값으로 설정하여 spark 요청이 내 집행자의 양을 제어하도록하고 있습니다. 이것은 원사가 줄 수있는 최대 컨테이너 크기입니다.

nodemanager.resource.memory-mb 
관련 문제