Spark 구성 - 아마존 EMR

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

Spark 구성

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

Spark on Amazon의 구성 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 Amazon으로 Spark 워크로드를 마이그레이션하는 경우 사용자 지정 구성을 아마존에서 설정한 스파크 기본값 EMR 추가하기 전에 를 사용하여 워크로드를 테스트하는 것이 좋습니다. 대부분의 고객은 기본 설정을 통해 성능을 개선할 수 있습니다.

아마존에서 설정한 스파크 기본값 EMR

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

아마존에서 설정한 스파크 기본값 EMR
설정 설명 기본값
spark.executor.memory

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

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

spark.executor.cores

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

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

spark.dynamicAllocation.enabled

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

true(아마존 EMR 4.4.0 이상)

참고

스파크 셔플 서비스는 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

아마존 EMR 6.1.0에서 스파크 가비지 컬렉션 설정하기

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

maximizeResourceAllocation 사용하기

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

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

참고

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

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

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

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

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

중요

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

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

spark.blacklist.decommissioning.enabled

true 설정하면 Spark 거부는 현재 상태에 있는 노드를 나열합니다. decommissioning YARN 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

아마존 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 환경 변수

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.2.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.2.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) 또는 를 사용하여 이 작업을 수행할 수 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 6.8.0 이상으로 업그레이드하려면 먼저 기존 spark-log4j 구성 분류를 제거하고 spark-log4j2 구성 분류 및 키 형식으로 마이그레이션해야 합니다. EMR Amazon EMR 릴리스 6.8.0 이상에서는 레거시 spark-log4j 분류로 인해 클러스터 생성이 실패하고 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로 변환하는 방법도 권장하지 않습니다.