기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Spark Connect를 통해 Amazon EMR Serverless로 대화형 세션 실행
Amazon EMR 릴리스 emr-7.13.0 이상에서는 Apache Spark Connect와 함께 EMR Serverless 세션 APIs를 사용하여 VS Code, PyCharm, Jupyter 노트북과 같은 자체 관리형 PySpark 클라이언트에서 Amazon EMR Serverless 애플리케이션에 연결할 수 있습니다. PyCharm Spark Connect는 Spark 드라이버 프로세스에서 애플리케이션 코드를 분리하는 클라이언트-서버 아키텍처를 사용합니다. Spark 작업이 EMR Serverless 컴퓨팅에서 실행되는 동안 로컬 IDE에서 PySpark 코드를 개발하고 디버깅합니다. Spark Connect는 다음과 같은 이점을 제공합니다.
-
VS Code, PyCharm 및 Jupyter 노트북을 포함한 모든 PySpark 클라이언트에서 EMR Serverless에 연결합니다. PyCharm
-
DataFrames가 프로덕션 규모 데이터에서 원격으로 실행되는 동안 중단점을 설정하고 IDE에서 PySpark 코드를 단계별로 살펴봅니다.
Spark Connect 세션은 로컬 PySpark 클라이언트와 Amazon EMR Serverless에서 실행되는 Spark 드라이버 간의 관리형 연결입니다. 세션을 시작하면 EMR Serverless가 사용자를 대신하여 Spark 드라이버와 실행기를 프로비저닝합니다. 로컬 클라이언트는 DataFrame 및 SQL 작업을 드라이버로 전송하고 드라이버는 원격으로 실행합니다. 세션은 종료하거나 유휴 제한 시간에 도달할 때까지 지속되므로 Spark를 다시 시작하지 않고도 대화형으로 여러 쿼리를 실행할 수 있습니다. 각 세션에는 연결하는 데 사용하는 자체 엔드포인트 URL과 인증 토큰이 있습니다.
필수 권한
Amazon EMR Serverless에 액세스하는 데 필요한 권한 외에도 IAM 역할에 다음 권한을 추가하여 Spark Connect 엔드포인트에 액세스하고 Spark Connect 세션을 관리합니다.
emr-serverless:StartSession-
로 지정한 애플리케이션에서 Spark Connect 세션을 생성할 수 있는 권한을 부여합니다
Resource. emr-serverless:GetSessionEndpoint-
세션에 대한 Spark Connect 엔드포인트 URL 및 인증 토큰을 검색할 수 있는 권한을 부여합니다.
emr-serverless:GetSession-
세션 상태를 가져올 수 있는 권한을 부여합니다.
emr-serverless:ListSessions-
애플리케이션의 세션을 나열할 수 있는 권한을 부여합니다.
emr-serverless:TerminateSession-
세션을 종료할 수 있는 권한을 부여합니다.
iam:PassRole-
Spark Connect 세션을 생성할 때 IAM 실행 역할에 액세스할 수 있는 권한을 부여합니다. Amazon EMR Serverless는이 역할을 사용하여 워크로드를 실행합니다.
emr-serverless:GetResourceDashboard-
Spark UI URL을 생성할 수 있는 권한을 부여하고 세션의 로그에 대한 액세스를 제공합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRServerlessApplicationLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:StartSession", "emr-serverless:ListSessions" ], "Resource": [ "arn:aws:emr-serverless:region:account-id:/applications/application-id" ] }, { "Sid": "EMRServerlessSessionLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:GetSession", "emr-serverless:GetSessionEndpoint", "emr-serverless:TerminateSession", "emr-serverless:GetResourceDashboard" ], "Resource": [ "arn:aws:emr-serverless:region:account-id:/applications/application-id/sessions/*" ] }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::account-id:role/EMRServerlessExecutionRole" ], "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }
대화형 세션 작업
Spark Connect 지원 애플리케이션을 생성하고 연결하려면 다음 단계를 따르세요.
Spark Connect 세션을 시작하려면
-
Spark Connect 세션을 사용하여 애플리케이션을 생성합니다.
aws emr-serverless create-application \ --type "SPARK" \ --name "spark-connect-app" \ --release-label emr-7.13.0 \ --interactive-configuration '{"sessionEnabled": true}' -
Amazon EMR Serverless가 애플리케이션을 생성한 후 Spark Connect 세션을 수락하도록 자동 시작을 활성화하지 않은 경우 애플리케이션을 시작합니다.
aws emr-serverless start-application \ --application-idAPPLICATION_ID -
다음 명령을 사용하여 애플리케이션의 상태를 확인합니다. 상태가가 되면 세션을
STARTED시작합니다.aws emr-serverless get-application \ --application-idAPPLICATION_ID -
데이터에 대한 액세스 권한을 부여하는 IAM 실행 역할로 세션을 시작합니다.
aws emr-serverless start-session \ --application-idAPPLICATION_ID\ --execution-role-arn arn:aws:iam::account-id:role/EMRServerlessExecutionRole -
get-sessionAPI를 사용하여 세션 상태를 모니터링하고 세션이STARTED또는IDLE상태가 될 때까지 기다립니다.aws emr-serverless get-session \ --application-idAPPLICATION_ID\ --session-idSESSION_ID -
Spark Connect 엔드포인트 및 인증 토큰을 검색합니다. 에서 반환하는 엔드포인트 URL에는 포트 번호가 포함되지
GetSessionEndpoint않습니다.sc://연결 URL을 구성할 때sc://hostname:443/;use_ssl=true;x-aws-proxy-auth=token:443과 같은를 추가해야 합니다. 그렇지 않으면 PySpark 클라이언트는 기본적으로 포트 15002로 설정되며, 이는 EMR Serverless에서 연결할 수 없습니다.aws emr-serverless get-session-endpoint \ --application-idAPPLICATION_ID\ --session-idSESSION_ID응답에는 엔드포인트 URL과 인증 토큰이 포함됩니다.
{ "endpoint": "ENDPOINT_URL", "authToken": "AUTH_TOKEN", "authTokenExpiresAt": "AUTH_TOKEN_EXPIRY_TIME" } -
엔드포인트가 준비되면 PySpark 클라이언트에서 연결합니다. EMR Serverless 애플리케이션의 Spark 버전과 일치하는 PySpark 클라이언트와 Python용 AWS SDK를 설치합니다.
# Match the PySpark version to your EMR Serverless release version (3.5.6 for emr-7.13.0) pip install pyspark[connect]==3.5.6 pip install boto3
다음은 세션을 시작하고 요청을 세션 엔드포인트로 직접 전송하는 샘플 Python 스크립트입니다.
import boto3 import time from pyspark.sql import SparkSession from pyspark.sql.functions import col client = boto3.client('emr-serverless', region_name='REGION') APPLICATION_ID = 'APPLICATION_ID' EXECUTION_ROLE = 'arn:aws:iam::account-id:role/EMRServerlessExecutionRole' # Start the session response = client.start_session( applicationId=APPLICATION_ID, executionRoleArn=EXECUTION_ROLE ) session_id = response['sessionId'] print(f"Session {session_id} starting...") # Wait for the session to be ready while True: response = client.get_session( applicationId=APPLICATION_ID, sessionId=session_id ) state = response['session']['state'] print(f"Session state: {state}") if state in ('STARTED', 'IDLE'): break if state in ('FAILED', 'TERMINATED'): raise Exception(f"Session failed: {response['session'].get('stateDetails', 'Unknown error')}") time.sleep(5) # Retrieve the Spark Connect endpoint and authentication token response = client.get_session_endpoint( applicationId=APPLICATION_ID, sessionId=session_id ) # Construct the authenticated remote URL auth_token = response['authToken'] endpoint_url = response['endpoint'] connect_url = endpoint_url.replace("https://", "sc://", 1) + ":443/;use_ssl=true;" connect_url += f"x-aws-proxy-auth={auth_token}" # Start the Spark session spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run SQL spark.sql("SELECT 1+1 AS result").show() # Run DataFrame operations df = spark.range(100).withColumn("squared", col("id") * col("id")) df.show(10) print(f"Count: {df.count()}") # Stop the Spark session (disconnects the client only) spark.stop() # Terminate the EMR Serverless session to stop billing. # spark.stop() only closes the local client connection. The remote session # continues running and incurring charges until you explicitly terminate it # or it reaches the idle timeout. client.terminate_session( applicationId=APPLICATION_ID, sessionId=session_id ) print(f"Session {session_id} terminated.")
세션의 라이브 Spark UI 또는 Spark 기록 서버에 액세스하려면 GetResourceDashboard API를 사용합니다.
response = client.get_resource_dashboard( applicationId=APPLICATION_ID, resourceId=session_id, resourceType='SESSION' ) response['url']
세션이 활성 상태인 동안 URL은 쿼리, 단계 및 실행기의 실시간 모니터링을 위해 라이브 Apache Spark UI를 엽니다. 세션이 종료된 후에도 Spark 기록 서버는 Amazon EMR Serverless 콘솔을 통해 세션 후 분석에 계속 사용할 수 있습니다.
고려 사항 및 제한 사항
Spark Connect를 통해 대화형 워크로드를 실행할 때는 다음 사항을 고려하세요.
-
Spark Connect는 Amazon EMR Serverless 릴리스
emr-7.13.0이상에서 지원됩니다. -
Spark Connect는 Apache Spark 엔진에서만 지원됩니다.
-
Spark Connect는 PySpark에서 DataFrame 및 SQL APIs 지원합니다. RDD 기반 APIs는 지원되지 않습니다.
-
인증 토큰은 1시간으로 제한됩니다. 토큰이 만료되면 인증 오류와 함께 gRPC 호출이 실패합니다. 를 호출
GetSessionEndpoint하여 새 토큰을 얻고 업데이트된 토큰SparkSession으로 새 토큰을 생성합니다. -
세션은 구성 가능한 유휴 제한 시간이 지나면 종료됩니다. 기본 제한 시간은 1시간으로 설정됩니다.
-
각 세션에는 기본적으로 24시간의 하드 제한이 있으며, 그 이후에는 태스크를 실행 중인 경우에도 자동으로 종료됩니다.
-
각 EMR Serverless 애플리케이션은 기본적으로 최대 25개의 동시 세션을 지원합니다. 한도 증가를 요청하려면 AWS Support에 문의하세요.
-
기본적으로
autoStopConfig는 애플리케이션에 대해 켜져 있습니다. 활성 세션이나 작업 실행 없이 15분 후에 애플리케이션이 자동으로 중지됩니다.create-application또는update-application요청의 일부로 이 구성을 변경할 수 있습니다. -
최상의 시작 경험을 위해 드라이버 및 실행기에 대해 사전 초기화된 용량을 구성합니다.
-
EMR Serverless 세션을 시작하기 전에 AutoStart를 활성화하거나 애플리케이션을 수동으로 시작해야 합니다.
-
로컬에 설치된 PySpark 버전은 Amazon EMR Serverless 애플리케이션의 Apache Spark 버전과 일치해야 합니다(용 3.5.6
emr-7.13.0). 버전 불일치로 인해ImportError또는 예기치 않은 동작이 발생합니다. -
Lake Formation을 통한 세분화된 액세스 제어는 Spark Connect 세션에서 지원되지 않습니다.
-
신뢰할 수 있는 자격 증명 전파는 Spark Connect를 사용하는 대화형 세션에는 지원되지 않습니다.
-
Spark Connect를 사용하는 대화형 세션에는 EMR Serverless의 서버리스 스토리지가 지원되지 않습니다.
-
Spark Connect 사용에 대한 추가 요금은 없습니다. 세션 중에 사용된 EMR Serverless 컴퓨팅 리소스(vCPU, 메모리 및 스토리지)에 대해서만 비용을 지불합니다.
-
Spark 구성은 EMR Serverless에서
spark.connect.grpc.binding.address예약하며 사용자가 재정의할 수 없습니다. -
로컬로 설치하는 PySpark 패키지는 EMR Serverless 애플리케이션의 Spark 버전과 일치해야 합니다. 버전 불일치로 인해 연결 오류가 발생합니다. Python UDFs(
@udf,spark.udf.register)도 작업자와 일치하도록 로컬 Python 마이너 버전이 필요하거나에서 실패합니다PYTHON_VERSION_MISMATCH. 기본 제공 SQL 함수 및 DataFrame 작업에는 Python 버전 일치가 필요하지 않습니다. -
를 사용하여 Spark 구성을 전달하려면
--configuration-overrides파라미터의runtimeConfiguration에서 해당 구성을start-session설정합니다.start-job-runAPI는applicationConfiguration대신를 사용합니다.