Apache Spark에 대한 데이터 스토리지 최적화

이 문서에서는 Azure HDInsight에서 효율적인 Apache Spark 작업 실행을 위해 데이터 스토리지를 최적화하는 전략에 대해 설명합니다.

개요

Spark는 csv, json, xml, parquet, orc 및 avro와 같은 많은 형식을 지원합니다. 외부 데이터 원본을 사용하여 더 많은 형식을 지원하도록 Spark를 확장할 수 있습니다. 자세한 내용은 Apache Spark 패키지를 참조하세요.

성능에 가장 적합한 형식은 Spark 2.x의 기본값인 스냅 압축이 있는 parquet입니다. Parquet은 데이터를 열 형식으로 저장하며 Spark에서 매우 최적화되어 있습니다.

데이터 추상화 선택

이전 Spark 버전은 데이터를 추상화하기 위해 RDD를 사용했습니다. Spark 1.3에서는 DataFrames이 도입되었고, Spark 1.6에서는 DataSets가 도입되었습니다. 다음과 같은 상대적 장점을 고려합니다.

  • 데이터 프레임
    • 대부분의 상황에서 가장 좋은 선택.
    • Catalyst를 통해 쿼리 최적화를 제공합니다.
    • 전체 단계 코드 생성.
    • 직접 메모리 액세스.
    • 낮은 GC(가비지 수집) 오버헤드.
    • 컴파일 시간 검사 또는 도메인 개체 프로그래밍이 없으므로 DataSets만큼 개발자 친화적이지 않습니다.
  • DataSets
    • 복잡한 ETL 파이프라인에서 성능 영향이 수용 가능한 경우에 잘 작동합니다.
    • 성능에 미치는 영향이 상당할 수 있는 집계에는 좋지 않습니다.
    • Catalyst를 통해 쿼리 최적화를 제공합니다.
    • 도메인 개체 프로그래밍 및 컴파일 시간 검사를 제공하여 개발자 친화적입니다.
    • 직렬화/역직렬화로 인한 오버헤드를 유발합니다.
    • 높은 GC 오버헤드.
    • 전체 단계 코드 생성을 중단합니다.
  • RDD들
    • 새 사용자 지정 RDD를 빌드해야 하는 경우가 아니면 RDD를 사용할 필요가 없습니다.
    • Catalyst를 통한 쿼리 최적화가 없습니다.
    • 전체 단계 코드 생성이 없습니다.
    • 높은 GC 오버헤드.
    • Spark 1.x 레거시 API를 사용해야 합니다.

기본 스토리지 선택

새 Spark 클러스터를 만들 때 Azure Blob Storage 또는 Azure Data Lake Storage를 클러스터의 기본 스토리지로 선택할 수 있습니다. 두 옵션 모두 임시 클러스터에 대한 장기 스토리지의 이점을 제공합니다. 따라서 클러스터를 삭제할 때 데이터가 자동으로 삭제되지 않습니다. 임시 클러스터를 다시 만들고 데이터에 계속 액세스할 수 있습니다.

저장소 형식 파일 시스템 속도 Transient 사용 사례
Azure Blob Storage (애저 블롭 스토리지) wasb://url/ 표준 임시 클러스터
Azure Blob Storage(보안) wasbs://url/ 표준 임시 클러스터
Azure Data Lake Storage Gen 2 abfs://url/ 더 빠른 임시 클러스터
Azure Data Lake Storage Gen 1 adl:url/ 빠른 임시 클러스터
로컬 HDFS hdfs://url/ 가장 빠른 No 대화형 24/7 클러스터

스토리지 옵션에 대한 자세한 내용은 Azure HDInsight 클러스터에서 사용할 스토리지 옵션 비교를 참조하세요.

캐시 사용

Spark는 자체 네이티브 캐싱 메커니즘을 제공하며, 이는 .persist(), .cache(), CACHE TABLE와 같은 다양한 방법을 통해 사용할 수 있습니다. 이 네이티브 캐싱은 작은 데이터 집합 및 중간 결과를 캐시해야 하는 ETL 파이프라인에서 효과적입니다. 그러나 캐시된 테이블이 분할 데이터를 유지하지 않으므로 Spark 네이티브 캐싱은 현재 분할과 잘 작동하지 않습니다. 보다 일반적이고 신뢰할 수 있는 캐싱 기술은 스토리지 계층 캐싱입니다.

  • 네이티브 Spark 캐싱(권장되지 않음)

    • 작은 데이터 세트에 적합합니다.
    • 분할에서는 작동하지 않으므로 향후 Spark 릴리스에서 변경될 수 있습니다.
  • 스토리지 수준 캐싱(권장)

    • IO 캐시 기능을 사용하여 HDInsight에서 구현할 수 있습니다.
    • 메모리 내 및 SSD 캐싱을 사용합니다.
  • 로컬 HDFS(권장)

    • hdfs://mycluster 경로.
    • SSD 캐싱을 사용합니다.
    • 캐시된 데이터는 클러스터를 삭제할 때 손실되며 캐시를 다시 작성해야 합니다.

데이터 직렬화 최적화

Spark 작업은 분산되므로 최상의 성능을 위해 적절한 데이터 직렬화가 중요합니다. Spark에는 다음 두 가지 serialization 옵션이 있습니다.

  • Java serialization이 기본값입니다.
  • Kryo serialization은 최신 형식이며 Java보다 빠르고 압축적인 serialization이 발생할 수 있습니다. Kryo 에서는 프로그램에 클래스를 등록해야 하며 아직 모든 Serializable 형식을 지원하지는 않습니다.

버킷팅 사용

버킷팅은 데이터 분할과 유사합니다. 그러나 각 버킷은 단일 열 값이 아닌 여러 열 값 집합을 포함할 수 있습니다. 이 메서드는 제품 식별자와 같은 값의 큰 수(수백만 개 이상)에서 분할하는 데 적합합니다. 버킷은 행의 버킷 키를 해시하여 결정됩니다. 버킷 테이블은 버킷 및 정렬 방법에 대한 메타데이터를 저장하기 때문에 고유한 최적화를 제공합니다.

일부 고급 버킷팅 기능은 다음과 같습니다.

  • 버킷팅 메타 정보를 기반으로 하는 쿼리 최적화입니다.
  • 최적화된 집계.
  • 최적화된 조인

분할 및 버킷팅을 동시에 사용할 수 있습니다.

다음 단계