복붙노트

[SCALA] 왜 스파크는 java.lang.OutOfMemoryError와 함께 실패 않습니다 GC 오버 헤드 제한을 초과?

SCALA

왜 스파크는 java.lang.OutOfMemoryError와 함께 실패 않습니다 GC 오버 헤드 제한을 초과?

나는 / 하둡지도를 구현 스파크에서 전에 벌금을 일한 작업을 줄이기 위해 노력하고있어. 스파크 응용 프로그램의 정의는 다음과 같다 :

val data = spark.textFile(file, 2).cache()
val result = data
  .map(//some pre-processing)
  .map(docWeightPar => (docWeightPar(0),docWeightPar(1))))
  .flatMap(line => MyFunctions.combine(line))
  .reduceByKey( _ + _)

어디 MyFunctions.combine입니다

def combine(tuples: Array[(String, String)]): IndexedSeq[(String,Double)] =
  for (i <- 0 to tuples.length - 2;
       j <- 1 to tuples.length - 1
  ) yield (toKey(tuples(i)._1,tuples(j)._1),tuples(i)._2.toDouble * tuples(j)._2.toDouble)

입력에 사용되는 목록이 크고 예외가 발생되는 경우이 경우 기능은지도 키를 많이 생산하는 결합.

하둡 맵이이 기능 수익률은 하둡 디스크에지도 쌍을 쓴 점이었다 결합 지점이기 때문에 나는 문제가 발생하지 않은 설정을 줄입니다. 초과 GC 오버 헤드 제한 : 스파크 그것이 java.lang.OutOfMemoryError와 함께 폭발 할 때까지 메모리에 모두를 유지하는 것 같다.

아마 뭔가를 정말 기본적인 잘못을하고있는 중이 야하지만이에서 앞장서 서하는 방법에 대한 포인터를 찾을 수 없습니다, 나는이 문제를 피할 수있는 방법을 알고 싶습니다. 내가 스칼라에서 총 멍청한 놈 오전 스파크 때문에 나는 확실하지 문제가 하나 또는 다른, 또는 둘 모두에서 경우입니다. 나는 현재 내 자신의 노트북에서이 프로그램을 실행하려고하고는 튜플 배열의 길이가 매우 긴 아닌 입력에 대해 작동합니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.메모리를 조정하면이 비용이 많이 드는 작업이기 때문에, 아마 이미 제안되어왔다 갈 수있는 좋은 방법입니다 추한 방법으로 저울. 하지만 어쩌면 일부 코드 변경이 도움이 될 것입니다.

    메모리를 조정하면이 비용이 많이 드는 작업이기 때문에, 아마 이미 제안되어왔다 갈 수있는 좋은 방법입니다 추한 방법으로 저울. 하지만 어쩌면 일부 코드 변경이 도움이 될 것입니다.

    당신은 당신의 결합 기능에 다른 접근 방식을 취할 수있는 피할 조합 기능을 사용하여 if 문. 또한 조합 작업 전에 두 배에 튜플의 두 번째 요소를 변환 할 것입니다 :

    tuples.
    
        // Convert to doubles only once
        map{ x=>
            (x._1, x._2.toDouble)
        }.
    
        // Take all pairwise combinations. Though this function
        // will not give self-pairs, which it looks like you might need
        combinations(2).
    
        // Your operation
        map{ x=>
            (toKey(x{0}._1, x{1}._1), x{0}._2*x{1}._2)
        }
    

    당신이 toList와 목록 (또는 무언가)로 변환을하려는 경우, 당신은 다운 스트림을 사용할 수있는 반복자를 제공하거나 것입니다.

  2. ==============================

    2.당신이 스파크 쉘 또는 스파크가 제출 시작할 때 다음 JVM 인수를 추가 :

    당신이 스파크 쉘 또는 스파크가 제출 시작할 때 다음 JVM 인수를 추가 :

    -Dspark.executor.memory=6g
    

    당신은 또한 당신이 SparkContext의 인스턴스를 생성 할 때 명시 적으로 근로자의 수를 설정 고려할 수 있습니다 :

    conf의 / 노예의 노예 이름을 설정합니다 :

    val sc = new SparkContext("master", "MyApp")
    
  3. ==============================

    3.문서 (http://spark.apache.org/docs/latest/running-on-yarn.html)에서는 실행 프로그램과 메모리 제한을 구성하는 방법을 읽을 수 있습니다. 예를 들면 :

    문서 (http://spark.apache.org/docs/latest/running-on-yarn.html)에서는 실행 프로그램과 메모리 제한을 구성하는 방법을 읽을 수 있습니다. 예를 들면 :

    --master yarn-cluster --num-executors 10 --executor-cores 3 --executor-memory 4g --driver-memory 5g  --conf spark.yarn.executor.memoryOverhead=409
    

    memoryOverhead은 실행 프로그램 메모리의 10 %이어야한다.

    편집 : (409) 4096을 고정 (코멘트 아래이를 말한다)

  4. ==============================

    4.나는 긴 회귀 적합 동안 동일한 문제를 가지고 있었다. 나는 기차 및 테스트 세트를 캐시. 그것은 내 문제를 해결했다.

    나는 긴 회귀 적합 동안 동일한 문제를 가지고 있었다. 나는 기차 및 테스트 세트를 캐시. 그것은 내 문제를 해결했다.

    train_df, test_df = df3.randomSplit([0.8, 0.2], seed=142)
    pipeline_model = pipeline_object.fit(train_df)
    

    pipeline_model java.lang.OutOfMemoryError와 라인을 제공 하였다 : GC 오버 헤드 제한이 초과 하지만 사용하는 경우

    train_df, test_df = df3.randomSplit([0.8, 0.2], seed=142)
    train_df.cache()
    test_df.cache()
    pipeline_model = pipeline_object.fit(train_df)
    

    그것은했다.

  5. ==============================

    5.나는 0.6보다 값 이상으로 spark.memory.fraction 증가 할 때 JVM 가비지 컬렉션 오류가 재현성 내 경우에는 일어났다. 그것은 더 나은 그래서 JVM 가비지 컬렉션의 오류를 방지하기 위해 그것의 기본 값으로 값을 떠날 수 있습니다. 이것은 또한 https://forums.databricks.com/questions/2202/javalangoutofmemoryerror-gc-overhead-limit-exceede.html에 의해 권장합니다.

    나는 0.6보다 값 이상으로 spark.memory.fraction 증가 할 때 JVM 가비지 컬렉션 오류가 재현성 내 경우에는 일어났다. 그것은 더 나은 그래서 JVM 가비지 컬렉션의 오류를 방지하기 위해 그것의 기본 값으로 값을 떠날 수 있습니다. 이것은 또한 https://forums.databricks.com/questions/2202/javalangoutofmemoryerror-gc-overhead-limit-exceede.html에 의해 권장합니다.

    자세한 내용은 하나의 경우 0.6 https://issues.apache.org/jira/browse/SPARK-15796를 참조 spark.memory.fraction 최고의 가치 인 이유.

  6. from https://stackoverflow.com/questions/27462061/why-does-spark-fail-with-java-lang-outofmemoryerror-gc-overhead-limit-exceeded by cc-by-sa and MIT license