Spark 구성 - Amazon EMR

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

Spark 구성

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

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

  • spark - maximizeResourceAllocation 속성을 true 또는 false로 설정합니다. true인 경우 Amazon은 클러스터 하드웨어 구성을 기반으로 spark-defaults 속성을 EMR 자동으로 구성합니다. 자세한 내용은 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(지표)를 참조하십시오.

참고

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

Amazon에서 설정한 Spark 기본값 EMR

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

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

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

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

spark.executor.cores

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

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

spark.dynamicAllocation.enabled

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

true (Amazon EMR 4.4.0 이상)

참고

Spark 셔플 서비스는 Amazon EMR에서 자동으로 구성됩니다.

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 EMR6.1.0에서 Spark 가비지 컬렉션 구성

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

maximizeResourceAllocation 사용하기

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

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

참고

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

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

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

YARN 컨테이너에 사용할 수 있는 CPU 코어 수의 2X.

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

중요

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

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

spark.blacklist.decommissioning.enabled

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

true

spark.blacklist.decommissioning.timeout

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

Spark ThriftServer 환경 변수

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

Spark 기본 설정 변경

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

다음 절차에서는 CLI 또는 콘솔을 사용하여 설정을 수정하는 방법을 보여줍니다.

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

    aws emr create-cluster --release-label emr-7.5.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/amzn-s3-demo-bucket/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
  • Spark가 설치된 클러스터를 생성하고 Amazon S3에 myConfig.json저장된 파일 AWS CLI를 참조하여를 사용하여 true로 maximizeResourceAllocation 설정합니다.

    aws emr create-cluster --release-label emr-7.5.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/amzn-s3-demo-bucket/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) 또는를 사용하여이 작업을 수행합니다 AWS SDK. 자세한 내용은 실행 중 클러스터의 인스턴스 그룹에 대해 구성 제공을 참조하십시오.

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 마이그레이션 안내서에 설명된 .xml log4j2.properties 파일 대신 파일을 사용합니다. 또한 Log4j 1.x 브리지 메서드를 사용하여 Log4j 2.x로 변환하는 방법도 권장하지 않습니다.