궁금한 이야기 Y
그들이 AWS 위에서
데이터 파이프라인을 운영하는 법
AWSKRUG 데이터 사이언스
Aug 8, 2019
1ambda @ yanolja
본 슬라이드에 나온 내용은 �회사의 입장을 대변하지 않으며
개인적 견해임을 미리 밝힙니다.
AWS, Cloud Native, Enterprise (동영상 링크)
AWS, Data Pipeline (슬라이드)
(Apache Zeppelin Committer) 활동 언제 다시 할거니
AWS, Kubernetes, Build Pipeline (동영상 링크)
Contents
오늘 할 이야기는
“사례 1번"
에 관한 이야기
“오늘 들은 내용을 적용하면 문제가 다 해결 되나요?”
부대찌개 문제를 틀리면 3일을 펭귄으로 사는데�데이터 인프라를 잘못 구축하면 며칠을 펭귄으로 살아야 할까? 197일쯤?
데이터의 생산부터 소비까지 파이프라인 과정에서 �각 주체들이 빠르고 쉽게 데이터를 다룰 수 있는 방법 1 에 대해 논의
오늘 할 이야기는
생산
소비
회사마다 다른 것들
데이터 사이즈 “Uber 는 저걸 쓴다던데..” 일단 이곳은 샌프란시스코가 아닙니다
사용자 수 “우리 사용자 수는 2500명이지만, 지금은 딥러닝이 대세이므로 제가 한번..."
도메인 “모빌리티 (택시) 는 실시간으로 Flink Streaming 을…”
데이터 사용자의 지식 수준 너와 나 “AirBnB 분석가는 머신러닝을 쓴대요”
“데이터에는 정답이 없습니다” by 팀장님
“다만 남들의 Best Practice 를 참고해 볼 수는 있습니다”
Contents
| 국내 숙박
| 해외 숙박
같아 보이지만 �업체 형태나 �숙박 형태에 따라 �데이터의 구조와 �분석 형태가 많이 다름
1) 어느 숙박 카테고리에 단박 (1일) / 연박 (2일 +) 이 많을까?
2) 어떤 카테고리가 더 계절을 많이 탈까?
3) ADR (평균 객실 단가) 는 어느곳에서 더 중요할까?
4) 경쟁 업체 비교를 한다면, 어떤 기준으로 선정해야 할까?
| 레저
| 티켓
| 건설
| 교육
| 비품
X 커머스
재고, 상품, 주문, �정산, 쿠폰, 포인트, 고객, …�+ B2B (업주 관련 통계 등)
데이터 파이프라인
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
사랑은 돌아오는거야!
숙박업 도메인 이야기 조금
엔지니어 분들이
이 슬라이드를 싫어합니다
OTA - Online Travel Agency
해외 (글로벌) OTA
OTA - 사실은 잘 보면 Group 들
Booking Holdings
Expedia Group
OTA - 그룹 내 다양한 데이터를 이용해 서비스로 제공
EPS (Expedia 외부 연동 솔루션)
채널 매니저란 것도 있습니다
CMS - Channel Management System
일반적으로 하나의 업체는
오버 부킹이 제일 두렵습니다
한 OTA (야놀자) 에서 판매되면
옆집이 가격을 내려서, 나도 내리고 싶은데
CMS 는 한 곳에서 재고 / 가격 (숙박업에서 가장 중요한) 을 관리할 수 있도록 도와줌
PMS - Property Management System 다음은 SMS 냐
숙박업의 경우, 업체 입장에서는
플랫폼 입장에서는 PMS 와 연동되어 있을 경우 고객의 물리적 객실 재고를 실시간으로 모두 파악 가능 😎
숙박업에선 데이터를 �어떻게 사용하나요? 🤭
숙박 재고의 경우 다음의 특성이 존재
= 아이템 X 옵션 X 날짜 만큼의 재고가 생성
= 같은 아이템 X 옵션이어도 날짜에 따라 가격이 달라짐 (= 다른 상품)
부가 옵션 (Rate Plan) 의 경우 정말 다양한 조합이 존재
= 아이템 X 옵션 X 날짜 X Rate Option 만큼의 상품이 생성
숙박업 데이터 생김새 - 재고 (Room Type, Rate Plan)
동일한 Room Type 에
숙박업 데이터 생김새 - 재고 (Room Type, Rate Plan)
업주 입장에선 (높은) 가격이 제일 중요
고객 입장에서도 (낮은) 가격이 제일 중요
플랫폼 입장에서는 아래 내용을 모두 고려
숙박업 데이터 활용 샘플 - Dynamic Pricing (AirBnB)
본론으로 다시 돌아가서
엔지니어분들 �표정이 좋지 않아졌어요. 😨
Contents
bit.ly/2FW9nwF
데이터 인프라
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
B2C 더하기 B2B
X 커머스
재고, 상품, 주문, �정산, 쿠폰, 포인트, 고객, …�+ B2B (업주 관련 통계 등)
그들 = 3명
나를 뺀다 = 2명�(발표자는 9개월 전에 Join, 오니까 이미 모든게 되어있..)
@isaac.choo, @eunseons
입사 당일
어서와
리얼 월드는 처음이지?
서비스 데이터 분석을 위해
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 Druid 등)
(Batch) (Stream) (Serving)
따라서 일반적인 집계 (통계 등) 은 Batch 로 끝내고
실시간 집계가 필요한 경우만! (e.g. CPC 광고)
실시간 (Stream) 이라고 해서 항상 정확하지 않음�상당히 (N 시간) 늦게 들어오는 로그들이 있기 때문에 �일반적으로는 Batch 가 따라가면서 보정하는 형태��실시간에 가까워질 수록 여러분이 자다가 깨어날�확률이 높아집니다 😎
Data Infra - Serving 레이어 (3)
Data Infra - Serving 레이어 (4)
서빙 레이어 관련 읽을 거리
Druid 관련 읽을거리 삽질은 그만하고 싶어요 AWS Managed 로 내주세요
기초적인 내용을 알아봤으니
본격적으로 시작해볼까요?
데이터 인프라
= 데이터 수집 (흩어진걸 모아서 한 곳에 저장)
+= 데이터 처리 (유용하게 가공)
+= 데이터 조회 (저장된 것을 사람이 소비)
+= 데이터 서비스 (서비스에 다시 내보내기)
해야 할 것들이 이리도 많은데 🙊
Data Infrastructure - AWS (Example)
그들 = 3명
목표
수집 대상
Redis, ElasticSearch 등
Data Infra - 수집
Client 로그
Data Infra - Client 로그 샘플
노출 (Impression) / 클릭 (Click) / 뷰 (View) 등
앱 (iOS / Android / Web 등) 내에서 발생하는 로그
작은 규모에서는 GA, Firebase 등의 이벤트 로깅 이용
규모가 커지면서 다양한 케이스, 해상도 (detail) 등을�위해 스키마 (형태)를 직접 정의해 사용하기도 함
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.결제, 로그인 등) 를 전송
Kinesis 로 직접 전송할 경우
Data Infra - 수집 (Server)
AWS EB (Beanstalk) 의 경우 로그 파일을 S3 퍼블리싱
Kinesis
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 운영 관련 팁
“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
“EMR 사용하시는 분!”
Streaming 프레임워크는 Application State 를 지원
Data Infra - Stream State
State 를 유지하는 이유는 결국 최종 Output 을 위함�(e.g. 업체별 광고 클릭수를 DynamoDB 에 저장)
따라서 Application 내 State 를 유연하게 가져갈 필요
Application State 를 복구의 기준으로 삼으면
Data Infra - Stream State (2)
엔지니어가 아닌 분들의�표정이 좋지 않아졌어요. 😨
Contents
데이터 인프라
= 데이터 수집
+= 데이터 처리
+= 데이터 조회
+= 데이터 서비스
사용자나 업무에 따라 데이터 관련 지식과 사용 도구가 다를 수 있음
데이터 세계에서의 시민들
생산 고통
소비 고통
아프니까 데이터다
데이터를 조회할 수 있는 툴과 언어는 너무 많다!
사용자에 따라 데이터 관련 지식의 수준이 천차만별
모든 조건을 만족시키는 단 하나의 툴은 존재하지 않음
Data Infra - 데이터 조회 (SQL)
“사내 구성원이 1000명이면�엑셀 (구글 시트) 사용자는 �몇 명이나 될 까요?”
틀리면 3일간 펭귄 프사로 살아야 합니다
비즈니스 직군 (영업, 마케팅 등) 은 Excel 이 더 익숙하신 분들이 많음
비즈니스 쪽 추가적인 요구사항들
- 호텔 하드블럭이 저녁까지 안 팔리면 알람을 받고 싶어요
- 강원 지역에서의 지역별 쿠폰이 다 소진되면 � 추가적으로 쿠폰을 발행하기 위해 알람을 받고 싶어요
- DAU, 동접 수 등을 그래프로 슬랙에서 보고 싶어요
엔지니어 입장에서는 비용이 크지 않으나, �비즈니스적으로 큰 가치를 가질 수도 있는 일들
(Query 결과가 특정 값이면 Slack, Email 로 Alert 보내기)
데이터를 더 널리 전파하기, SQL 로 보는것을 넘어
왜 프레스토 합니까 사용 당신은? 항상 감사하십시오 AWS 에게
읽을거리
Data Infra - 데이터 조회 (Presto)
Redash, Zeppelin, Jupyter, Tableau 를 주된 탐색 도구로 이용
Data Infra - 데이터 조회 (탐색 도구들)
Re:dash
이것만 알아 가도�오늘 본전은 (5000원)�뽑았�이미 햄버거를 먹었..
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 함수를 이용해 보아요�(위도 경도를 이용해 근처 아이템 탐색 등)
데이터 인프라
= 데이터 수집
+= 데이터 처리
+= 데이터 조회
+= 데이터 서비스
Data Infrastructure - 데이터 서비스 (혹은 데이터 프로덕트)
설명이 너무 많아요�다 됐고 그래서�뭘로 인프라 만들었나요?
TMI
Terraform - Code as Infrastructure
Terraform
Code 로 EC2 (서버) 를 만들고 �필요하다면 추후에 코드를 재활용
AWS (UI Console)
버튼을 눌러 EC2 (서버) 를 만들고�필요하다면 추후에 다시 기억을 떠올려..
왜 테라폼으로�데이터 인프라를�이전 했는가?
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 인프라를 위해 만든 별도 오픈소스들
Notebook Infrastructure - Jupyter @ netflix
“Kubernetes 를 들어보신분!”
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
데이터 엔지니어가 말하는
Data 그리고 AWS
Data 엔지니어의 포지션
따라서 Data 엔지니어 입장에서, DevOps 엔지니어들의 도구들을 눈여겨 볼 필요가 있음
Terraform, Ansible, Kubernetes, Jenkins, Grafana, Prometheus 등
다만 툴에 너무 의미를 부여하지 말 것!
일단 본인은 데이터 팀
자본주의 사회의 회사에 고용된 엔지니어는 비즈니스 가치 (= 매출에 도움) 를 만들어 내야
Summary - 데이터 엔지니어가 바라보는 Data, AWS
DataOps 가 있다면
“DB 테이블 이름만 알려주면 바로 입수 되서 한 시간 뒤 부터 바로 조회할 수 있어요"�“Redash 에서 서비스 DB 부담 없이 바로 1년치 데이터도 빠르게 쿼리할 수 있어요"�“버튼만 누르면 8 GiB Jupyter 컨테이너 즉시 띄워 분석할 수 있어요. GPU 도 원하면 드려요"
Summary - 데이터 엔지니어가 바라보는 데이터, AWS
에이더블유에스는
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
좋은데, 너무 Lock-in 되고 있진 않은지?
갓 나온 Managed 는 쓰지 않는것이 정신 건강에 좋습니다 하지만 MSK 가 나와버렸어요
가끔 기대하지 못한 곳에서 이상함. Support 를 잘 이용합시다
Default 로 쓰면 가격이 저렴하지 않으나, 궁리하면 저렴하게 쓸 수 있는 방법이 있다! 공밀레
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
지난번 발표에서 MSK 노래를 불렀더니 (2019-06)
드디어 MSK 가 Seoul Region 에 나왔습니다! 여러분들에게 최신 정보를 드리고자 이 한몸 바쳐
특징
Summary - 데이터 엔지니어가 바라보는 Devops, AWS
의사양반! 이게 무슨말이오!
그들을 모집합니다
갈아만든 공돌이를 모집 읍읍
팀장님! 이 슬라이드는 저희집 고양이가 만들었습니다.�
Thanks
Ending Credit
choo.issac @ yanolja.di
eunseons @ yanolja.di
kirk @ yanolja.se
woonjo@ yanolja.se
sh @ yanolja.ba 쉘님