복붙노트

[HADOOP] Spark 메모리에 TB 파일 실행

HADOOP

Spark 메모리에 TB 파일 실행

우리가 하나의 Tb 데이터 파일을 가지고 있다고 가정합시다. 10 개의 노드 클러스터에있는 각 노드 메모리는 3GB입니다.

스파크를 사용하여 파일을 처리하고 싶습니다. 그러나 One TeraByte는 어떻게 기억에 잘 들어 맞습니까?

메모리 예외가 발생합니까?

어떻게 작동합니까?

해결법

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

    1.Thilo가 말했듯이 Spark는 메모리를 처리 할 수 ​​있도록 모든 것을로드 할 필요가 없습니다. 이것은 Spark이 데이터를 더 작은 블록으로 분할하고 이들을 개별적으로 조작하기 때문입니다. 파티션의 수와 크기는 여러 가지 사항에 따라 다릅니다.

    Thilo가 말했듯이 Spark는 메모리를 처리 할 수 ​​있도록 모든 것을로드 할 필요가 없습니다. 이것은 Spark이 데이터를 더 작은 블록으로 분할하고 이들을 개별적으로 조작하기 때문입니다. 파티션의 수와 크기는 여러 가지 사항에 따라 다릅니다.

    이전의 비트는 Spark에서의 데이터의 표준 처리와 관련이 있지만, Spark이 '메모리 상주'로 광고되기 때문에 잘못된 생각을하게 할 수 있다고 생각합니다. 기본적으로 Spark에는 다른 데이터 처리 도구보다 '메모리가 많습니다'라는 것이 없습니다. sc.textFile (foo) .map (mapFunc) .saveTextFile (bar)은 파일을 블록 단위로 읽고 귀하의 노드를 통해 분산), (컴퓨터 프로그램과 마찬가지로) 메모리에 매핑을 수행 한 다음 다시 저장 장치에 저장합니다. Spark의 메모리 사용은 다음과 같이 더욱 흥미로워집니다 (Scala에서는 익숙해 져 있지만 개념과 메서드 이름은 Python에서 완전히 동일합니다).

    val rdd = sc.textFile(foo)
    // Do some preprocessing, such as parsing lines
    val preprocessed = rdd.map(preprocessFunc)
    // Tell Spark to cache preprocessed data (by default in memory)
    preprocessed.cache()
    // Perform some mapping and save output
    preprocessed.map(mapFunc1).saveTextFile(outFile1)
    // Perform a different mapping and save somewhere else
    preprocessed.map(mapFunc2).saveTextFile(outFile2)
    

    여기에있는 아이디어는 cache ()를 사용하여 사전 처리가 두 번 (아마도) 수행 될 필요가 없다는 것입니다. 기본적으로 Spark은 중간 결과를 저장하지 않지만 각각의 개별 작업에 대한 전체 체인을 계산합니다. 여기서 '작업'은 saveTextFile 호출입니다.

    실제로 데이터를 캐시하는 기능은 노드의 메모리로 제한되기 때문에 '아마도'라고 말했습니다. Spark은 작업 메모리와 별도로 캐시 저장을위한 일정량의 메모리를 예약합니다 (http://spark.apache.org/docs/latest/configuration.html#memory-management에서 이러한 메모리 부분의 크기를 관리하는 방법 참조). 그 양만큼 저장할 수 있습니다.

    귀하의 파티션에 따라 그것은 덜 수도 있습니다. 3 개의 노드 각각에 2GB의 저장 메모리가 있고 전처리 된 데이터가 6GB라고 가정 해 봅시다. 이 데이터에 3 개의 파티션이 있으면 완벽하게 맞고 mapFunc2에 대한 모든 입력 데이터가 메모리에서로드됩니다. 그러나 4 개의 파티션, 1.5Gb의 각 파티션이 각 노드에 캐싱 될 수 있다고 말하면됩니다. 네 번째 파티션은 여전히 ​​각 머신에 남아있는 0.5GB에 맞지 않으므로 두 번째 매핑을 위해이 파티션을 다시 계산해야하며 전처리 된 데이터의 3/4 만 메모리에서 읽을 수 있습니다.

    따라서 이런 의미에서 가능한 한 효율적으로 캐싱을 수행하려면 많은 작은 파티션을 갖는 것이 더 좋지만 다른 단점이있을 수 있습니다 : 더 정교한 그레인 된 모드로 메소 (Mesos)를 사용하는 경우 더 많은 오버 헤드, 거대한 지연 및 작은 출력 파일 (저장하기 전에 병합하지 않는 경우) Spark은 각 파티션을 별도의 파일로 저장하므로

    Durga가 언급 한 것처럼 메모리 스필 디스크에 맞지 않는 데이터를 가질 가능성도 있습니다. 그 링크를 따라갈 수 있습니다 :)

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

    2.기본적으로 저장소 수준은 메모리에 데이터를 저장하려고하는 MEMORY_ONLY입니다. 데이터가 메모리에 맞지 않으면 메모리 부족 문제로 실패합니다.

    기본적으로 저장소 수준은 메모리에 데이터를 저장하려고하는 MEMORY_ONLY입니다. 데이터가 메모리에 맞지 않으면 메모리 부족 문제로 실패합니다.

    MEMORY_AND_DISK, DISK_ONLY 등과 같은 다른 저장소 수준을 지원합니다. Spark 설명서를 통해 다른 저장소 수준을 이해할 수 있습니다. RDD에서 지속 기능을 호출하여 다른 스토리지 레벨을 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/34824349/spark-execution-of-tb-file-in-memory by cc-by-sa and MIT license