내일배움캠프

[내일배움캠프] TIL 43일차 26.04.02(목)

nom_de_plume 2026. 4. 2. 21:20

Apache Spark

  • SQL, 스트리밍, 머신러닝 및 스래프 처리를 위한 기본 제공 묘듈이 있는 대규모 데이터 처리용 통합 분석 엔진
  • 클라우드의 Apache Hadoop, Apache Mesos, Kubernetes에서 자체적으로 실행될 수 있으며 다양한 데이터 소스에 대해 실행될 수 있음
  • 대용량 데이터(> 100GB)를 다루는 것이 특화된 프레임 워크
    • Pyspark: Python을 기반으로 하여 별도 언어 공부 필요 X
    • 대용량 데이터: 대용량 데이터를 다루는 기술에 대한 이해
    • 분산 처리: 여러 대의 컴퓨터를 사용한다는 것에 대한 이해

 

파이썬과 데이터, 메모리

 

파이썬 작업 중 에러 종종 발생(OOM) -> 특히 대용량 데이터 처리 시 자주 발생

스파크를 쓰든, 파이썬을 쓰든 메모리 관리 중요

 

메모리

  • 윈도우에서는 작업관리자, 맥에서는 활성 상태 보기, 리눅스에서는 htop 등으로 메모리 사용량 확인 가능
  • 기억 장치
    • RAM
      • 작업 공간
      • 데이터를 갖고 작업 하기 위해 데이터를 RAM에 올린다.
      • OS(윈도우 등)와 기본적인 프로그램을 올리면 2~6GB 차지
      • 컴퓨터 종료 시 RAM에 올라간 데이터 삭제
    • Disk
      • 저장 공간
      • 장기적으로 데이터를 보관(저장)하는 공간
      • 컴퓨터를 꺼도 Disk의 데이터는 사라지지 않는다.

 

CPU

  • 일꾼
  • 코어의 수
    • 같은 코어의 수라도, 고성능의 CPU는 수배 이상 빠를 수 있다.
    • 병렬 처리: 하나의 작업을 위해 여러 코어 사용
      • 스파크 => 여러 대의 PC를, 그리고 각 PC의 여러코어 모두 사용

 

Data Type

  • 적절한 데이터 타입을 사용하면, 보통 30% 이상의 메모리 절약 가능
    • 정수(Integers)
      • 이진법으로 표현
      • 뒤의 숫자는 얼마나 많은 메모리를 할당(assign)할 것인지에 대한 얘기
      • 더 많은 메모리를 할당할수록, 더 큰 숫자를 담을 수 있다.

int8: -128 ~ 127

int16: -32768 ~ 32727

Int32: -2,147,483,648 ~ 2,147,483,647

Int64: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

=> 부호를 위해 1비트(메모리 단위) 사용

 

 

오버플로(Overflow)

  • 크기에 맞지 않는 데이터를 넣어 의도하지 않은 결과가 나오는 것
  • 파이썬의 데이터 타입은 기본적으로 동적(Dynamic)이기 때문에 자동으로 데이터형이 바뀐다.
  • 큰 숫자를 다루는 것은 굉장히 주의 요함

 

부동소수점(Floating points)

  • 사람에게 직관적이지 않지만, 컴퓨터는 부득이 사용하는 개념
  • 정수는 이진법으로 어렵지 않게 표현 가능, BUT 0.2, 18.5, π 같은 정수가 아닌 숫자를 정확히 표현하기 위해 사용
  • 하나의 숫자를 형태와 자릿수로 구분하여 표현
    • 일부의 데이터는 형태를, 나머지 데이터로 자릿수를 표현 
    • 이진법, 소수부와 정수부가 다르기 때문에 정확하게는 조금 다름 
      • ex 1) 478.224 = 4.78224 * 10²
      • ex 2) 0.0098765 = 9.8765 * 10⁻³
    • 정수와 마찬가지로 float16, float64 등 사용하는데, 더 큰 메모리를 사용할수록 값이 정확해지지만 데이터가 더 무거워진다.
  • 원리상 필연적으로 오차 동반
    • 더 많은 메모리(16 -> 32)를 사용할수록 줄어들지만 이론적으로 무한히 많은 메모리를 사용해야만 이 오차를 정확히 없앨 수 있다.
    • 딥러닝의 경우 의도적으로 오차를 감수해서라도 메모리를 줄이기도 한다.(float 16 등)

 

String, Category

  • 대부분의 소프트웨어는 유니코드(unicode)를 이용하여 문자열 인코딩
  • 메모리를 굉장히 많이 차지
    • 대안으로 범주(Category)형 자료 사용 가능
      • Pandas의 경우 각데이터의 고유값을 내부에서 숫자로 치환하여 사용

 

Datetime

  • 시간과 관련된 정보
  • 일반적으로 Unix Timestamp 기준 (UTC time zone 사용 -> 1970년 1월 1일 0시 기준으로 몇초가 경과했는지 숫자로 표현)
  • 연,월,일,시 등의 표현은 사람마다, 소프트웨어마다, 회사마다, 팀마다 모두 다를 수 있다.
    • 일반적으로 표현하기 위한 양식 또한 존재
      • 숫자인 Unix timestamp를 사람이 이해 가능한 문자열로 교체
      • 문자열을 Unix timestamp로 교체
    • 일반적으로 년도를 %y, %Y(4자리)로, 월을 %m, 일을 %d로 표현

 

Time zone

  • 시간 데이터를 다룰 때 굉장히 중요한 부분
  • 소프트웨어는 범국가적이기 때문에, 시간의 표준화 필수
  • 일반적으로 컴퓨터 공학에서는 UTC 기준, Unix timestamp도 UTC 기준
  • 대부분의 Database 또한 timezone 정보를 필수로 한다.

 

File format

  • 디스크에는 데이터를 어떻게 저장하는지
  • 시간적 비용
    • 읽고 쓰는데 걸리는 시간
    • 파일 유형에 따라 수십배 차이 발생
  • 공간적 비용
    • 저장된 파일의 크기
    • 파일 유형에 따라 수십배 차이 발생
    • 입/출력 시에 필요한 메모리도 굉장히 중요

 

json

  • csv, txt와 크게 다르지 않다.
  • 저장된 자료를 python의 dictionar와 같은 형식으로 강제 => JSON Object라고 칭함
    • ex) {"키": "값"}
    • dict와 같지 X
      • 파이썬의 dict를 json으로 변환하여 사용 가능 => dump라고 칭함
  • 여러 JSON Object를 JSON Array에 담을 수 있다.
  • 비교적 개발자의 선호도가 높으며, 비교적 대용량의 데이터도 JSON으로 관리하는 경우 다수 존재
    • API 통신: 보통 JSON 형식
    • 여전히 무거워 대용량 데이터 처리에 불편
  •  txt와 마찬가지로 encoding방법에 따라 다르게 저장, utf-8을 사용하는 것이 일반적

 

Pickle

  • 하나의 컴퓨터로 개인용 프로젝트에서 데이터를 관리할 때 편리한 데이터 형식
    • 버전과 운영체제에 대한 의존(Dependency)이 있기 때문에 협업할 때 데이터를 주고 받으면 작동하지 않을 위험 존재
  • csv, json보다 2~30% 정도 용량이 가볍다.
    • read/write 속도가 수십배 이상 빠르다
  • nested type 지원
  • 병렬처리에서 그리고 때로는 분산처리에서 내부 데이터를 pickle로 직렬화(Serialize)

 

Parquet (파케이)

  • 대용량 데이터 저장에서 표준
  • 굉장히 가볍고 빠르다
  • 다수의 OLAB Database가 내부적으로 parquet를 사용하여 데이터 저장
  • Spark 또한 지원

 

기타

  • arrow나 hdfs, feather도 때에 따라 유용하게 사용
  • 압축, 속도가 가능한 이유는 기본적으로 칼럼기반(columnar)이기 때문

 

I/O

  • Input & Output
  • 다양한 맥락에서 쓰이지만, 여기서는 데이터의 입출력 칭함
    • I/O 메모리 사용
      • 전처리에서 잘 돌던 데이터가, 저장(save)에서 터지는(OOM) 경우 존재
    • I/O Speed
      • 가장 빠른 데이터 수급은 메모리
        • Network < Disk < Memory(캐시 생략)
        • In-memory DB 사용
      • 스파크는 기본적으로 모든 데이터를 Memory에서 처리
        • 내부족으로는 lazy computation 등으로 좀 더 복잡

 

 

 

클라우드

  • 관리가 훨씬 쉽고, 보안이 뛰어나며, 가용성이 좋다.
  • 스파크를 쓸 때는 여러 대의 컴퓨터를 사용하는데, 보통 클라우드의 서버를 빌린다.
    • 클라우드 3대장
      • AWS : 시장 지배중 (한 번 시장 지배 이후, 모든 것의 기준점)
      • GCP : Bigquery 원툴
      • Azure : 편하지만, 비쌈
      • 그 외 여러 가지 이유(지원, 투자, 계열사 등)로 기타 클라우드 사용하는 경우 다수 존재

 

스토리지

  • AWS를 이용하게 되면 기본적으로 대부분의 파일(데이터)를 S3에 보관
    • 내 컴퓨터에 보관하는 것보다 안전하며, 임의의 팀원이 접근할 수 있다.
  • 그 데이터를 다시 데이터베이스에 연결하여 사용 가능
  • 스파크는 S3에서 직접 읽을 수도, DB를 통해 읽을 수도 있다.
  • 비용에 주의

 

엔진

  • 컴퓨터를 빌리는 것
  • 단일 기기를 빌릴 수 도 있고, 여러대를 빌려쓸 수도 있다.
  • 접속은 보통 ssh 이용, vscode를 이용하면 좀 더 편리

 

데이터베이스

  • 쓰는 이유:
    • 1. 데이터 공유: 여러 사용자가 동시에 접근하여 공유 가능
    • 2. 데이터 보호: 데이터를 보호하기 위해 다양한 보완 기능 제공
    • 3. 데이터 검색: 데이터를 쉽게 검색할 수 있도록  인덱싱 기능 제공
    • 4. 데이터 백업과 복원: 데이터를 백업하고 복원하는 기능을 제공하여 데이터 손실을 방지(중요한 데이터 안전하게 보호)
  • 유형
    • RDS : 관계형 데이터베이스
      • postgress와 mysql 등 다양한 옵션 존재, 보통 엔지니어가 결정
      • 대동소이, 인덱싱 잘 활용하기
      • 항상 서버가 떠 있어야 한다. -> 비용 발생
    • Athena : S3에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스
      • 보통 S3에 있는 데이터와 연동
      • Serverless (쿼리를 운용할 때만 잠시 기기를 빌려 연산한 뒤 다시 반납) -> 저렴한 비용
      • 바로 Spark와 연동 가능
    • Redshift : 빠르고 강력한 데이터 웨어하우징
      • 구동위해 클러스터(여러 대의 컴퓨터) 구성하여 운영해야 한다. => 비싼 비용
      • 복잡한 연산에 조금 더 효율적
      • Spark와 연동 가능

 

아키텍쳐 예시

 

 

EMR

  • 페타바이트급 데이터 처리, 대화식 분석 및 기계 학습을 위한 빅 데이터 솔루션
  • AWS에서 Spark를 사용하면, 보통 EMR을 이용