DevOps

[AWS]EMR on EKS 세팅 실습하기

Hazel_song 2022. 6. 3. 16:47
728x90

EMR을 기본적으로 활용할 때, spark 작업을 진행하려면 기본적으로 제공하는 리소스 매니저인 yarn 보다는

k8s 즉 aws eks를 리소스 매니저로 활용하는 것이 좋다.

빠른 처리 속도를 지닌 spark에 대한 리소스 관리를 yarn보다 더 빠르고 효율적으로 해주기 때문이다.

리소스 매니저로서 yarn과 k8s에 대한 비교는 후에 좀 더 자세히 다뤄보는 것으로 하고, 이번에는 EMR을 EKS 위에 세팅하는 방법에 대해서 정리해보려 한다.

 

aws에서 제공하는 개발가이드 문서(링크)를 참고해서 설정했다.

1. eks 클러스터 세팅

블로그 정리한 글 참고하여 세팅하기

 

2. emr 클러스터 세팅

블로그 정리한 글 참고하여 세팅하기

 

3. eks에서 emr에 대해 액세스 활성화하기

eks에서 emr이 클러스터의 특정 네임스페이스에 액세스할 수 있도록 허용해야 한다. 쿠버네티스 역할 생성, 쿠버네티스 사용자에게 역할을 바인딩하고 사용자를 서비스 연결 역할로 매핑한다. 

 

a. eksctl이 설치

우선 설치 확인

eksctl version

설치되어 잇지 않다면 아래 명령어를 차례대로 실행

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

b. eks namespace 생성

kubectl create namespace $DATALAKE_NAMESPACE

c. namespace에 접근 허용

eksctl create iamidentitymapping \
    --region $REGION \
    --cluster $EKS_CLUSTER_NAME \
    --namespace $DATALAKE_NAMESPACE \
    --service-name "emr-containers"

아래와 같은 명령어가 뜨면 성공

 

4. 자격증명 공급자 생성 혹은 이전에 이미 생성한거 활용

-> 나는 eks 클러스터 만들면서 이미 생성했고, 그걸 사용하기

 

5. role 생성

vim ./emr-trust-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "elasticmapreduce.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

aws iam create-role --role-name EMRContainers-JobExecutionRole --assume-role-policy-document file://~/emr-trust-policy.json

 

수정

vim ./EMRContainers-JobExecutionRole.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}

aws iam put-role-policy --role-name EMRContainers-JobExecutionRole --policy-name EMR-Containers-Job-Execution --policy-document file://~/EMRContainers-JobExecutionRole.json

 

역할의 신뢰정책 업데이트

 aws emr-containers update-role-trust-policy \
       --cluster-name eks-cluster \
       --namespace namespace \
       --role-name iam_role_name_for_job_execution

 

6. 사용자에게 emr에 대한 액세스 권한 부여

 

아래의 권한을 가진 policy 만들기

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "emr-containers.amazonaws.com"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "emr-containers:CreateVirtualCluster",
                "emr-containers:ListVirtualClusters",
                "emr-containers:DescribeVirtualCluster",
                "emr-containers:DeleteVirtualCluster"
            ],
            "Resource": "*"
        }
    ]
}

위의 policy를 IAM 유저에 추가하기

 

 

7. eks 클러스터에 emr 등록

a. emr이 private subnet안에 구축되어 있으니, bastion server로 ssh 접속하여서 해당 서버에 아래 파일 생성

vim ./create-virtual-cluster-request.json
{
    "name": "emr cluster 이름",
    "containerProvider": {
        "type": "EKS",
        "id": "eks cluster 이름",
        "info": {
            "eksInfo": {
                "namespace": "eks에 emr이 등록될 네임스페이스 이름"
            }
        }
    }
}

b. 아래 명령어로 위의 파일을 실행하여 eks 클러스터에 emr 등록

aws emr-containers create-virtual-cluster --cli-input-json file://./create-virtual-cluster-request.json

아래와 같은 메세지가 뜨면 성공

 

8. 등록된 가상 클러스터 나열/확인

aws emr-containers list-virtual-clusters

아래와 같이 쉘로 확인 가능하다.

 

실제로 콘솔에 확인해보면 emr cluster에 있던 클러스터는 terminate가 되고

emr on eks virtual cluster에 옮겨져 가있는 모습을 확인할 수 있다.

근데 emr cluster 안 만들고 바로 cli로 virtual cluster 만들수 있다.

 

 

참고자료

 

https://aws.amazon.com/ko/blogs/korea/new-amazon-emr-on-amazon-elastic-kubernetes-service-eks/

 

새로운 기능 — Amazon EMR on Amazon Elastic Kubernetes Service(EKS) | Amazon Web Services

수만 명의 고객이 Amazon EMR을 사용하여 Apache Spark, Hive, HBase, Flink,Hudi 및 Presto와 같은 프레임워크에서 빅 데이터 분석 애플리케이션을 대규모로 실행합니다. EMR은 이러한 프레임워크의 프로비저닝

aws.amazon.com

https://www.eksworkshop.com/advanced/430_emr_on_eks/prereqs/

 

EKSworkshop.com

In this workshop, we will explore multiple ways to configure VPC, ALB, and EC2 Kubernetes workers, and Amazon Elastic Kubernetes Service.

www.eksworkshop.com

https://www.youtube.com/watch?v=D3WOEhcev88 

https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/virtual-cluster.html

 

가상 클러스터 관리 - Amazon EMR

가상 클러스터가 성공적으로 생성되었는지 확인하려면 다음을 실행하여 가상 클러스터의 상태를 확인합니다.list-virtual-clusters명령 또는가상 클러스터Amazon EMR 콘솔의 페이지입니다.

docs.aws.amazon.com

https://programmer.ink/think/create-and-run-an-emr-on-eks-cluster.html

 

Create and run an EMR on EKS cluster

The creation of EMR on EKS is completely command-line driven. At present, there is no corresponding UI interface to complete relevant operations. This article will demonstrate how to create and run an EMR on EKS cluster from the command line. The process o

programmer.ink

 

728x90