Spark 구성 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Spark 구성

구성 분류를 사용하여 Spark on Amazon EMR을 구성할 수 있습니다. 구성 분류에 대한 자세한 내용은 애플리케이션 구성 섹션을 참조하세요.

Amazon EMR에서 Spark에 대한 구성 분류에는 다음이 포함됩니다.

  • spark - maximizeResourceAllocation 속성을 true 또는 false로 설정합니다. true로 설정하면, Amazon EMR에서 클러스터 하드웨어 구성을 기반으로 spark-defaults 속성을 자동으로 구성합니다. 자세한 정보는 maximizeResourceAllocation 사용하기을 참조하세요.

  • spark-defaults - spark-defaults.conf 파일에서 값을 설정합니다. 자세한 내용은 Spark 설명서에서 Spark configuration을 참조하세요.

  • spark-env - spark-env.sh 파일에서 값을 설정합니다. 자세한 내용은 Spark 설명서에서 Environment variables를 참조하세요.

  • spark-hive-site - hive-site.xml에 Spark에 대한 값을 설정합니다.

  • spark-log4j - (Amazon EMR 릴리스 6.7.x 이하) log4j.properties 파일에서 값을 설정합니다. 자세한 내용은 Github에서 log4j.properties.template 파일을 참조하세요.

  • spark-log4j2 - (Amazon EMR 릴리스 6.8.0 이상) log4j2.properties 파일에서 값을 설정합니다. 자세한 내용은 Github에서 log4j.properties.template 파일을 참조하세요.

  • spark-metrics - metrics.properties 파일에서 값을 설정합니다. 설정 및 자세한 내용은 Github의 metrics.properties.template 파일 및 Spark 설명서의 Metrics(지표)를 참조하십시오.

참고

다른 플랫폼에서 Spark 워크로드를 Amazon EMR로 마이그레이션하는 경우 사용자 지정 구성을 추가하기 전에 Amazon EMR에서 설정한 Spark 기본값 을 사용하여 워크로드를 테스트하는 것이 좋습니다. 대부분의 고객은 기본 설정을 통해 성능을 개선할 수 있습니다.

Amazon EMR에서 설정한 Spark 기본값

다음 테이블에서는 Amazon EMR이 애플리케이션에 영향을 미치는 spark-defaults의 기본값을 설정하는 방법을 보여줍니다.

Amazon EMR에서 설정한 Spark 기본값
설정 설명 기본값
spark.executor.memory

실행기 프로세스당 사용할 메모리 양. 예: 1g, 2g.

이 설정은 클러스터의 코어 및 태스크 인스턴스 유형에 따라 결정됩니다.

spark.executor.cores

각 실행기에서 사용할 코어 수입니다.

이 설정은 클러스터의 코어 및 태스크 인스턴스 유형에 따라 결정됩니다.

spark.dynamicAllocation.enabled

true인 경우 동적 리소스 할당을 사용하여 워크로드를 기반으로 애플리케이션에 등록된 실행기 수를 늘리거나 줄입니다.

true(Amazon EMR 4.4.0 이상)

참고

Amazon EMR에서 Spark Shuffle Service를 자동으로 구성합니다.

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

true인 경우 Hive 메타스토어로의 고급 파티션 조건부 푸시다운이 활성화됩니다.

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

startsWith, contains, endsWith 필터를 Hive 메타스토어로 푸시다운합니다.

참고

Glue는 startsWith, contains 또는 endsWith에 대한 조건부 푸시다운을 지원하지 않습니다. Glue 메타스토어를 사용하는 중에 이러한 함수의 조건부 푸시다운으로 인해 오류가 발생하는 경우 이 구성을 false로 설정합니다.

true

Amazon EMR 6.1.0에서 Spark 가비지 수집 구성

spark.driver.extraJavaOptionsspark.executor.extraJavaOptions에서 사용자 지정 가비지 수집 구성을 설정하면 Amazon EMR 6.1에서 드라이버 또는 실행기가 시작되지 않습니다. Amazon EMR 6.1.0과 가비지 수집 구성이 충돌하기 때문입니다. Amazon EMR 6.1.0의 경우 기본 가비지 수집 구성은 spark.driver.defaultJavaOptionsspark.executor.defaultJavaOptions를 통해 설정됩니다. 이 구성은 Amazon EMR 6.1.0에만 적용됩니다. 로깅 구성과 같이 가비지 수집과 관련이 없는 JVM 옵션(-verbose:class)은 계속 extraJavaOptions를 통해 설정할 수 있습니다. 자세한 내용은 Spark application properties를 참조하세요.

maximizeResourceAllocation 사용하기

클러스터의 각 노드에서 가능한 최대 리소스를 사용하도록 실행기를 구성하려면 spark 구성 분류에서 maximizeResourceAllocationtrue로 설정합니다. maximizeResourceAllocation은 Amazon EMR에만 해당됩니다. maximizeResourceAllocation을 활성화하는 경우 Amazon EMR은 코어 인스턴스 그룹의 인스턴스에 있는 실행기에 대해 사용할 수 있는 최대 컴퓨팅 및 메모리 리소스를 계산합니다. 그런 다음 계산된 최대값을 기반으로 해당 spark-defaults 설정을 설정합니다.

Amazon EMR은 코어 인스턴스 플릿의 인스턴스 유형을 기반으로 실행기에 사용할 수 있는 최대 컴퓨팅 및 메모리 리소스를 계산합니다. 각 인스턴스 플릿은 플릿 내에서 서로 다른 인스턴스 유형과 크기를 가질 수 있으므로 Amazon EMR에서 사용하는 실행자 구성이 클러스터에 적합하지 않을 수 있으므로 최대 리소스 할당을 사용할 때는 기본 설정을 사용하지 않는 것이 좋습니다. 인스턴스 플릿 클러스터의 사용자 지정 설정을 구성하십시오.

참고

HBase와 같은 다른 분산 애플리케이션이 있는 클러스터에서는 maximizeResourceAllocation 옵션을 사용하지 않아야 합니다. Amazon EMR은 분산 애플리케이션에 사용자 지정 YARN 구성을 사용하므로 maximizeResourceAllocation과 충돌하여 Spark 애플리케이션이 실패할 수 있습니다.

다음은 maximizeResourceAllocationtrue로 설정한 Spark 구성 분류 예제입니다.

[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
spark-defaults활성화 시 maximizeResourceAllocation 에서 구성되는 설정
설정 설명
spark.default.parallelism 사용자가 설정하지 않은 경우 조인 reduceByKey, 병렬화 등의 변환으로 반환되는 RDD의 기본 파티션 수입니다.

YARN 컨테이너에서 사용할 수 있는 CPU 코어의 2배수입니다.

spark.driver.memory 드라이버 프로세스에 사용할 메모리 양 (예: 초기화 위치) SparkContext (예: 1g, 2g)

클러스터의 인스턴스 유형을 기반으로 설정이 구성됩니다. 하지만 Spark 드라이버 애플리케이션을 프라이머리 또는 코어 인스턴스 중 하나에서(예를 들면 각각 YARN 클라이언트 및 클러스터 모드에서) 실행할 수 있으므로 설정이 이러한 두 인스턴스 그룹에서 더 작은 인스턴스 유형에 따라 설정됩니다.

spark.executor.memory 실행기 프로세스당 사용하는 메모리 양(예: 1g, 2g)입니다.

클러스터의 코어 및 작업 인스턴스 유형을 기반으로 설정이 구성됩니다.

spark.executor.cores 각 실행기에서 사용할 코어 수입니다. 클러스터의 코어 및 작업 인스턴스 유형을 기반으로 설정이 구성됩니다.
spark.executor.instances 실행기의 수입니다.

클러스터의 코어 및 작업 인스턴스 유형을 기반으로 설정이 구성됩니다. spark.dynamicAllocation.enabled가 동시에 명시적으로 true로 설정되지 않은 경우 설정합니다.

노드 서비스 해제 동작 구성

Amazon EMR 릴리스 5.9.0 이상에서는 Amazon EMR의 Spark에는 수동 크기 조정 또는 자동 조정 정책 요청으로 인해 Spark가 노드 종료를 원활하게 처리하도록 돕는 일련의 기능이 포함되어 있습니다. Amazon EMR은 YARN의 폐기 메커니즘을 기반으로 하여 구축된 Spark에서 블랙리스팅 메커니즘을 구현합니다. 이 메커니즘은 폐기 중인 노드에서 새 작업을 예약하지 않는 동시에 이미 실행 중인 작업을 완료하는 데 도움이 됩니다. 또한 노드가 종료될 때 셔플 블록이 손실되는 경우, Spark 작업을 보다 빠르게 복구하는 데 도움이 되는 기능들도 있습니다. 재계산 프로세스는 더 빨리 트리거되고 단계 재시도 횟수를 줄이면서 더 빨리 재계산하도록 최적화되며, 셔플 블록 누락으로 인한 가져오기 실패로 인해 작업이 실패하는 것을 방지할 수 있습니다.

중요

스팟 인스턴스를 사용할 때 Spark 복원력을 높일 수 있도록 Amazon EMR 릴리스 버전 5.11.0에 spark.decommissioning.timeout.threshold 설정이 추가되었습니다. 이전 릴리스에서는 노드가 스팟 인스턴스를 사용하고 입찰 가격으로 인해 인스턴스가 종료될 때 Spark가 정상적으로 종료를 처리하지 못할 수 있습니다. 작업은 실패할 수 있으며 셔플 재계산 시 상당한 시간이 걸릴 수 있습니다. 이러한 이유로 스팟 인스턴스를 사용하는 경우, 5.11.0 이상의 릴리스를 사용하는 것이 좋습니다.

Spark 노드 서비스 해제 설정
설정 설명 기본값

spark.blacklist.decommissioning.enabled

true로 설정한 경우 Spark는 YARN에서 decommissioning 상태의 노드를 거부 목록에 등록합니다. Spark은 해당 노드에서 실행 중인 executor에 대해 새 작업을 예약하지 않습니다. 이미 실행 중인 작업은 완료 할 수 있습니다.

true

spark.blacklist.decommissioning.timeout

decommissioning 상태의 노드가 거부 목록에 등록된 동안의 시간입니다. 기본적으로 이 값은 1시간으로 설정되는데, 이는 yarn.resourcemanager.decommissioning.timeout에 대한 기본값이기도 합니다. 전체 서비스 해제 기간에 노드를 거부 목록에 등록하려면 이 값을 yarn.resourcemanager.decommissioning.timeout 이상으로 설정합니다. 서비스 해제 제한 시간이 만료되면 노드는 decommissioned 상태로 전환되며 Amazon EMR은 노드의 EC2 인스턴스를 종료할 수 있습니다. 제한 시간이 만료된 후에도 작업이 계속 실행 중이면 다른 노드에서 실행 중인 executor에서 손실되거나 종료되며 일정이 조정됩니다.

1h

spark.decommissioning.timeout.threshold

Amazon EMR 릴리스 5.11.0 이상에서 사용할 수 있습니다. 초 단위로 지정됩니다. 노드가 서비스 해제 상태로 전환될 때 호스트가 이 값보다 작거나 같은 시간 안에 서비스 해제되는 경우, Amazon EMR은 노드가 서비스 해제 상태로 전환되기를 기다리지 않고 노드를 거부 목록에 등록할 뿐 아니라 호스트 상태를 정리합니다(spark.resourceManager.cleanupExpiredHost에서 지정한 대로). 이를 통해 Spark가 스팟 인스턴스 종료를 더 잘 처리할 수 있습니다. 다른 노드가 셔플 파일을 읽기에는 시간이 부족할 수 있는 yarn.resourcemager.decommissioning.timeout 값에 상관없이 20초 제한 시간 이내에 스팟 인스턴스가 폐기되기 때문입니다.

20s

spark.resourceManager.cleanupExpiredHost

true로 설정된 Spark는 decommissioned 상태에 있는 노드의 executor에 저장된 모든 캐시된 데이터와 셔플 블록의 등록을 취소합니다. 이렇게 하면 복구 프로세스가 빨라집니다.

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

true로 설정되면 폐기된 노드에서 가져오기 실패 건수가 너무 많은 이유로 Spark에서 단계 및 작업이 실패하는 문제를 방지하는 데 도움이 됩니다. decommissioned 상태의 노드에서 셔플 블록 가져오기 실패는 연속 가져오기의 최대 실패 횟수에 포함되지 않습니다.

true

스파크 환경 변수 ThriftServer

Spark에서 Hive Thrift Server Port 환경 변수 HIVE_SERVER2_THRIFT_PORT를 10001로 설정합니다.

Spark 기본 설정 변경

spark-defaults 구성 분류 또는 spark 구성 분류의 maximizeResourceAllocation 설정을 사용하여 spark-defaults.conf에서 기본값을 변경합니다.

다음 절차에는 CLI 또는 콘솔을 사용하여 설정을 수정하는 방법이 나와 있습니다.

CLI를 사용하여 spark.executor.memory가 2g로 설정된 클러스터를 생성하는 방법
  • Amazon S3에 저장된 myConfig.json 파일을 참조하는 다음 명령을 사용하여 Spark가 설치되고 spark.executor.memory가 2g로 설정된 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-7.1.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    가독성을 위해 Linux 줄 연속 문자(\)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
콘솔을 사용하여 spark.executor.memory가 2ㅎ로 설정된 클러스터를 생성하는 방법
  1. 새 Amazon EMR 콘솔로 이동하고 측면 탐색에서 이전 콘솔로 전환을 선택합니다. 이전 콘솔로 전환할 때 예상되는 사항에 대한 자세한 내용은 이전 콘솔 사용을 참조하세요.

  2. 클러스터 생성Go to advanced options(고급 옵션으로 이동)를 선택합니다.

  3. Spark를 선택합니다.

  4. 소프트웨어 설정 편집에서 구성 입력을 선택한 채로 다음 구성을 입력합니다.

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. 다른 옵션을 선택하고 항목을 선택한 다음 클러스터 생성을 선택합니다.

설정하려면 maximizeResourceAllocation
  • Amazon S3에 저장된 파일을 참조하여 Spark가 AWS CLI설치되어 있고 true로 maximizeResourceAllocation 설정된 클러스터를 생성합니다. myConfig.json

    aws emr create-cluster --release-label emr-7.1.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    가독성을 위해 Linux 줄 연속 문자(\)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
참고

Amazon EMR 버전 5.21.0 이상에서는 클러스터 구성을 재정의할 수 있으며, 실행 중인 클러스터의 각 인스턴스 그룹에 대해 추가 구성 분류를 지정할 수 있습니다. Amazon EMR 콘솔, AWS Command Line Interface (AWS CLI) 또는 SDK를 사용하여 이 작업을 수행할 수 있습니다. AWS 자세한 내용은 실행 중 클러스터의 인스턴스 그룹에 대해 구성 제공을 참조하십시오.

Apache Log4j 1.x에서 Log4j 2.x로 마이그레이션

Apache Spark 릴리스 3.2.x 이하에서는 레거시 Apache Log4j 1.x 및 log4j.properties 파일을 사용하여 Spark 프로세스에서 Log4j를 구성합니다. Apache Spark 릴리스 3.3.0 이상에서는 Apache Log4j 2.x 및 log4j2.properties 파일을 사용하여 Spark 프로세스에서 Log4j를 구성합니다.

6.8.0 미만의 Amazon EMR 릴리스를 사용하여 Apache Spark Log4j를 구성한 경우 Amazon EMR 6.8.0 이상으로 업그레이드하기 전에 먼저 레거시 spark-log4j 구성 분류를 제거하고 spark-log4j2 구성 분류 및 키 형식으로 마이그레이션해야 합니다. 기존 spark-log4j 분류로 인해 Amazon EMR 릴리스 6.8.0 이상에서 ValidationException 오류로 클러스터 생성이 실패합니다. Log4j 비호환성과 관련된 오류에 대해서는 요금이 부과되지 않지만 계속하려면 더 이상 사용되지 않는 spark-log4j 구성 분류를 제거해야 합니다.

Apache Log4j 1.x에서 Log4j 2.x로 마이그레이션하는 방법에 대한 자세한 내용은 Github에서 Apache Log4j Migration GuideSpark Log4j 2 Template을 참조하세요.

참고

Amazon EMR에서 Apache Spark는 Apache Log4j Migration Guide에 설명된 .xml 파일 대신 log4j2.properties 파일을 사용합니다. 또한 Log4j 1.x 브리지 메서드를 사용하여 Log4j 2.x로 변환하는 방법도 권장하지 않습니다.