파이썬으로 EMR 클러스터 생성
AWS에서 EMR Spark 클러스터를 생성하는 가장 대표적인 방법은 boto3(AWS SDK for Python)를 사용하는 것임.
이때, run_job_flow 메서드를 통해 EMR 클러스터를 손쉽게 생성할 수 있음.
아래 예시는 기본적인 Spark 클러스터를 파이썬 코드로 구성하는 예시임.
사전 준비 사항
1. AWS CLI 설정
로컬 환경에서 AWS CLI를 설치하고, aws configure 명령어를 통해 자격 증명(AWS Access Key ID, Secret Access Key)과 기본 리전을 설정해야 함.
또는, EC2 인스턴스 등에서 IAM Role을 통해 호출할 수도 있음.
이 경우 별도의 키 설정이 필요 없음.
2. boto3 설치
pip install boto3
3. EMR 역할(Role) 및 인스턴스 프로필
EMR 클러스터를 생성하려면 기본적으로 EMR_DefaultRole 및 EMR_EC2_DefaultRole 같은 IAM 역할이 필요함.
AWS 콘솔 → EMR → “Security(보안)” → “Roles(역할)” 또는 IAM 콘솔에서 정책, 역할 등을 확인하고 설정할 수 있음.
간단한 예시 코드
아래 예시는 Spark 애플리케이션이 포함된 EMR 클러스터를 생성하는 파이썬 코드 스니펫임.
import boto3
def create_emr_spark_cluster(
cluster_name: str,
release_label: str = "emr-6.5.0",
region_name: str = "us-east-1",
log_uri: str = "s3://my-emr-logs/",
key_name: str = "my-ec2-key",
subnet_id: str = "subnet-xxxxxxxx",
master_instance_type: str = "m5.xlarge",
core_instance_type: str = "m5.xlarge",
core_instance_count: int = 2,
):
"""
EMR Spark 클러스터를 생성하고, 생성된 클러스터의 ID를 반환합니다.
"""
# 1) EMR 클라이언트 생성
emr_client = boto3.client("emr", region_name=region_name)
# 2) run_job_flow 호출 파라미터 정의
response = emr_client.run_job_flow(
Name=cluster_name,
ReleaseLabel=release_label,
Applications=[
{"Name": "Spark"}, # Spark
{"Name": "Hadoop"}, # (기본)
{"Name": "Hive"}, # (선택) Hive가 필요하면 추가
{"Name": "Pig"}, # (선택) Pig가 필요하면 추가
# {"Name": "Ganglia"}, # (선택) 모니터링 도구
# {"Name": "Zeppelin"}, # (선택) 노트북 환경
],
ServiceRole="EMR_DefaultRole", # EMR에 기본적으로 할당되는 서비스 역할
JobFlowRole="EMR_EC2_DefaultRole", # EC2 인스턴스 프로필(role)
LogUri=log_uri, # S3 로그 경로
Instances={
"InstanceGroups": [
{
"Name": "Master nodes",
"Market": "ON_DEMAND", # 온디맨드 또는 SPOT
"InstanceRole": "MASTER", # 프라이머리 노드
"InstanceType": master_instance_type,
"InstanceCount": 1
},
{
"Name": "Core nodes",
"Market": "ON_DEMAND",
"InstanceRole": "CORE", # 코어 노드
"InstanceType": core_instance_type,
"InstanceCount": core_instance_count
},
# 태스크 노드(Task Node)를 추가하려면 아래와 같이:
# {
# "Name": "Task nodes",
# "Market": "SPOT",
# "InstanceRole": "TASK",
# "InstanceType": "m5.xlarge",
# "InstanceCount": 2
# },
],
"Ec2KeyName": key_name, # SSH 접속 시 사용할 키 페어
"Ec2SubnetId": subnet_id, # VPC 서브넷 ID
"KeepJobFlowAliveWhenNoSteps": True, # 모든 Step이 끝난 후 자동 종료할지 여부
# "TerminationProtected": False, # true면 콘솔에서 클러스터 종료 방지
},
VisibleToAllUsers=True
)
# 3) 생성된 클러스터의 ID 반환
cluster_id = response["JobFlowId"]
print(f"Created EMR cluster with ID: {cluster_id}")
return cluster_id
if __name__ == "__main__":
# 예시 파라미터에 맞춰 함수 호출
create_emr_spark_cluster(
cluster_name="MySparkCluster",
release_label="emr-6.9.0",
region_name="us-east-1",
log_uri="s3://my-emr-logs/",
key_name="my-ec2-key",
subnet_id="subnet-12345678",
master_instance_type="m5.xlarge",
core_instance_type="m5.xlarge",
core_instance_count=2,
)
주요 파라미터 설명은 다음과 같음.
1. Name: 클러스터 이름
ReleaseLabel: EMR 버전(e.g., emr-6.9.0). Spark, Hadoop, Hive 등의 버전이 포함됨
Applications: 설치할 애플리케이션 목록 (Spark, Hadoop, Hive, Pig, Zeppelin 등)
ServiceRole, JobFlowRole: AWS에서 EMR 사용 시 기본적으로 할당되는 IAM 역할
(기본: EMR_DefaultRole, EMR_EC2_DefaultRole)
LogUri: S3 로그 경로 (예: s3://my-emr-logs/)
2. Instances.InstanceGroups:
MASTER: 프라이머리 노드(1개 이상)
CORE: 코어 노드(HDFS에 데이터를 저장 + 작업)
TASK: 태스크 노드(작업만 하고, HDFS에는 저장하지 않음)
3. Market: 인스턴스 요금 모델
ON_DEMAND: 온디맨드
SPOT: 스팟 인스턴스(비용 절감 가능)
4. KeepJobFlowAliveWhenNoSteps: 클러스터에 더 이상 Step이 없을 때 클러스터를 종료하지 않고 유지할지 여부
Ec2SubnetId: VPC 서브넷을 지정 (퍼블릭/프라이빗 서브넷에 따라 구성 차이가 있음)
Ec2KeyName: SSH 키페어 이름
Steps 추가 예시
EMR 클러스터 생성 시, Spark 작업이나 Hive 쿼리 등을 Step으로 추가하여 클러스터가 생성되자마자 자동으로 실행되도록 할 수도 있음.
예를 들어, Spark 애플리케이션을 실행하는 Step을 정의하는 것은 다음과 같음.
spark_step = {
'Name': 'Spark Application',
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': [
'spark-submit',
'--deploy-mode', 'cluster',
's3://my-bucket/my-spark-job.py',
# 필요 시 인자 추가
]
}
}
response = emr_client.run_job_flow(
Name="MySparkClusterWithSteps",
ReleaseLabel="emr-6.9.0",
Applications=[{"Name": "Spark"}],
Instances={
# ...
},
Steps=[spark_step],
ServiceRole="EMR_DefaultRole",
JobFlowRole="EMR_EC2_DefaultRole",
VisibleToAllUsers=True,
LogUri="s3://my-emr-logs/"
)
Steps 파라미터에 여러 개의 스텝(Step)을 넣으면 순서대로 실행됨.
ActionOnFailure를 CONTINUE, TERMINATE_CLUSTER, CANCEL_AND_WAIT 등으로 설정해 실패 시의 동작을 정의할 수 있음.
클러스터 생성 후 확인 및 SSH 접속
1. 클러스터 상태 확인
AWS 콘솔 → EMR → “Clusters”에서 새로 생성된 클러스터(이름, 상태, ID)를 확인할 수 있음.
클러스터 상태가 STARTING → BOOTSTRAPPING → RUNNING(또는 WAITING)이 되면 정상적으로 생성된 것임.
2. SSH 접속
보안 그룹(SG) 설정에서 SSH 포트(기본 22번)가 열려 있어야 하고, Ec2KeyName에 등록된 키를 사용해야 함.
ssh -i <my-ec2-key.pem> hadoop@<MasterPublicDNS> (공인 DNS가 있을 경우) 형태로 접속할 수 있음.
모범 사례
1. IAM 역할
기본 EMR_DefaultRole, EMR_EC2_DefaultRole 외에도, 세분화된 권한(예: S3 버킷, DynamoDB, KMS 등)에 대한 IAM 역할을 할당할 수 있음.
2. 오토 스케일링(Auto Scaling)
스팟 인스턴스 + 태스크 노드를 조합해 비용을 최적화하고, 작업 부하가 높아지면 자동으로 노드를 추가/제거하는 방안을 고려해야 함.
3. 로그 관리
Spark/EMR 로그는 LogUri에 지정한 S3 버킷으로 저장함.
추후 분석이나 모니터링, 디버깅에 유용함.
4. 리전(Region) 선택
작업 데이터(S3 버킷 위치)와 가까운 리전을 선택하면 네트워크 비용과 지연을 줄일 수 있음.
5. 프라이빗 서브넷 구성
EMR 클러스터를 인터넷에 노출하지 않고 VPC 내부에서만 동작하도록 구성할 수도 있음.
이 경우 NAT Gateway, VPC 엔드포인트(S3, DynamoDB 등) 설정이 필요함.
정리
boto3의 run_job_flow 메서드는 파이썬에서 EMR 클러스터를 프로그래밍적으로 생성하는 핵심 메서드임.
필수 파라미터(릴리스 버전, 애플리케이션 목록, 인스턴스 설정, IAM 역할 등)만 정확히 지정하면 Spark 클러스터를 쉽게 생성할 수 있음.
스팟 인스턴스, 오토 스케일링, Steps, 고가용성(Multiple Master) 등 다양한 설정을 함께 적용하여 프로덕션에 적합한 클러스터를 구성할 수 있음.
'Cloud > AWS' 카테고리의 다른 글
[AWS] EMR JVM 모니터링 (0) | 2025.01.14 |
---|---|
[AWS] EMR의 SPARK_DAEMON_JAVA_OPTS (0) | 2025.01.14 |
[AWS] EMR의 유형별 노드 (0) | 2025.01.14 |
[AWS] EMR(Elastic MapReduce) 개념 (0) | 2025.01.14 |
[AWS] istio (0) | 2024.12.08 |