Spark 구성 - Amazon EMR

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

Spark 구성

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

Amazon EMR에서 Spark를 사용하기 위한 구성 분류에는 다음이 포함됩니다.

  • sparkmaximizeResourceAllocation 속성을 참 또는 거짓으로 설정합니다. true인 경우 Amazon EMR은 클러스터 하드웨어 구성을 기반으로spark-defaults 속성을 자동으로 구성합니다. 자세한 내용은 사용 maximizeResourceAllocation을 참조하세요.

  • spark-defaultsspark-defaults.conf 파일에 값을 설정합니다. 자세한 내용은 Spark 설명서의 Spark 구성을 참조하십시오.

  • spark-envspark-env.sh 파일에 값을 설정합니다. Spark.

  • spark-hive-site— Spark의hive-site.xml 값을 설정합니다.

  • spark-log4j— (Amazon EMR 릴리스 6.7.x 이하)log4j.properties 파일에 값을 설정합니다. Github log4j.properties.ETPLATEMPLATES.

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

  • spark-metricsmetrics.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(emr-4.4.0 이상)

참고

스파크 셔플 서비스는 Amazon EMR에서 자동으로 구성합니다.

아마존 EMR 6.1.0에서 스파크 가비지 컬렉션 구성

spark.driver.extraJavaOptionsspark.executor.extraJavaOptions 로 사용자 지정 가비지 컬렉션 구성을 설정하면 Amazon EMR 6.1.0과 가비지 컬렉션 구성이 충돌하기 때문에 Amazon EMR 6.1에서 드라이버 또는 실행기 시작 오류가 발생합니다. ForAmazon EMR 6.1.0, 기본 가비지 컬렉션 구성은spark.driver.defaultJavaOptions 및 를 통해 설정됩니다spark.executor.defaultJavaOptions. Amazon EMR 6.1.0. 로깅 (-verbose:class) 구성과 같이 가비지 컬렉션과 관련이 없는 JVM 옵션은 계속 설정할 수 있습니다extraJavaOptions. Spark.

사용 maximizeResourceAllocation

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

참고

HBase와 같은 다른 분산 애플리케이션이 있는 클러스터에서는 이maximizeResourceAllocation 옵션을 사용하지 않아야 합니다. Amazon EMR은 분산 애플리케이션에 사용자 지정 YARN 구성을 사용하는데, 이로 인해 SparkmaximizeResourceAllocation 애플리케이션과 충돌하여 장애가 발생할 수 있습니다.

다음은maximizeResourceAllocation set to 를 사용한 스파크 구성 분류의 예입니다true.

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

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

spark.blacklist.decommissioning.enabled

로 설정하면true Spark 거부는 YARNdecommissioning 상태에 있는 노드를 나열합니다. 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가 설치되고 2g로spark.executor.memory 설정된 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-5.36.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --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가 2g로 설정된 클러스터를 만들려면
  1. https://console.aws.amazon.com/emr 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-5.36.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --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) 또는AWS SDK를 사용하여 이 작업을 수행할 수 있습니다. 자세한 내용은 실행 중 클러스터의 인스턴스 그룹에 대해 구성 제공을 참조하십시오.

아파치 로그4j 1.x에서 Log4j 2.x로 마이그레이션하기

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

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

아파치 Log4j 1.x에서 Log4j 2.x로 마이그레이션하는 방법에 대한 자세한 내용은 아파치 Log4j 마이그레이션 가이드 및 Github의 Spark Log4j 2 템플릿을 참조하십시오.

참고

Amazon EMR에서 아파치 스파크는 아파치 Log4j 마이그레이션 가이드에 설명된 .xmllog4j2.properties 파일 대신 파일을 사용합니다. 또한 Log4j 1.x 브리지 메서드를 사용하여 Log4j 2.x로 변환하지 않는 것이 좋습니다.