그들이 AWS 위에서
데이터 파이프 라인을 운영하는 법
Devops Korea
Jun 8, 2019
1ambda @ yanolja
데이터 인프라를 몰라도�재밌고 유익한 시간이 되도록 구성�하려고 노력하였습니다
(Apache Zeppelin Committer)�활동 언제 다시 할거니�Apache 계정은 무료 인텔리제이 용도일뿐�
(Data Engineering)
사장님! 커밋할 시간이 없..
사장님이 이 슬라이드를 보실지 모르겠지만, 만약 보신다면�
사장님! 이 슬라이드는 저희집 고양이가 만들었습니다.�
본 슬라이드에 나온 내용은 �회사의 입장을 대변하지 않으며
개인적 견해임을 미리 밝힙니다.
Contents
슬라이드 기획 당시 의도했던 청중
120 분으로 알차게 기획 🙊
어디든지 불러만 주신다면
하지만 시간상! (40분)�텍스트 많은 슬라이드는 빠르게 진행 ✈️�나중에 한번 확인해 보세요
경험담 = 고통 가득
데이터 인프라
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
사랑은 돌아오는거야!
어떤 데이터를 다루나요?
| 국내 숙박
| 해외 숙박
같아 보이지만 �업체 형태나 �숙박 형태에 따라 �데이터의 구조와 분석 형태가�많이 다름
| 레저
| 티켓
| 건설
| 교육
| 비품
X 커머스
재고, 상품, 주문, �정산, 쿠폰, 포인트, 고객, …�+ B2B (업주 관련 통계 등)
데이터 인프라
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
B2C 더하기 B2B
그들 = 3명
나를 뺀다 = 2명�(발표자는 6개월 전에 Join, 오니까 이미 모든게 되어있..)
@isaac.choo, @eunseons
입사 당일
어서와
리얼 월드는 처음이지?
Contents
서비스 데이터 분석을 위해
Data Infra - 왜 데이터 인프라가 필요한가요?
파이프라인 기초�Batch 와 Stream
Data Infra - Batch & Stream
Batch - 주기적으로 데이터를 처리합니다.�(e.g. 1일, 1시간 등)
Data Infra - Batch 레이어
Stream - 데이터를 실시간으로 처리합니다.�(e.g. 즉시, N 초 Windowing 등)
Data Infra - Stream 레이어
Tumbling Window
Data Infra - Stream 레이어 (2,Window) ✈️
Sliding Window
Batch 는 이미 존재하는 데이터를 Bulk 로 로딩하나,
Stream 은 흘러 들어오는 데이터를 다룸 �지나간 것은 지나간대로
특정 기간동안의 상태 (User Session 등) 계산 위해�Streaming 프레임워크는 Application State 를 지원 (Spark, Flink 등)
State 는 메모리 (1차) 저장되므로
일부 프레임워크는 Batch 와 Stream API 를 유사하게�구성해 로직을 재활용 하도록 지원 (Spark Structured)
Data Infra - Stream 레이어 (3, State) ✈️
Batch 와 Stream 레이어 집계를 합산�(기간별 + 실시간)
Data Infra - Serving 레이어
현재까지의 해당 업체 광고 클릭 수 �= 2019.01.01 ~ 어제까지의 모든 클릭 수 (Batch)
+= 오늘 00:00:00 부터의 클릭 수 (Stream)�
서빙 레이어는 고비용. 꼭 필요한 경우에만 사용�일반적으로는 배치 또는 스트림만 이용�
Data Infra - Serving 레이어 (2)
서빙 레이어 (Batch + Stream 집계) 는 고비용
S3 (or RDS) Dynamo (or ES), RDS (or API)
(Batch) (Stream) (Serving)
따라서 일반적인 집계 (통계 등) 은 Batch 로 끝내고
실시간 집계가 필요한 경우만! (e.g. CPC 광고)
실시간 (Stream) 이라고 해서 항상 정확하지 않음�상당히 (N 시간) 늦게 들어오는 로그들이 있기 때문에 �일반적으로는 Batch 가 따라가면서 보정하는 형태��실시간에 가까워질 수록 여러분이 자다가 깨어날�확률이 높아집니다 😎
Data Infra - Serving 레이어 (3) ✈️
서빙 레이어 관련 읽을 거리
Data Infra - Serving 레이어 (4) ✈️
기초적인 내용을 알아봤으니
본격적으로 시작해볼까요?
데이터 인프라
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
해야 할 것들이 이리도 많은데 🙊
Data Infrastructure - AWS (Example)
그들 = 3명
목표
수집 대상
Data Infra - 수집
Client 로그
Client 로그 (앱이나 웹에서 발생하는 이벤트 e.g. GA)
따라서 세심한 관리가 필요
좋은 퀄리티를 위해서는 별도의 툴들이 필요
Data Infra - 수집 (Client 로그)
일반적인 해결 방법은 Kafka
Kafka 는 고비용
- 운영 리소스 필요 (Upgrade, Monitor, ..)
- 일정 이상의 (3+) Broker 인스턴스 필요
- Zookeeper 클러스터 필요 (3+)
- 앞단에서 받아줄 ELB / Nginx / API 필요
차라리 이럴바엔..
Data Infra - 수집 (Client)
Data Infra - 수집 (Client)
설마 이 짤방을 모르신다면!
대통령님! 이 슬라이드는 저희집 고양이가 만들었습니다.�
Data Infra - 수집 (Client)
Kinesis 는 Client SDK 존재 (App / Web)
Data Infra - 수집 (Client)
다만 Connector 지원이 Kafka 에 비해 미비 😓
Server 로그
Data Infra - 수집 (Server)
서버 로그는 크게 2 가지로 나눌 수 있음
일반적으로 두 가지 형태로 수집
Agent 는 주로 WEB / WAS 의 Log File (stdout)
Library 는 중요 Event (e.g. Payment, Login 등) 를 전송
Kinesis 로 직접 전송할 경우
Data Infra - 수집 (Server) ✈️
AWS EB (Beanstalk) 의 경우 로그 파일을 S3 퍼블리싱
Kinesis
�서울 Region에는 도대체 언제 나오는 것입니까 �AWS! 일하라!
Data Infra - 수집 (Server)
제프 베조스님! 이 슬라이드는 저희집 고양이가 만들었..�
Kinesis 로 보낸 아이들은 어떻게 되나요?
Data Infra - 수집 (Kinesis)
EMR 은 일종의 Amazon 관리형 데이터 처리 프레임워크�다만 조금 비쌀뿐. Task Spot 을 애용합시다
Data Infra - 수집 (Kinesis)
Spark Streaming 으로 가공해 (세션 ID 등. e.g. GA)
- Stream 레이어: 다른 Kinesis Stream 으로 보내거나
(별도 저장소 필요시 카운터 값 등 Dynamo 저장)�
- Batch 레이어: S3 에 저장 (SQL 쿼리 조회 가능)
- 준 실시간 View 를 위해 Hot S3 (1분 이내)
- 늦게 들어온 로그까지 처리한 Cold S3 (수시간 내)
Data Infra - 수집 (Kinesis)
Log (시계열) 데이터는 조회시 속도, 편의성을 위해 �어느시점에 들어온 것인지 파티션 단위로 관리
이 경우 늦게 들어온 로그는 어떻게 처리할지 정의해야 함
로그가 늦게 들어오는 이유는 다양함! 문제는 언제 들어올지 알 수 없음 (Q. 미래의 로그가 들어온다면? 🤔)
늦게 들어오는 15시 로그를 위해, 6 시간동안 기다릴 수 있으나 (15 + 6 = 21)
“그러면 현재 들어오고 있는 로그는 어떻게 확인할 수 있을까?”
Data Infra - 수집 (Hot, Cold) ✈️
Storage 스냅샷
수집 대상
Data Infra - 수집 (Storage)
Storage 의 경우 다음의 문제와 씨름해야 함
현재는 입수 대상인 DB 의 컬럼 변경 사항을�자동으로 파악해서 데이터 관련자들에게 매일 알림
Data Infra - 수집 (Storage)
수집 대상: 저장소 (Storage)
EMR 이용해서 Batch 프로세싱 (Spark, PySpark)
S3 를 메인 저장소로 사용
Hive MetaStore
Data Infra - 수집 (Storage)
잠깐! Columnar 포맷이 뭐죠? 먹는건가요?
Parquet 는 Row (행) 이 아니라 Column (열) 기반 포맷
VCNC Apache Spark에서 Parquet 제대로 활용하기
기본적인 아이디어는
=> 연산시 같은 컬럼 내 값들을 �비슷한 Disk 위치에 묶어두면 조회가 빠르지 않을까?
=> LOGIN/LOGIN/LOGIN 을 매번 저장하지 않고, �값의 인덱스와 그 위치만 저장한다면 사이즈가 줄지 않을까?
Data Infra - 수집 (Parquet) ✈️
잠깐! Hive Meta 뭐죠?�마시는건가요?
Hive 메타스토어는 일종의 Schema 저장소 (RDS + Server)
Managed 서비스로 AWS Glue Catalog 가 존재 하지만 IAM 으로 접근제어
Data Infra - 수집 (Storage - Hive MetaStore) ✈️
좌측 DDL 에서 볼 수 있듯이
읽을거리
Data Infra - 수집 (Storage - Hive MetaStore, 2) ✈️
테이블 생성
파티션 생성
데이터 조회
AWS 서비스 로그
수집 대상
일부 AWS 서비스는 지정된 S3 Bucket 에 로그를 저장
Data Infra - 수집 (AWS 로그)
AWS 가 남겨주는 서비스 로그의 경우 S3 에 저장
다만 다수의 AWS Account 를 사용할 경우 관리가 복잡해짐
AWS 가 남겨주는 서비스 로그의 경우
Data Infra - 수집 (AWS 로그)
S3 의 경우 Role-based (IAM) 로 권한 관리
AWS 가 남겨주는 로그의 실제 Owner 는 AWS 쪽 Account�단지 사용자 계정 (Prod) 에 Full Access 권한만 주는 것.
그럼 EMR (Presto) 로 조회하는 Data 쪽 계정은?
S3 Object 를 다 찾아 Data 쪽 계정을 권한 추가 하기 어려움
권한 준다 하더라도 Data 쪽 계정이 사용하는 툴 (e.g Presto) 가 �assume-role 기능을 지원하지 않으면? 망했어요
Data Infra - 수집 (AWS 로그)
AWS 가 남기는 S3 는 EMR 이 위치한 Account 에서 관리!
아마 난 안될거야. DynamoDB 사랑해요
Data Infra - 수집 (AWS 로그)
한장으로 요약해주세요
슬라이드 너무 많아�현기증나요
데이터는 일단 모두 S3 에 적재 (S3 as a Table)
Data Infra - 수집 (요약) ✈️
데이터 인프라
= 데이터 수집
+= 데이터 처리
+= 데이터 조회
+= 데이터 서비스
데이터 처리는 S3 (원본) + 별도 스토리지 적재
Data Infra - 처리 = 원본 적재 후 별도의 가공 단계 (요약) ✈️
데이터 티어 구조
Data Infra - Data 티어 구조
데이터는 수집 이후 가공 과정을 거치게 됨. 데이터의 성격에 따라 티어를 나누어 관리
(레거시, 인수 합병 등 이유로 너무 많은 서비스 테이블을 조인 할 경우)
ya!!! 인수합병 하는 소리좀 안나게 하라!
Application, Table 구조
Data Infra - Table 이름 규칙 ✈️
도메인과 상관없이 공통으로 적용될 수 있는 Table 구조에 관해 논의 (Batch 기준)
예를 들어, 경쟁업체 관련된 테이블 데이터 생성시
원천 테이블을 Aggregated 없이 가공했다면
Table 을 만드는 Batch Application 의 구조에 관해 논의
오늘은 월요일! 주말과 오늘 오전까지 Daily 배치가 장애 😭 (토 / 일 / 월)
PlaceImpression_1Range_20190608_PROD : 업체별 노출수를 20190618 기준으로 1번 적재
PlaceImpression_30Range_20190508_PROD : 업체별 노출수를 20190508 부터 20190606 까지 적재
Data Infra - Batch Application 구성 팁 ✈️
여러 Storage 에 Sink 로 내보내는 경우 부분 실패 또는 부분 적재가 필요할 수 있음
가공후 S3 에 원본 + RDS 에 서비스용 적재 경우
이 경우 S3 만 읽어서 재적재 가능하도록 구성하면
Data Infra - Batch Application 구성 팁 (2)
EMR 운영 관련 팁
Batch / Stream / Presto 용 EMR 클러스터를 구분해 운영
DaaS / EDA 는 사용률 높은 시간에 Task 인스턴스를 Spot 다량 추가
Data Infra - EMR 클러스터 운영 (Example)
Data Infra - EMR 클러스터 운영 (Example)
Data Infra - EMR 클러스터 운영 (Sample) ✈️
Data Infra - Spark (Yarn) Client / Cluster 모드 ✈️
Driver (main) 이 Client 에서 실행
(Client Mode)
(Cluster Mode)
Driver (main) 이 Cluster 에서 실행
Data Infra - Spark Client / Cluster 모드 ✈️
(Cluster Mode)
일반적인 방법 이외에도 AWS 에서는 EMR Job 을�Yarn Cluster 모드로 Submit 위해 Step API 제공
waitAppCompletion 값이 참일경우 다음 Step 실행 X
Data Infra - Spark Yarn Cluster 모드 모니터링 ✈️
Data Infra - Spark Yarn Cluster 모드 모니터링 (스크린샷)
Digdag SLA 알림
Spark Driver 실패 알림
파이프라인 스케쥴링 팁
배치 스케쥴링: 배치는 스케쥴링 / 재작업을 항상 염두에 두어야 함
특정 시점에 작업을 시작 / 실패시 재시도 / 작업간 의존성 관리 등
Workflow Orchestration 도구 필요
Data Infra - Batch 레이어 스케쥴링
Data Infra - Digdag
기타 기능 들
Data Infra - Digdag Dag File Example
다른 Dag 을 호출하거나�설정 파일 Include 가능
Loop 를 지원
: 3월 1일부터 31일 데이터 복구
If 문 등 기초적 문법 지원
Data Infra - Digdag File Structure Example
일별 / 시간별 배치 스크립트와 운영용 스크립트 별도 관리
Stream Application ✈️
Streaming 프레임워크는 Application State 를 지원
Data Infra - Stream State ✈️
State 를 유지하는 이유는 결국 최종 Output 을 위함�(e.g. 업체별 광고 클릭수를 DynamoDB 에 저장)
따라서 Application 내 State 를 유연하게 가져갈 필요
Application State 를 복구의 기준으로 삼으면
Data Infra - Stream State (2) ✈️
데이터 인프라
= 데이터 수집
+= 데이터 처리
+= 데이터 조회
+= 데이터 서비스
데이터를 조회할 수 있는 툴과 언어는 너무 많다!
사용자에 따라 데이터 관련 지식의 수준이 천차만별
모든 조건을 만족시키는 단 하나의 툴은 존재하지 않음
Data Infra - 데이터 조회 (SQL)
왜 프레스토 합니까 사용 당신은? 항상 감사하십시오 AWS 에게
읽을거리
Data Infra - 데이터 조회 (Presto)
Redash, Zeppelin, Jupyter, Tableau 를 주된 탐색 도구로 이용
Data Infra - 데이터 조회 (탐색 도구들)
Re:dash
이것만 알아 가도�오늘 본전은 (33000원)�뽑았
Redash:
사용 용도
Data Infra - Re:dash (리대시 활용)
Redash 쿼리 파라미터
Data Infra - Re:dash (쿼리 파라미터)
변수 사용
다양한 변수 타입
Redash 쿼리 파라미터
Data Infra - Re:dash (쿼리 파라미터, 2)
Drop Down
Time Range
Redash 스케쥴링 및 얼럿
Data Infra - Re:dash (Scheduling, Alert)
Alert 플러그인 타입들
Data Infra - Re:dash 로 CloudTrail 로그 조회
CloudTrail 은 JSON 포맷 (느린) 에 양이 많은 경우가 있음
아래 예제는 A 계정에서 ThrottlingException 이 분당 많이 발생하는 사용자를 찾아내 정렬
데이터 결과를 보다 유연한 형태로 제공해 커뮤니케이션 도구로 사용
기획자 / 내부 운영자에게 Table 형태로 숫자만 가져가는 것 보다 이리 저리 돌려볼 수 있는 자유도 제공
(아래 스크린샷 및 데이터는 모두 Dummy 데이터, 구글 검색 이미지)
Data Infra - Re:dash 로 데이터 프로토타이핑
Data Infra - Re:dash 로 데이터 프로토타이핑 (2)
Presto 의 geo-spatial 함수를 이용해 보아요�(위도 경도를 이용해 근처 아이템 탐색 등)
데이터 인프라
= 데이터 수집
+= 데이터 처리
+= 데이터 조회
+= 데이터 서비스
개인화 추천
개인화 푸시 (리타게팅)
가격 조절 (AirBNB 의 Smart Pricing)
공급 조절
기타 데이터로 할 수 있는 모든 것 (B2B, B2C)�할게 많아요 Y 사 DI 팀은 �여러분을 기다리고 있습니다
Data Infrastructure - 데이터 서비스 (혹은 데이터 프로덕트)
Contents
왜 테라폼으로�데이터 인프라를�이전 했는가?
AWS Account 이전 �요청을 받았습니다�역시 전세는 위험해
AWS API (EC2 리스트 확인 등) 은 대부분 Call Limit (기간당 요청 제한) 이 있음
“ElasticBeanstalk 화면에 아무것도 나오지 않습니다!” “배포가 안되요!”
일반적으로는 Dev, Prod, Data 등 용도에 따라서 Account 를 분리
Terraforming Data Infra - AWS Call Limit ✈️
따라서 입주민들이 �많아지면 많아질수록 �AWS Call Limit 이 자주 발생�민원이 들어옵니다
그리고 일반적으로�Data 팀은 Service 팀에 비해 �다양한 AWS 리소스�더 많은 IAM 권한을 사용�나 빼고 모두 로그아웃 해주세요�혼자있고 싶으니까
그러므로 데이터 팀은�별도의 AWS Account 를 �사용하는편이 정신건강에 좋음�AdministratorAccess 가 �가지고 싶었어요
Terraforming Data Infra - 여러개의 AWS 계정 사용 ✈️
AWS IAM 의 Assume Role
데이터 팀은 다수의 Account 를 다뤄야 하기 때문에�Assume Role 에 익숙해 질 것! 하지만 같은 실수를 매번 반복하지
우측 그림은 Data 계정의 Terraform 커맨드 서버에서
다른 Account 로 assume role 이용해,
각 계정의 Role (P, D, X 등) 의 권한으로
해당 계정의 리소스를 다루는 경우를 설명
근데 왜 테라폼으로�데이터 인프라를�이전 했습니까?
관리되지 않는 �기존 인프라 히스토리
기존 데이터 인프라 구성: 손으로 버튼 눌러서 만듦
Terraforming Data Infra - 테라폼을 사용하지 않을 때
장점은 일단 귀찮음 테라폼은 지정된 옵션을 넣지 않으면 적용이 불가
Terraforming Data Infra - 테라폼을 사용할 때
Terraforming Data Infra - Terraform 관련 팁들
팀 내에는 Terraform 을 모르는 사람도 충분히 있을 수 있음
ASG 처럼 운영성으로 UI 에서 값을 변경하는경우가 존재. 이런 값들은 ignored_changes 에 등록
2) 다만 Security Group, IAM 은 Rule 과 Policy 등 디테일하게 Terraform 으로 관리할 것
이름 규칙과 Description (주석) 을 한 곳에서 관리해야 통일성 및 히스토리 파악 용이
3) Community 모듈의 경우 변화가 생길 수 있으니 VPC 나 EKS 등 복잡하고, � 크리티컬한 모듈은 Clone 해 사용
4) IAM 은 추후 권한을 회수 당하거나 할 수 있으니 별도의 프로젝트로 분리 제발 이 권한만은 흑흑
5) EMR 의 경우 Step (Job) 이 많아지면서 나중에 기하급수적으로 plan 이 느려짐 � 같은 모듈이나 프로젝트에 영향을 주므로, 별도의 프로젝트로 분리 후 필요한 리소스만 apply� “tf apply -target module.module-emr_PROD.aws_emr_cluster...”
6) 큰 하나의 프로젝트보다는, 작게 쪼개진 프로젝트가 운영이 편함. 상호 참조는 remote state 로
AWS EC2 인스턴스에는 Bootstrap Action 이라는 기능이 존재
따라서 Bootstrap Action 을 Script 로 만들어 놓으면 아래 처럼 활용 가능 (이후에는 Terraform 에서 재활용)
특정 대역 (X.X.X.10 ~ 19) 을 예약 하기 위해 (선점 방지) ENI 를 미리 만들어 둘 수 있음
�
Terraforming Data Infra - Terraform 관련 팁들 (2)
데이터 팀 특성상 다양한 (관리형) 스토리지 를 사용하게 됨
AWS 는 관리형 스토리지에 대해서 다양한 Cloudwatch Metric 을 제공
따라서 중요한 메트릭은 미리 Cloudwatch Alert 걸어 놓을 것.
Cloudwatch 의 Metric 들을 (Custom 포함, 이전 슬라이드의 EC2 Disk, Memory 등)
은 aws-to-slack 같은 terraform 모듈 이용하면 쉽게 Slack 으로 전송 (Cloudwatch - > SNS -> Lambda)
Terraforming Data Infra - Terraform 관련 팁들 (3) ✈️
Kinesis 메트릭
Custom 메트릭 (EMR Master Memory)
Terraforming Data Infra - 프로젝트 구조
프로젝트는 잘게 썰어서 구성
DB 등 별도의 Account 는 다른 프로젝트로
파일 이름은 IDEA 에서�검색이 쉽도록�prefix / postfix 붙여서 생성�
Contents
기존 데이터 조회 시스템으로는 해결이 어려운 문제들
Jupyter on Kubernetes - 데이터 조회 시스템
Jupyter?
Jupyter on Kubernetes - Jupyter
Netflix 에서는 Jupyter 를 위한 Scheduling 등 인프라 제공 (Notebook Innovation at Netflix)
빨간 점선 박스는 Netflix 가 Jupyter Notebook 인프라를 위해 만든 별도 오픈소스들
Jupyter on Kubernetes - Jupyter @ netflix ✈️
Jupyter on Kubernetes - Jupyter vs Jupyter Hub
본래 Jupyter 는 개인 노트북에서 실행되는 개인별 노트북
JupyterHub 는 다수의 사용자에게 Jupyter 할당 할 수 있도록 만들어짐
Q. JupyterHub 를 어떻게 Kubernetes 에 설치합니까?
Kubernetes (AWS EKS) 위에 쉽게 JupyterHub 설치 가능: Jupyter Zero to Kubernetes
설치는 방법은 문서에 잘 나와있으니 설치보다는 고통받았던 내용이나 팁들에 관해서 설명 😎
여러종류의 컨테이너를 사용자에게 제공 할 수 있음
Jupyter on Kubernetes - Zero to Kubernetes
Jupyter on Kubernetes - 다양한 컨테이너 제공
사용자가 매번 시작시 �필요한 컨테이너 골라서 사용 가능
conda 환경 및 커널 EBS 에 저장 가능�다음에도 같은 conda 환경 이용 (= pyenv)
jupyter/docker-stack 의 �기본 컨테이너만 8 가지
�필요하면 추가로 빌드해서�이미지 제공가능 (tensorflow-gpu 등)
Kubernetes 기본 기능 중 Pod 별로 Resource (CPU, Memory, GPU) 를 조절 할 수 있음
GPU는 'extra_resource_guarantees': {"nvidia.com/gpu": "2"}’ 처럼 세팅 가능
Jupyter on Kubernetes - Resource 관리
컨테이너마다 guarantee 할 리소스가 부족하면 당연하게도 컨테이너가 생성되지 않음
Jupyter 컨테이너 생성시 리소스가 부족하면 �지정된 한도 (max) 내에서 알아서 Node 를 추가
추가되는 동안 Jupyter 는 Pending
Node 가 추가되면 자동으로 Jupyter 생성
일정 시간후 사용률이 떨어지면 늘어난 노드 제거
Jupyter on Kubernetes - Cluster Autoscaler ✈️
Jupyter on Kubernetes - EKS 노드 그룹 관리
Kubernetes Node Selector 를 이용해 Pod (컨테이너) 를 지정된 Node 그룹에 할당 가능
EKS (Kubernetes) 는 Node 를 그룹지어 Pod (컨테이너) 를 할당 할 수 있음
(JupyterLab System Pods) t3.small * 720 (1달) = 약 $19
(Computing Pods = Jupyter) c5.2xlarge * 720 * 2대 * 0.3 (spot) = 약 $166 (16 CPU, 32 GiB)
(EKS 고정비용) 0.2 * 720 = 약 144$
만약 Computing 노드를 일 10시간씩 평일 5일만 쓰고, 나머지 시간엔 ASG desired = 0 처리하면�(max = N 으로 두어 여전히 요청시 사용 가능하게, Cluster Autoscaler)
(Computing) c5.2xlarge * 200 * 2대 * 0.3 (spot) = 약 $46
c5.18xlarge * 200 * 1대 * 0.3 (spot) = 약 $208 (72 CPU, 144 GiB)
$208 + $19 + $144 + (EBS + EFS 비용 약간) = 월 $400 로 72 Core 144 GiB Jupyter 시스템제공
월 $600 이면 144 Core, 288 GiB 😎
Jupyter on Kubernetes - EKS 노드 그룹 관리 (2) ✈️
Jupyter 노트북 결과 파일 (.ipynb 확장자) 를 HTML 로 렌더링 해 공유할 수 있음 (e.g. Github)
오픈 소스 프로젝트로 NbViewer 가 존재 �누가 이것도 Audit / ACL / 검색 있는 버전으로 오픈소스 내면 대박날거에요
Jupyter on Kubernetes - 노트북 공유 NBViewer ✈️
Jupyter on Kubernetes - 노트북 공유 NBViewer 설치 ✈️
여러개의 Jupyter 컨테이너에서 작성한 ipynb 파일을 NbViewer 컨테이너에서 바로 렌더링 하려면?�다운받고 업로드하고 하면 또 한 세월이니
우선 여러개의 Jupyter 컨테이너에서 작성한 파일을 즉시 NbViewer 컨테이너에서 읽을 수 있어야
1) Kubernetes Node 디스크를 Jupyter 컨테이너와 NbViewer 컨테이너에 마운트� Node (Host) 디스크를 마운트 한다는 순간부터 정상적인 방법은 아닌것 같다. 디스크 풀 나면?
2) S3 를 Disk 처럼 Mount 해서 쓸 수 있는 방법을 찾아본다 S3-fuse? � 더 쉬운 방법이 있을 거 같아 AWS 에 돈 만내면 말입니다
3) Jupyter 컨테이너와 NbViewer 컨테이너에 NFS (공유 파일 시스템을) 마운트
AWS 에는 EFS 라는 NFS 서비스가 존재
PVC Storage Class 를 “” 로 세팅 후, PV 를 직접 EFS 로 생성 (efs-provisioner 사용 X)
NBViewer k8s deployment manifest 에서는 “claimName: efs-jupyter-shared”
Jupyter on Kubernetes - EFS (Example) ✈️
Jupyter Container (singleuser) EFS 설정 NBViewer Deployment 용 EFS PV
Jupyter on Kubernetes - Meta API 🙈
사용자에게 Web Shell 류 (Shell, Python, Scala 등) 를 그냥 열어주면 안되는 이유�누가 열어둔 EC2, EMR Jupyter 나 Zeppelin 가 있다면 몰래 들어가서 한번 해보세요. �비트코인 채굴하는 소리가 나요
EC2 에는 Meta API 를 통해서 인스턴스 정보를 얻어올 수 있음. (권한 있으면 AWS Key 도 조회 가능)
따라서 Jupyter 컨테이너에서는 Meta API 접근을 Disable 해야 함
다만 이 경우 Meta API 접근이 불가능하므로, EKS Node 에 있는 기본 IAM Role 도 사용할 수 없음�만약 Jupyter 에 별도의 권한을 주고 싶다면 (공용 S3 접근 등) kiam 등 이용해 Pod 별로 IAM 권한 설정
Jupyter on Kubernetes - Meta API :( ✈️
Jupyter Hub 를 위한 EKS 팁들
기존 EKS 에 namespace 받아 쓰려면 kiam 등 세팅이 복잡
차라리 JupyterHub config 에서 Jupyter Container 의 Meta API 접근 끄고 별도의 EKS 사용
Kubernetes 클러스터 만드는게 부담스럽지 않은 시대에 13만원 아끼려고 고생을 할 필요는 없지 않을까� 환율이 좀 올랐던데
Jupyter on Kubernetes - Zero to Kubernetes ✈️
사용자별로 격리된 분석 환경 제공 (개별 컨테이너)
다양한 언어 및 환경 제공 (Python, Tensorflow, Scala Almond, R, Julia, …)
운영 코스트가 거의 없음 ya!! 신난다!
비용이 저렴
각 사용자가 작성한 노트북을 즉시, 쉽게 공유 가능 (NbViewer + EFS)
Jupyter on Kubernetes - 요약 ✈️
머신러닝 인프라 일단 머신러닝 엔지니어를 뽑읍시다
클러스터 컴퓨팅
(임의의 사용자의 Cluster 접근을 안전하게 제어할 수 있는 방법이 필요)
노트북 스케쥴링 인프라
노트북 공유 시스템
Jupyter on Kubernetes - TODO ✈️
Contents
데이터 엔지니어
대부업스 엔지니어
서로 덕담을 주고 받은 후
데이터 엔지니어는
테라폼을 시작하게 되는데...
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
테라폼 뭔지 모르겠음
난 그냥 이엠알 만들려는데�왜 이렇게 복잡한것이죠?
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
Terraform 잘 안됨
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
DevOps 엔지니어와 Data 엔지니어의 공통점
따라서 Data 엔지니어 입장에서, DevOps 엔지니어들의 도구들을 눈여겨 볼 필요가 있음
Terraform, Ansible, Kubernetes, Jenkins, Grafana, Prometheus 등
다만 툴에 너무 의미를 부여하지 말 것!
일단 본인은 데이터 팀
자본주의 사회의 회사에 고용된 엔지니어는 비즈니스 가치 (= 매출에 도움) 를 만들어 내야
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
DataOps 가 있다면
“DB 테이블 이름만 알려주면 바로 입수 되서 한 시간 뒤 부터 바로 조회할 수 있어요"�“Redash 에서 서비스 DB 부담 없이 바로 1년치 데이터도 빠르게 쿼리할 수 있어요"�“버튼만 누르면 8 GiB Jupyter 컨테이너 즉시 띄워 분석할 수 있어요. GPU 도 원하면 드려요"
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
에이더블유에스는
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
끝
좋은데, 너무 Lock-in 되고 있진 않은지?
갓 나온 Managed 는 쓰지 않는것이 정신 건강에 좋습니다 하지만 MSK 가 나온다면
가끔 기대하지 못한 곳에서 이상함. Support 를 잘 이용합시다
Default 로 쓰면 가격이 저렴하지 않으나, 궁리하면 저렴하게 쓸 수 있는 방법이 있다! 공밀레
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
MSK 빨리 서울 Region 에 출시해주세요
그들을 모집합니다
갈아만든 공돌이를 모집 읍읍
팀장님! 이 슬라이드는 저희집 고양이가 만들었습니다.�
끝
Thanks
Ending Credit
choo.issac @ yanolja.di
eunseons @ yanolja.di
kirk @ yanolja.se
woonjo@ yanolja.se
sh @ yanolja.ba 쉘님