공부 및 정리/기타 정리

AWS EMR을 활용한 Spark 클러스터 서버 구축

스파이펭귄 2024. 6. 24. 23:53
728x90

Spark에 대해 공부하던 도중 AWS의 EMR을 활용하여 Spark 클러스터 서버를 구축해보며, 이를 구축하는 방법에 대해 간단히 정리해보려 한다.

 

EMR이란?

먼저 EMR에 대해서 간단히 알아보자.

빅 데이터 플랫폼 - Amazon EMR - Amazon Web Services

 

AWS 공식 홈페이지에 따르면 EMR은 Elastic Map Reduce의 약자로 Spark, Hive, Presto등과 같은 오픈소스 빅 데이터 처리 프레임 워크를 사용할 수 있는 솔루션을 의미한다.

또한 추가적 애플리케이션으로 HBase, Hadoop 등을 제공할 수 있다고한다.

이를 통해 아래 사항들을 처리 가능하다.

  1. 빅 데이터 분석
  2. 확장 가능한 데이터 파이프라인 구축
  3. 실시간 데이터 스트림 처리
  4. 데이터 과학 및 기계학습 채택 가속화

즉, 간단히 얘기해서 SaaS 형태로 Spark을 비롯한 빅 데이터 처리 프레임워크들을 사용할 수 있게 해주는 것을 의미한다.

 

 

AWS EMR 서버 구축과 SSH 접속

먼저 EMR을 구성해보자.

AWS의 검색창에 EMR을 검색시 찾을 수 있다.

이후 클러스터 생성을 클릭한다.

적절히 EMR의 버전과 필요한 애플리케이션들을 추가해주고, 적절한 리소스를 가진 프라이머리, 코어 인스턴스를 설정 후 키페어를 설정해 보안 구성을 구축 해준다.

마지막으로 IAM을 적절히 생성한 후 클러스터를 생성해주자.

나는 일단 새로 생성하는 방식으로 IAM을 구성하였고, 추가 애플리케이션은 다음을 추가했다.

  1. Spark
  2. Hadoop
  3. Zeppelin

 

클러스터를 생성 후엔 위와 같은 페이지로 이동하게 된다.

이때 잠시 시간이 지난 후엔 위에서 빨간 박스를 친 프라이머리 노드 퍼블릭 DNS가 새로 만들어지게 된다.

이 프라이머리 노드가 바로 마스터 노드로 우리가 SSH 접속을 할 수 있는 노드이다. 이를 복사해두자.

이제 EMR이 구성되는 동안 보안 그룹에서 SSH 접속을 위해 포트를 열어주어야한다.

 

 

SSH 포트 열기

위 페이지에서 제일 하단의 네트워크 및 보안에서 EC2 보안 그룹(방화벽)을 클릭해 “EMR 관리형 보안 그룹”에 접속한다.

위와 같은 페이지로 이동하게 되는데 인바운드 규칙 편집을 클릭한다.

좌하단의 규칙 추가 버튼을 눌러 위 그림처럼 추가해준다.

  • 유형: SSH
  • 소스: 내 IP

이후 본인은 Windows를 사용중이므로 Mobaxterm을 사용해 ssh 연결을 한다.

mac 환경의 경우 SSH를 사용하여 프라이머리 노드에 연결을 눌러 참조하자.

 

 

Mobaxterm을 통한 EMR SSH 접속

좌상단의 Session을 클릭한다.

이후 뜨는 창에서 SSH를 클릭 후 Remote host에는 아까 위에서 본 프라이머리 노드 퍼블릭 DNS를 넣어주고, Specify username은 hadoop으로 설정해준다.

마지막으로 Use private Key를 통해 pem 파일을 추가한 후 Ok버튼을 누르면 아래와 같이 접속 할 수 있다.

이제 인터렉티브한 Spark 프로그래밍을 위해 아까 추가한 Zeppelin에 접속할 준비를 해보자.

 

 

SSH 터널링과 SwitchyOmega를 통한 애플리케이션 Web UI 접속

SSH와 SSH 터널링이란?

먼저 SSH는 Secure Shell의 약자로 네트워크를 통해 두 시스템 간에 보안된 통신을 가능케 하는 프로토콜이다. 주로 원격 서버에 로그인하거나, 명령을 실행하기 위해 사용된다.

SSH 연결의 기본적 흐름은 아래와 같다.

  1. SSH 클라이언트 실행: 사용자는 SSH 클라이언트를 사용해 원격 서버에 연결을 시도
  2. 서버 인증: 클라이언트가 서버의 공개키를 확인해 올바른 서버에 연결되는지 검증
  3. 사용자 인증: 서버는 사용자 인증을 요청, 이는 비밀번호 공개키 또는 다른 인증 방법을 통해 수행
  4. 암호화된 통신: 인증이 완료된 후, 클라이언트와 서버간 통신은 암호화되어 안전하게 이루어짐

Shell에서 SSH 연결을 하는 커멘드는 다음과 같다.

ssh [사용자명]@[호스트]

위 예시에서 사용자 명이 hadoop이었고, 호스트는 ec2~~ 였으므로 다음과 같아질 것이다.

ssh -i ~/mykey.pem hadoop@ec2~~~

이때 -i 옵션은 비밀번호 키 파일의 사용을 의미한다.

SSH 터널링은 SSH 연결을 통해 다른 네트워크 서비스에 대한 보안된 터널을 만드는 것이다.

이를 통해 암호화되지 않은 프로토콜을 SSH 를 통해 안전하게 전달할 수 있다. SSH 터널링은 다음 3가지가 있다.

  1. 로컬 포워딩 (Local Forwarding)
    클라이언트 머신의 포트를 원격 서버의 특정 포트에 연결한다. 이를 통해 클라이언트는 마치 로컬에서 서비스에 접근하는 것처럼 원격 서비스에 접근할 수 있다.
    즉, localhost로 원격 서비스에 접근한다는 의미이다.
    ssh -L 8081:localhost:8081 hadoop:ec2~~~
    위 EMR 8080 포트를 로컬 8081 포트로 연결하고 싶다면 아래와 같이 할 수 있을 것이다.
    ssh -L [로컬포트번호]:[로컬호스트]:[연결하고픈 원격포트번호] [사용자]@[호스트]

  2. 원격 포워딩 (Remote Forwarding)
    원격 포워딩은 원격 서버의 포트를 클라이언트 머신의 특정 포트에 연결한다. 이를 통해 로컬 포워딩과 반대로 원격 서버가 클라이언트 서버에 접근할 수 있게 된다.
  3. ssh -R [원격포트번호]:[로컬호스트]:[로컬포트번호] [사용자]@[서버]
  4. 동적 포워딩 (Dynamic Forwarding)
    마지막으로 동적 포워딩은 SSH 클라이언트를 SOCKS 프록시 서버로 연결해 다양한 포트와 호스트에 대한 트래픽을 터널링한다.
    즉, 한번의 터널링으로 원격 서버의 여러 포트에 접근할 수 있다는 것이다.
    ssh -D [로컬포트] [사용자]@[서버]
    이를 통해 로컬 포트 8080을 SOCK 프록시로 설정하고, 브라우저에서 localhost:8080으로 하면 모든 트래픽이 SSH 를 통해 전송된다.
    이 경우에는 SwitchyOmega등의 프록시 설정 프로그램을 통해서 여러 포트에 동적으로 안전하게 접근할 수 있다. 이는 이후 아래에서 진행해볼 예정이다.

요약해보자면 아래와 같다.

  • SSH 연결은 네트워크를 통해서 안전하게 원격 서버에 로그인하거나 명령을 실행하는 방법이다.
  • SSH 터널링은 SSH를 통해 다른 네트워크 서비스에 대한 보안된 통신 경로를 설정하는 방법이다.

편의를 위해 마찬가지로 Mobaxterm을 사용해 SSH 터널링을 수행하여 동적 포워딩을 하겠다.

 

 

Mobaxterm을 통한 SSH 터널링

터널링을 클릭하자.

좌 하단 New SSH tunnel을 클릭하자.

클릭 후 Local port Forwarding에서 Dynamic port forwarding (SOCKS proxy)로 변경하여 한번의 SSH 터널링을 통해 여러 port에 접속할 수 있도록 해주자.

좌측 Forwarded port에는 내 localhost에서 접속할 port 번호를 넣어준다. (본인은 8890으로 설정)

우측에 SSH server에는 위에서부터 차례로 프라이머리 노드 퍼블릭 DNS 주소, hadoop, 22(ssh 포트번호) 를 넣어준 후 save한다.

이후 먼저 우측 열쇠 아이콘을 클릭해 pem 파일을 추가해준 후 좌측 시작 버튼을 눌러 SSH 터널링을 시작한다.

 

 

 

SwitchyOmega를 통한 Web UI 접속을 위한 프록시 서버 설정

옵션 2, 파트 2: 프라이머리 노드에 호스팅된 웹 사이트를 표시하도록 프록시 설정 구성 - Amazon EMR

 

옵션 2, 파트 2: 프라이머리 노드에 호스팅된 웹 사이트를 표시하도록 프록시 설정 구성 - Amazon EMR

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

위 AWS 문서를 참조하여 Chrome 확장 프로그램으로 SwitchyOmega를 설치한다.

SwitchyOmega에 들어가 New profile을 클릭하여 우측 그림과 같이 설정 후 프로필을 생성한다.

위 그림처럼 아래 코드를 PAC Script에 붙여넣고 Apply changes를 클릭한다.

이때 8890 대신 아까 ssh 터널링 시 설정한 포트를 넣어주어야 한다.

function FindProxyForURL(url, host) {
    if (shExpMatch(url, "*ec2*.*compute*.amazonaws.com*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "*ec2*.compute*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "http://10.*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "*10*.compute*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "*10*.amazonaws.com*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "*.compute.internal*")) return 'SOCKS5 localhost:8890';
    if (shExpMatch(url, "*ec2.internal*")) return 'SOCKS5 localhost:8890';
    return 'DIRECT';
}

 

이후 SwitchOmega를 클릭 후 emr-socks-proxy로 프록시를 변경 후 프라이머리 노드 퍼블릭 DNS:8890 으로 WEB UI에 접속할 수 있다!

View web interfaces hosted on Amazon EMR clusters - Amazon EMR

 

View web interfaces hosted on Amazon EMR clusters - Amazon EMR

View web interfaces hosted on Amazon EMR clusters It is possible to configure a custom security group to allow inbound access to these web interfaces. Keep in mind that any port on which you allow inbound traffic represents a potential security vulnerabili

docs.aws.amazon.com

 

이외에도 위 문서에 따른 포트번호를 통해 여러 애플리케이션의 WEB UI에도 접속할 수 있다.

위는 spark WebUI (18080 포트)로 접속한 결과다.

잘 접속 되는 것을 확인할 수 있었다.

항상 AWS와 같은 클라우드에서 작업시에는 모든 작업 후엔 EMR 클러스터를 꼭 종료해주자.

Reference

728x90