[spark를 이용한 빅데이터 분석 by 안창배 튜터]
1. 왜 스파크일까?
- 스파크 Apache Spark 란? [상세 정의]
└ SQL, 스트리밍, 머신러닝 및 그래프 처리를 위한 기본 제공 모듈이 있는 대규모 데이터 처리용 통합 분석 엔진
└ 클라우드의 Apache Hadoop, Apache Mesos, Kubernetes에서 자체적으로 혹은 다양한 데이터 소스에 대해 실행 가능
└ 쉽게 말해, 대용량 데이터를 다루는 것에 특화된 프레임 워크
└ (cf) Apache는 오픈소스를 제공하는 재단인데, 스파크도 관리하고 있음
- 스파크를 배우는 이유
└ 기술적이고, 난이도가 높고, 실제로 쓰리라는 보장은 없으나
· Pyspark: Python을 기반으로 하여 별도의 언어 공부가 필요 없음
· 대용량 데이터: 대용량 데이터를 다루는 기술에 대한 이해
· 분산 처리: 여러 대의 컴퓨터를 사용한다는 것에 대한 이해
└ 스파크를 통해 배우는 쿼리 작동 원리(SQL, 파이썬 등)나 개념은 분석에서도 도움이 됨
└ 스파크는 대규모 데이터 전처리에 있어 표준이고 실제로 많은 회사가 운용하고 있어, 협업 차원에서 도움이 됨
- 스파크를 쓰는 이유와 안 쓰려는 이유
└ 샘플링이나 분할이 안되는 몇백GB, 몇십TB의 진짜 대용량 데이터를 다룰 땐 스파크를 쓸 수밖에 없음
└ 하지만, 비싸고, 오래 걸리고, 승인도 번거롭고, 코드도 다시 짜야해서 오히려 비효율적일 때도 있음
: 샘플링, 경량화, 분할, 스케일업 or 스케일아웃 등이 가능할 경우 스파크를 통하지 않고 문제 해결 가능!
2. 파이썬과 데이터, 메모리
1) 메모리
- 스파크를 쓰든, 파이썬을 쓰든 메모리의 관리는 굉장히 중요
- 대용량 데이터를 처리할 때 OOM(Out of Memory)이라는 에러가 발생해 컴퓨터가 자주 터지기 때문
- 메모리란 기억 장치로 크게 RAM과 Disk(SSD) 나뉨
└ RAM
: 작업 공간. 작업을 위해 데이터를 책상(RAM) 위에 올리는 것과 유사
: read_csv와 같이 데이터 불러오기를 하면, 하드디스크에 있는 csv를 RAM 위에 올리는 것
: OS 및 기본 프로그램을 RAM에 올리면 2~6GB 차지하며, 컴퓨터 끄면 RAM에 올라간 데이터는 삭제
└ Disk
: 장기적으로 데이터를 보관(저장)하는 저장 공간. 작업한 데이터를 창고에 보관하는 것과 유사
: 컴퓨터를 꺼도, Disk의 데이터는 사라지지 않음
2) CPU
- 컴퓨터의 일꾼으로 컴퓨터는 보통 여러 개의 일꾼을 가지고 있음
- 중요한 것은 코어의 수이며, 고성능 CPU는 같은 코어라도 수배 이상 빠를 수 있음
- 하나의 작업을 위해 여러 코어를 사용하는 것을 병렬 처리라고 함
└ 스파크 또한 여러 대의 PC를, 그리고 각 PC의 여러 코어를 모두 사용
3) Data type
- 각 데이터에 적절한 타입을 사용하면 보통 30% 이상의 메모리 절약 가능
└ ↓ RAM 데이터를 올리는 경우 굳이 스파크를 쓰지 않고 메모리를 절약할 수 있는 팁
① 정수Integers
- 컴퓨터에서는 정수를 이진법으로 표현
- 더 많은 메모리를 할당할수록(비트수가 클수록), 더 큰 숫자를 담을 수 있음
- 값의 범위가 크지 않으면, 메모리가 큰 int64가 아닌 int16 등으로 줄여서 메모리 최적화
- 데이터 타입이 크기에 맞지 않아 의도하지 않은 결과가 나오는것을 오버플로overflow라고 함
- 파이썬의 데이터 타입은 동적Dynamic으로 자동 변환되기 때문에 overflow 발생 여부를 알 수 없기도
└ 큰 숫자를 다루는 것은 굉장히 주의 해야 함 (미리 검증 필요)
② 부동소수점Floating points
- 부동소수점은 하나의 숫자를 형태와 자릿수로 구분하여 표현하는 것
└ ex1. 5.96e-54는 뒤에 0이 54개 붙었다는 뜻
└ ex2. 478.224 = 4.78224 * 10^2, 0.0098765 = 9.8765 * 10^-3
- 컴퓨터는 이진법을 사용하기 때문에 부득이 사용하는 개념으로 필연적으로 오차를 동반
- float16, float64 등에서 큰 메모리를 사용할수록 오차가 없어져 값이 정확해지지만 데이터가 무거워짐
③ String, Category
- 이진법으로 문자를 표현해야 하므로 통상 [유니코드unicode]를 이용해 문자열을 인코딩
- 각 문자 표기에 여러 숫자가 필요하므로 숫자 대비 문자열이 굉장히 많은 메모리 공간을 차지
- 각 문자을 범주Category형 > 정수형으로 치환하면 많은 메모리를 절약할 수 있음
④ Datetime
- Unix Timestamp를 기준으로 많이 사용
└ UTC 기준 1970년 1월 1일 0시를 기준으로 몇 초가 경과했는지를 숫자로 표현한 방식(ex. 326991)
- 연, 월, 일, 시 등은 상황에 따라 다양한 양식으로 표현
## 21년 11월 6일 4시 30분을 파싱
dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
dt
>> datetime.datetime(2006, 11, 21, 16, 30)
- 시간대time zone는 통상 UTC 기준이며, 데이터를 다룰 때 timezone 정보를 필수로 고려해야 함
3. 파일 유형(File format)
- 디스크에 어떻게 저장하는지, 즉 어떤 파일 유형으로 저장하는지에 따라 장단점이 상이함
- 시간적 비용: 읽고 쓰는데 걸리는 시간. 파일 유형별로 차이가 큼
- 공간적 비용: 저장된 파일의 크기. 파일 유형별로 차이가 크고, 입출력 시 필요 메모리도 중요
① csv, txt
- CSV는 Comma-separated values의 약자로, 콤마로 구분된 정형 데이터
└ 구분자는 보통 Comma(,)를 쓰지만, 데이터 안에 구분자 포함 시 깨질 수 있어 Tab(\t) 등 다른 구분자를 쓰기도 함
- 가장 흔한 포맷이지만, 처리 속도가 느리고, 용량이 커서 소규모 데이터가 아니면 부적절
- 내부적으로는 encoding(utf-8, cp949 등)에 따라 다르게 저장
② json
- csv, txt처럼 별도의 압축 과정이 없음
- python의 dictionary와 유사한 형식으로 {”키”:”값”} 쌍을 강제하는데, 이것을 JSON Object라고 함
└ 여러 JSON Object는 JSON Array에 담을 수 있음
- 비교적 개발자 선호도가 높으며, 대용량 데이터도 JSON으로 관리하는 경우가 많으나 용량이 커서 불편
- csv, txt와 마찬가지로 encoidng 방법에 따라 다르게 저장되는데, utf-8을 사용하는 것이 일반적
③ Pickle
- 하나의 컴퓨터로 개인용 프로젝트에서 데이터를 관리할 때 편리한 데이터 형식
└ 버전과 운영체제에 대한 의존Dependency있어 협업자와 파일을 주고받으면 작동하지 않을 수 있음
- csv, json보다 용량이 2~30% 정도 가볍고, read/write 속도가 수십 배 이상 빠름
- (고급) 중첩nested type을 지원, 병렬처리, 분산처리에서 내부 데이터를 pickle로 직렬화Serialize
④ Parquet
- 대용량 데이터 저장에서 표준이며, 보통 '파케이'라고 읽음
- 굉장히 가볍고, 빨라서 많이 사용하며, 다수 OLAB Database(빅쿼리 등)가 내부적으로 parquet로 데이터 저장
- 단점은 바로 열 수 없고, 다른 개발도구를 활용해서 열어야 함
⑤ 기타
- arrow나 hdfs, feather 등도 때에 따라 유용하게 사용
- 압축 및 빠른 속도가 가능한 이유는 기본적으로 칼럼기반columnnar이기 때문
🖥️ I/O란?
- Input & Output으로, 여기서는 데이터의 입출력을 뜻함
- I/O가 느리다는 것은 디스크에서 메모리로 데이터를 가져오는 것이 느리다는 의미
- 메모리 관리를 못하면 데이터를 저장하는 과정에서 터지는 경우(OOM)가 있음
- 데이터 수급 속도는 메모리가 가장 빠르므로(Network < Disk < Memory), In-memory DB를 사용하기도
└ 스파크는 기본적으로 모든 데이터를 Memory에서 처리
4. 클라우드 살펴보기
- 스파크를 쓸 때는 여러 대의 컴퓨터를 사용하는데, 보통 클라우드의 서버를 대여
- 클라우드가 관리가 훨씬 쉽고, 보안이 뛰어나며, 가용성이 좋기 때문!
1) 클라우드 3대장
- AWS: 압도적으로 가장 많이 쓰는 클라우드 플랫폼. 안정성이 높고, 오류 해결 사례 등 자료가 풍부한 것이 장점
- GCP: Bigquery에서 가장 강력한 플랫폼
- Azure: 편하지만, 비쌈
- 그 외 여러 이유(지원, 투자, 계열사 등)로 네이버, MS, KT, 오라클 등 다른 클라우드를 사용하는 경우도 많음
2) 클라우드 기능
① 스토리지
- AWS를 이용하게 되면 기본적으로 대부분의 파일(데이터)를 S3(Simple Storage Service)에 보관
└ 로컬컴퓨터에 보관하는 것보다 안전하며, 데이터 공유도 용이
- 데이터를 다시 데이터베이스에 연결하여 사용 가능(스파크는 S3에서 직접 & DB 통해서 읽을 수 있음)
- 전송 및 보관 비용만 주의하면 좋음
② 엔진
- 쉽게 말해 컴퓨터를 빌리는 것
- 단일 기기를 빌릴 수도 있고, 여러 대를 빌려쓸 수도 있음
- 접속은 보통 ssh를 이용하고, vscode를 이용하면 좀 더 편리
③ 데이터베이스
- 데이터베이스를 사용하는 이유
(1) 데이터 공유: 여러 사용자가 동시에 접근해 데이터 공유 가능
(2) 데이터 보호: 데이터를 보호하기 위해 다양한 보안 기능 제공
(3) 데이터 검색: 데이터를 쉽게 검색할 수 있는 인덱싱 기능 제공
(4) 데이터 백업과 복원: 데이터 백업 및 복원 기능을 제공해 데이터 손실을 방지해 안전하게 보호
- 데이터베이스의 3가지 유형
(1) RDS: 관계형 데이터베이스
└ postgres와 mysql 등 다양하며, 인덱싱을 잘 활용하는 것이 중요
└ 항상 서버가 떠 있어야 하기 때문에 비용 필요(월 최소 5만원~ 수백수천만원)
(2) Athena: S3에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스
└ Serverless로, 쿼리를 운용할 때만 잠시 기기를 빌려 사용량에 따라 부과되므로 비용이 저렴
└ 바로 Spark와 연동 가능
(3) Redshift: 빠르고 강력한 데이터 웨어하우징
└ 구동을 위해 클러스터(여러 대의 컴퓨터)를 운영해야 하며, 비싸지만 복잡한 연산에 효율적
└ 바로 Spark와 연동 가능
3) 기타
- 아키텍쳐 예시
- EMR: AWS에서 Spark를 사용하면, 보통 EMR 사용
└ 페타바이트급 데이터 처리, 대화식 분석 및 기계 학습을 위한 빅 데이터 솔루션
'TIL' 카테고리의 다른 글
[240318] 파이썬: 코드카타 43 & SQL: 코드카타 149~155 (0) | 2024.03.18 |
---|---|
[240315] 파이썬: 코드카타 42 & SQL: 코드카타 146~148 (0) | 2024.03.15 |
[240314] 파이썬: 코드카타 41 (0) | 2024.03.14 |
[240313] 파이썬: 코드카타 40 (0) | 2024.03.13 |
[240312] 실전 프로젝트: 대시보드 스케치 & 피그마 배경 생성 및 태블로 적용 (0) | 2024.03.12 |