데이터 통합파이프라인 최적화 및 디버깅Spark스파크 개념

본 번역은 검증되지 않았습니다. AIP를 통해 영문원문으로부터 번역되었습니다.

스파크 개념

스파크 소개

스파크란?

스파크는 Foundry에서 대규모 데이터 변환을 실행하기 위해 사용되는 분산 컴퓨팅 시스템입니다. 스파크는 원래 UC 버클리의 연구자 팀에 의해 개발되었으며, 그 후 2000년대 후반에 아파치 재단에 기부되었습니다. Foundry를 통해 스파크를 기반 계산 레이어로 사용하여 대량의 데이터에 대해 SQL, Python, Java 및 Mesa 변환을 실행할 수 있습니다 (Mesa는 독점 Java 기반 DSL입니다).

스파크가 어떻게 작동합니까?

스파크는 데이터를 처리하기 위해 여러 컴퓨터에 작업을 분산시켜 동시에 실행하는 것에 의존합니다. 이 프로세스는 MapReduce라는 방법으로 사용자와 프로젝트 간에 동시 작업을 빠르게 실행할 수 있게 해줍니다. 이러한 컴퓨터는 드라이버와 실행기로 나뉩니다.

  • 드라이버는 스파크 작업의 "지휘자"와 같습니다. 작업의 일부를 실행기에게 분배하는 역할을 담당합니다.
  • 실행기는 스파크 작업의 "일꾼"과 같습니다. 드라이버에 의해 할당된 작업 부분에 대한 계산을 수행하는 역할을 담당합니다. 이 작업은 여러 "파티션"으로 나뉘며, 각 실행기는 코드를 실행할 일부 파티션을 받습니다. 이 작업을 완료하면 드라이버에게 다시 돌아가 작업이 완료될 때까지 추가 작업을 요청합니다.
  • 모든 스파크 작업에는 변환을 실행하는 데 가장 적합한 스파크 프로파일을 생성하기 위해 조작할 수 있는 여러 변수가 있습니다.
    • 스파크 작업 내에서 작업 실행을 빠르고 쉽게 처리하는 것과 작업 실행과 관련된 비용 및 리소스 사이에 균형이 필요합니다.
    • 대체로, 실행기와 메모리를 더 많이 사용하면 실행 시간이 줄어들고 비용이 증가합니다.
    • 작업의 특성에 따라 드라이버와 실행기의 일부 조합과 구성이 다른 것보다 더 잘 작동합니다. (이에 대해서는 나중에 자세히 설명하겠습니다)
    • 스파크 프로파일은 Foundry가 분산 컴퓨팅 리소스 (드라이버 및 실행기)에 적절한 양의 CPU 코어와 메모리를 설정하는 데 사용하는 구성입니다.
  • 모든 스파크 작업에는 5개의 구성 가능한 변수가 있습니다.
    • 드라이버 코어: 스파크 드라이버에 할당된 CPU 코어 수를 제어합니다
    • 드라이버 메모리: 스파크 드라이버에 할당되는 메모리를 제어합니다.
      • JVM 메모리만 제어됩니다. 이것은 스파크 외부의 외부 비 작업 (Python 라이브러리 호출과 같은)에 필요한 "오프-힙" 메모리를 포함하지 않습니다.
    • 실행기 코어: 각 스파크 실행기에 할당된 CPU 코어 수를 제어하며, 이는 각 실행기에서 동시에 실행되는 작업 수를 제어합니다.
    • 실행기 메모리: 각 스파크 실행기에 할당되는 메모리를 제어합니다.
      • 이 메모리는 실행기에서 실행되는 모든 작업 간에 공유됩니다.
    • 실행기 수: 작업을 실행하기 위해 요청되는 실행기 수를 제어합니다.
  • 모든 내장 스파크 프로파일 목록은 스파크 프로파일 참조에서 찾을 수 있습니다.

spark-job-breakdown

스파크 프로파일 튜닝

  • 변환 실행 중 문제가 발생하면 스파크 프로파일을 조정하여 특정 작업을 가능하게 하는 사용자 정의, 비 기본 구성을 생성해야 할 수 있습니다. 예를 들어:
    • 작업에 더 많은 메모리가 필요할 수 있습니다.
    • 작업이 유즈케이스에 필요한 것보다 느리게 실행될 수 있습니다.
    • 작업을 완전히 실패하게 하는 오류가 발생할 수 있습니다.
  • 비 기본 스파크 프로파일을 사용하려면 먼저 변환을 포함하는 Code Repositories로 가져와야 합니다. 이 과정은 스파크 프로파일 사용 문서에서 설명합니다.

기본 프로파일에서 스파크 프로파일을 수정할 때

  • 스파크 프로파일 편집시 엄지손가락 법칙으로 한 번에 하나의 변수만 증가시키고 한 번에 한 단계씩 증가시킵니다.
    • 예를 들어, 처음에는 실행기 메모리만 조정하여 EXECUTOR_MEMORY_SMALL에서 EXECUTOR_MEMORY_MEDIUM으로 높이고 다른 것을 조정하기 전에 작업을 다시 실행합니다. 이렇게 하면 작업에 필요 이상의 리소스를 할당함으로써 발생하는 불필요한 비용을 피할 수 있습니다.
  • 백엔드 기본값은 항상 특정 스파크 프로파일에 매핑되지는 않지만 일반적으로 SMALL로 표시된 내장 프로파일로 근사화됩니다.
    • 올바른 기본값 (비 Python 변환용)은 EXECUTOR_CORES_SMALL, EXECUTOR_MEMORY_SMALL, DRIVER_CORES_SMALL, DRIVER_MEMORY_SMALL, NUM_EXECUTORS_2입니다.
    • Python은 JVM 외부에서 실행되는 Python 라이브러리 호출과 같은 비 JVM 오버헤드 메모리를 더 사용할 수 있습니다.
  • 스파크 작업에 문제가 발생하면 첫 번째 단계는 코드를 최적화하는 것입니다.
    • 가능한 한 최적화한 후에도 문제가 발생하면 특정 권장 사항을 참조하세요.
  • 작업이 성공적으로 실행되었지만 유즈케이스에 필요한 것보다 느리게 실행될 경우:
    • 실행기 수를 늘려보십시오 - 실행기 수를 늘리면 병렬로 실행할 수 있는 작업 수가 증가하여 성능이 향상됩니다 (제공되는 작업이 충분히 병렬인 경우). 동시에 리소스 사용으로 인해 비용도 증가합니다.
      • 특정 빌드에 대한 빌드 애플리케이션 페이지에서 작업 속도를 개선할 수 있는지 여부를 확인하는 차트를 볼 수 있습니다. 작업 동시성이 실행기 수에 가까워지지 않으면 실행기 수를 늘리는 것이 실행 시간을 개선하는 데 도움이 되지 않을 가능성이 높습니다.
      • builds-app-task-concurrency-chart.png
    • 실행기 수를 두 배로 늘려도 실행 시간이 1/3 이상 줄어들지 않으면 코드가 비효율적일 가능성이 높습니다 (예: 카탈로그에서 많이 읽거나 카탈로그에 많이 쓰는 경우).
      • 6분 짜리 작업을 생성하는 변환에 대해 실행기 수를 두 배로 늘리면 4분 이내에 실행해야 합니다.
      • 실행기 수를 절반으로 줄이면 작업 속도가 50% 미만으로 느려집니다 (예: 4분에서 6분). 실행 시간이 중요하지 않은 한 리소스를 절약하기 위해 실행기 수를 낮춰야 합니다.
    • 큰 프로파일 (예: 128 또는 그 이상의 실행기)에 대한 제한을 설정하여 중요한 리소스를 사용할 수 있는 경우만 승인된 유즈케이스를 사용할 수 있도록 할 수 있습니다. 한계에 도달하여 더 높게 설정해야 하는 경우 팔란티어 담당자에게 문의하십시오.
    • 실행기는 시작 시 약 10분에 걸쳐 드라이버에 축적됩니다. 이는 높은 실행기 수를 가진 짧은 작업이 시스템에서 스래싱을 줄이기 위해 실행기 수를 줄여야 함을 의미합니다. 예를 들어, 10분 이내에 실행되는 64 실행기 작업은 32 실행기로 줄여야 합니다. 작업이 모든 컴퓨팅 리소스를 획득할 때쯤 작업이 거의 완료되기 때문입니다.
  • 작업이 실패하고 OOM (메모리 부족) 오류 또는 코드 논리 기반 실패 원인과 연결되지 않은 "셔플 단계 실패" 오류가 발생할 경우:
    • 실행기 메모리를 SMALL에서 MEDIUM으로 늘려보십시오. 이렇게 하면 대량의 데이터를 처리하는 데 도움이 됩니다.
      • MEDIUM에서 LARGE로 조정해야 할 것 같다면 전문가에게 도움을 요청하십시오. 가능하면 문제 해결 가이드에 설명된 대로 변환을 단순화하는 것을 고려하십시오.
  • 드라이버에게 대량의 데이터를 수집하거나 큰 브로드캐스트 조인을 수행할 경우:
    • 드라이버 메모리를 늘려보십시오.
  • "스파크 모듈이 응답하지 않음"과 같은 오류가 발생하고 입력 데이터셋에 많은 파일이 있는 경우:
    • 먼저 드라이버 메모리를 늘려보십시오.
    • 드라이버 메모리를 늘린 후에도 오류가 지속되면 드라이버 코어 수를 2로 늘리십시오.
  • 많은 파일을 읽는 변환을 가지고 있고 GC (가비지 컬렉션) 문제가 발생할 경우:
    • 드라이버 코어를 2로 늘려보십시오.

권장 사항

관리자를 위한 것

  • 유즈케이스가 끝날 때 이 유즈케이스를 위해 생성된 모든 사용자 정의 프로파일을 삭제하십시오.
    • 이렇게 하면 혼란을 줄이고 너무 많은 사용자 정의 프로파일을 생성하는 것을 방지할 수 있습니다.
  • 리소스 집약적인 프로파일은 관리자가 명시적으로 허용한 후에만 사용할 수 있도록 권한을 설정하십시오.
    • 예를 들어, NUM_EXECUTORS_32EXECUTOR_MEMORY_LARGE (이상)는 요청 및 요청 승인 시에만 사용할 수 있어야 합니다.
    • EXECUTOR_CORES_SMALL을 제외한 모든 실행기 코어 값은 크게 제어되어야 합니다 (왜냐하면 이것은 컴퓨팅 파워를 늘리는 은밀한 방법이고, 거의 모든 경우에 NUM_EXECUTORS 프로파일로 사용자를 유도하려고 하기 때문입니다).

스파크 프로파일 조정을 위한 것

  • 가능한 한 기본(즉, 없음) 프로파일을 사용하십시오.
    • 이렇게 하면 비용과 혼란을 줄일 수 있습니다.
  • 기본 프로파일을 사용할 수 없는 경우 내장 프로파일을 사용하십시오.
  • 새 프로파일 구성을 설정할 때 이름 또는 유즈케이스 이름으로 저장하십시오.
    • 이렇게 하면 조직을 개선할 수 있으며, 이 프로파일이 다른 사용자나 프로젝트에서 별도의 지식 없이 사용되지 않도록 합니다.
    • 그렇지 않으면 어떤 프로파일이 어떤 용도로 설정되었는지 모르는 너무 많은 프로파일 목록이 생성됩니다.
  • 메모리를 늘릴 때 8:1 리소스 (즉, EXECUTOR_CORES_SMALLEXECUTOR_MEMORY_MEDIUM 조합)를 초과하는 것은 관리자의 승인을 받아야 합니다. EXECUTOR_CORES_EXTRA_SMALLEXECUTOR_MEMORY_LARGE를 차단하십시오. 이렇게 요청하는 사용자는 최적화가 미흡하거나 중요한 워크플로가 있을 가능성이 높습니다.
  • 프로파일은 분리 가능해야 합니다. 각 프로파일은 하나의 스파크 변수(또는 스파크 변수의 하나의 논리적 조합)만 영향을 줍니다.
    • 예를 들어, 새 프로파일을 생성할 때 실행기 수만 변경한 다음 실행기 메모리나 드라이버 메모리와 같은 다른 변수도 변경하지 않고 시도해 보십시오.
  • 동일한 스파크 모듈에서 많은 스파크 작업이 동시에 실행되는 특별한 경우를 제외하고는 드라이버 코어의 기본 구성을 무시하지 않아야 합니다.
  • 기본 실행기 코어 구성은 거의 무시되어야 합니다.
  • 15분 이내에 실행되는 작업은 64 실행기를 사용하지 않아야 합니다.
    • 이렇게 많은 실행기는 대부분의 시간을 단순히 높이는 데 사용됩니다.
  • 사용자 정의 프로파일을 생성하고 실행할 때 스파크 상세에서 사실을 확인하십시오.
    • 스파크 상세는 작업이 얼마나 빨리 수행되는지를 추적하고 동시 작업에 대한 세부 정보를 제공합니다.