Lambda 함수를 사용하여 임시 EMR 클러스터에서 Spark 작업 시작 - AWS 권장 가이드

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

Lambda 함수를 사용하여 임시 EMR 클러스터에서 Spark 작업 시작

작성자: Dhrubajyoti Mukherjee(AWS)

환경: 프로덕션

기술: 분석

워크로드: 오픈 소스

AWS 서비스: Amazon DynamoDB, Identity and Access Management, Lambda

요약

이 패턴은 Amazon EMR RunJobFlow API 작업을 사용하여 Lambda 함수에서 Spark 작업을 실행하는 임시 클러스터를 시작합니다. 임시 EMR 클러스터는 작업이 완료되거나 오류가 발생하는 즉시 종료되도록 설계되었습니다. 임시 클러스터는 계산 시간에만 실행되므로 비용을 절감할 수 있으며 클라우드 환경에서 확장성과 유연성을 제공합니다.

임시 EMR 클러스터는 Lambda 함수에서 Boto3 API와 Python 프로그래밍 언어를 사용하여 시작됩니다. Python으로 작성된 Lambda 함수는 필요할 때 클러스터를 시작하는 추가 유연성을 제공합니다.

샘플 배치 계산 및 출력을 시연하기 위해 이 패턴은 Lambda 함수의 EMR 클러스터에서 Spark 작업을 시작하고 가상 회사의 예제 판매 데이터에 대해 배치 계산을 실행합니다. Spark 작업의 출력은 Amazon Simple Storage Service(S3)에서 쉼표로 구분된 값(CSV) 파일입니다. 입력 데이터 파일, Spark.jar 파일, 코드 스니펫, 계산을 실행하기 위한 가상 사설 클라우드 (VPC) 및 AWS Identity 및 Access Management (IAM) 역할에 대한 AWS CloudFormation 템플릿이 첨부 파일로 제공됩니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정

제한 사항 

  • 코드에서는 한 번에 하나의 Spark 작업만 시작할 수 있습니다. 

제품 버전

  • Amazon EMR 6.0.0에서 테스트됨

아키텍처

대상 기술 스택  

  • Amazon EMR 

  • Lambda

  • Amazon S3

  • Apache Spark

대상 아키텍처 

Lambda 대 Amazon EMR 그리고 Spark 대 Amazon S3

자동화 및 규모 조정

Spark-EMR 배치 계산을 자동화하려면 다음 옵션 중 하나를 사용할 수 있습니다.

도구

서비스

  • Amazon EMR 은 AWS에서 빅 데이터 프레임워크 실행을 간소화하여 방대한 양의 데이터를 처리하고 분석하는 관리형 클러스터 플랫폼입니다.

  • Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있도록 도와주는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

기타 도구

  • Apache Spark는 대규모 데이터 처리를 위한 다중 언어 분석 엔진입니다.

에픽

작업설명필요한 기술

IAM 역할과 VPC를 생성합니다.

이미 AWS Lambda 및 Amazon EMR IAM 역할과 VPC가 있는 경우 이 단계를 건너뛸 수 있습니다. 코드를 실행하려면 EMR 클러스터와 Lambda 함수 모두에 IAM 역할이 필요합니다. 또한 EMR 클러스터에는 NAT 게이트웨이와 함께 퍼블릭 서브넷이나 프라이빗 서브넷이 있는 VPC도 필요합니다. 모든 IAM 역할과 VPC를 자동으로 생성하려면 연결된 CloudFormation AWS 템플릿을 그대로 배포하거나 추가 정보 섹션에 지정된 대로 역할과 VPC를 수동으로 생성할 수 있습니다.

클라우드 아키텍트

AWS CloudFormation 템플릿 출력 키를 기록해 둡니다.

CloudFormation 템플릿이 성공적으로 배포되면 AWS CloudFormation 콘솔의 Outputs 탭으로 이동합니다. 다섯 가지 출력 키를 유념합니다.

  • S3Bucket

  • LambdaExecutionRole

  • ServiceRole

  • JobFlowRole

  • Ec2SubnetId

Lambda 함수를 생성할 때 이러한 키의 값을 사용합니다.

클라우드 아키텍트
작업설명필요한 기술

Spark .jar 파일을 업로드합니다.

Spark .jar 파일을 AWS CloudFormation 스택이 생성한 S3 버킷에 업로드합니다. 버킷 이름은 S3Bucket 출력 키와 동일합니다.

일반 AWS
작업설명필요한 기술

Lambda 함수를 생성합니다.

Lambda 콘솔에서 실행 역할을 가진 Python 3.9+ Lambda 함수를 생성합니다. 실행 역할 정책은 Lambda가 EMR 클러스터를 시작할 수 있도록 허용해야 합니다. (첨부된 AWS CloudFormation 템플릿을 참조하십시오.)

데이터 엔지니어, 클라우드 엔지니어

코드를 복사하여 붙여넣습니다.

lambda_function.py 파일의 코드를 이 패턴의 추가 정보 섹션에 나와 있는 코드로 바꿉니다.

데이터 엔지니어, 클라우드 엔지니어

코드의 파라미터를 변경합니다.

코드의 설명에 따라 파라미터 값을 AWS 계정에 맞게 변경합니다.

데이터 엔지니어, 클라우드 엔지니어

클러스터를 시작하는 함수를 실행합니다.

제공된 Spark .jar 파일을 사용하여 임시 EMR 클러스터 생성을 시작하는 함수를 실행합니다. 작업이 완료되면 Spark 작업과 템플릿이 자동으로 실행됩니다.

데이터 엔지니어, 클라우드 엔지니어

EMR 클러스터 상태를 확인합니다.

EMR 클러스터가 시작되면 Amazon EMR 콘솔의 클러스터 탭에 나타납니다. 클러스터를 시작하거나 작업을 실행하는 동안 발생하는 모든 오류를 적절히 확인할 수 있습니다.

데이터 엔지니어, 클라우드 엔지니어
작업설명필요한 기술

Spark .jar 파일을 업로드합니다.

첨부 파일 섹션에서 Spark .jar 파일을 다운로드하여 S3 버킷에 업로드합니다.

데이터 엔지니어, 클라우드 엔지니어

입력 데이터를 업로드합니다.

첨부된 fake_sales_data.csv 파일을 S3 버킷에 업로드합니다.

데이터 엔지니어, 클라우드 엔지니어

Lambda 코드를 붙여넣고 파라미터를 변경합니다.

도구 섹션에서 코드를 복사하고 Lambda 함수에 코드를 붙여넣어 코드 lambda_function.py 파일을 바꿉니다. 계정에 맞게 파라미터 값을 변경합니다.

데이터 엔지니어, 클라우드 엔지니어

함수를 시작하고 출력을 확인합니다.

Lambda 함수는 제공된 Spark 작업으로 클러스터를 시작한 후 S3 버킷에 .csv 파일을 생성합니다.

데이터 엔지니어, 클라우드 엔지니어

관련 리소스

추가 정보

코드

""" Copy paste the following code in your Lambda function. Make sure to change the following key parameters for the API as per your account -Name (Name of Spark cluster) -LogUri (S3 bucket to store EMR logs) -Ec2SubnetId (The subnet to launch the cluster into) -JobFlowRole (Service role for EC2) -ServiceRole (Service role for Amazon EMR) The following parameters are additional parameters for the Spark job itself. Change the bucket name and prefix for the Spark job (located at the bottom). -s3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar (Spark jar file) -s3://your-bucket-name/prefix/fake_sales_data.csv (Input data file in S3) -s3://your-bucket-name/prefix/outputs/report_1/ (Output location in S3) """ import boto3 client = boto3.client('emr') def lambda_handler(event, context): response = client.run_job_flow( Name='spark_job_cluster', LogUri='s3://your-bucket-name/prefix/logs', ReleaseLabel='emr-6.0.0', Instances={ 'MasterInstanceType': 'm5.xlarge', 'SlaveInstanceType': 'm5.large', 'InstanceCount': 1, 'KeepJobFlowAliveWhenNoSteps': False, 'TerminationProtected': False, 'Ec2SubnetId': 'subnet-XXXXXXXXXXXXXX' }, Applications=[{'Name': 'Spark'}], Configurations=[ {'Classification': 'spark-hive-site', 'Properties': { 'hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'} } ], VisibleToAllUsers=True, JobFlowRole='EMRLambda-EMREC2InstanceProfile-XXXXXXXXX', ServiceRole='EMRLambda-EMRRole-XXXXXXXXX', Steps=[ { 'Name': 'flow-log-analysis', 'ActionOnFailure': 'TERMINATE_CLUSTER', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', '--deploy-mode', 'cluster', '--executor-memory', '6G', '--num-executors', '1', '--executor-cores', '2', '--class', 'com.aws.emr.ProfitCalc', 's3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar', 's3://your-bucket-name/prefix/fake_sales_data.csv', 's3://your-bucket-name/prefix/outputs/report_1/' ] } } ] )

IAM 역할 및 VPC 생성

Lambda 함수에서 EMR 클러스터를 시작하려면 VPC 및 IAM 역할이 필요합니다. 이 패턴의 첨부 파일 섹션에서 AWS CloudFormation 템플릿을 사용하여 VPC 및 IAM 역할을 설정하거나 다음 링크를 사용하여 수동으로 생성할 수 있습니다. 

Lambda 및 Amazon EMR을 실행하려면 다음과 같은 IAM 역할이 필요합니다. 

Lambda 실행 역할

Lambda 함수의 실행 역할은 AWS 서비스 및 리소스에 대한 액세스 권한을 부여합니다.

Amazon EMR의 서비스 역할

Amazon EMR 역할은 리소스를 프로비저닝하고 클러스터 내에서 실행 중인 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 맥락에서 수행되지 않는 서비스 수준 작업을 수행할 때 Amazon EMR에 대해 허용되는 작업을 정의합니다. 예를 들어, 서비스 역할은 클러스터를 시작할 때 EC2 인스턴스를 프로비저닝하는 데 사용됩니다.

EC2 인스턴스의 서비스 역할

클러스터 EC2 인스턴스의 서비스 역할(Amazon EMR에 대한 EC2 인스턴스 프로파일이라고도 함)은 인스턴스를 시작할 때 Amazon EMR 클러스터의 모든 EC2 인스턴스에 할당되는 특별한 유형의 서비스 역할입니다. Apache Hadoop의 상단에서 실행되는 애플리케이션 프로세스는 다른 AWS 서비스와 상호 작용하기 위한 권한에 대해 이 역할을 맡습니다.

VPC 및 서브넷 생성

VPC 콘솔에서 VPC를 생성할 수 있습니다. 

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.