본문 바로가기

TIL

[240315] 스파크(spark): 컴퓨터와 데이터, 메모리, 클라우드

[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라고 함

int64범위가 넘어가니까 index1부터는 값이 더해지지 않고 -(마이너스) 값으로 감

 

- 파이썬의 데이터 타입은 동적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가 시간이 가장 오래걸림

 

- 시간적 비용: 읽고 쓰는데 걸리는 시간. 파일 유형별로 차이가 큼 

- 공간적 비용: 저장된 파일의 크기. 파일 유형별로 차이가 크고, 입출력 시 필요 메모리도 중요 

 

① 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

concerts, works와 같이 칼럼 안에 리스트, 딕셔너리가 포함된 것을 중첩nested 칼럼이라고 부름


 ④ 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 사용

└ 페타바이트급 데이터 처리, 대화식 분석 및 기계 학습을 위한 빅 데이터 솔루션