24.03.15 TIL

예진·2024년 3월 15일
0

TIL

목록 보기
51/68

스파크가 뭐길래?

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

스파크를 쓸 수 밖에 없던 눈물나는 기억: 진짜 대용량 데이터

  • 약 800GB의 Microsoft Academic Graph 데이터를 다룰 때, 스파크를 쓸 수밖에 없었습니다
  • 대용량 데이터 처리는 분할Partition하여 처리함으로써 스파크를 우회할 수 있지만,
    Graph 형식의 데이터는 분할하기 어려워 부득이 스파크를 사용했습니다
  • 약 10~20대의 컴퓨터를 사용하였고, 그 결과 수백만건의 논문 데이터를 교정할 수 있었습니다

스파크를 쓰기 싫어서 도망쳤던 기억: 이것도 진짜 대용량 데이터

  • MAU(월간 이용 유저)가 1천만명 이상이었던 웹툰 서비스를 분석할 때입니다
  • 하루에도 수십억 건의 데이터가 발생하는 상황 → 하나의 머신으로는 감당 불가
  • 샘플링, 경량화, 분할, 스케일업을 통해 스파크를 통하지 않고 문제 해결 → 뒤에서 다시 보겠음
  • Why not spark?
    • 비싸고, 오래 걸리고, 승인도 번거롭고, 코드도 다시 짜야하고

    파이썬과 데이터, 메모리

어느날, 파이썬이 터졌다

  • 파이썬 작업을 하다보면 아래와 같은, 이유를 알 수 없는 에러가 종종 발생합니다
    • 이는 일반적으로 컴퓨터 공학에서는 OOM(Out of Memory)이라 하며, 특히 대용량 데이터를 처리할 때는 자주 만나게 될 문제입니다.
    • 스파크를 쓰는 이유는 보통 대용량 데이터(>100GB) 처리를 위한 것이기 때문에, 이러한 에러를 먼저 만나는 것은 아주 일반적입니다. 사실 스파크를 쓸 때도 맨날 OOM으로 터집니다
    • 스파크를 쓰든, 파이썬을 쓰든 메모리의 관리는 굉장히 중요

메모리

  • 메모리란 기억 장치로, 굉장히 세분화가 되어있지만 …
  • 여기서는 크게 RAMDisk(SSD)로 나눠보겠습니다
  • RAM은 쉽게 말해 작업 공간입니다
    • 데이터를 갖고 작업 하기 위해
      우리는 데이터를 RAM이란 곳에 올립니다 (read_csv 등)
    • 여기에 OS(윈도우 등)와 기본적인 프로그램을 올리면 2~6GB 정도 차지합니다
    • 컴퓨터를 끄면 RAM에 올라간 데이터는 삭제됩니다
  • Disk는 쉽게 말해 저장 공간입니다.
    • 장기적으로 데이터를 보관(저장)하는 공간입니다
    • 컴퓨터를 꺼도, Disk의 데이터는 사라지지 않습니다

CPU

  • CPU는 일꾼입니다. 보통 컴퓨터는 여러 일꾼을 가지고 있습니다.

  • 우측은 정말 직관적인 설명입니다.

  • 모두 이해할 필요는 없으며, 가장 중요한 것은 코어의 수라고 봐도 됩니다.
    *같은 코어 수라도, 고성능의 CPU는 수배 이상 빠를 수 있습니다.

  • 하나의 작업을 위해 여러 코어를 사용하는 것을
    병렬 처리라고 합니다.
    - 스파크 또한 여러 대의 PC를, 그리고 각 PC의 여러 코어를 모두 사용합니다.

Data type

  • 메모리에는 그럼 어떤 데이터가 올라가는지 살펴보겠습니다.
  • 파이썬이 다루는 데이터를, Pandas를 기반으로 보겠습니다.
    • MySQL과 같은 Database도 비슷합니다
  • 내부적으로는 각 데이터에 대한 명확한 타입이 있습니다
    • 적절한 데이터 타입을 사용하면, 보통 30% 이상의 메모리를 절약할 수 있습니다

정수Integers

  • 컴퓨터에서는 정수를 이진법으로 표현합니다.
    • 뒤의 숫자는 얼마나 많은 메모리를 할당assign할 것인지에 대한 얘기입니다
  • 더 많은 메모리를 할당할수록, 더 큰 숫자를 담을 수 있습니다

오버플로Overflow

  • 크기에 맞지 않는 데이터를 넣어 의도하지 않은 결과가 나오는것을 오버플로overflow라고 합니다
    *정확한 정의는 좀 더 복잡합니다
  • 파이썬의 데이터 타입은 기본적으로 동적Dynamic이기 때문에 자동으로 데이터형이 바뀝니다
  • 따라서 큰 숫자를 다루는 것은 굉장히 주의해야 합니다!

부동소수점Floating points

  • 부동소수점은 사람에게 직관적이지 않지만, 컴퓨터는 부득이 사용하는 개념입니다
    • 앞에서 보았듯 컴퓨터는 이진법을 사용하기 때문에, 정수는 어렵지 않게 표현할 수 있습니다
    • 하지만 0.2, 18.5, π\pi와 같은 정수가 아닌 숫자는 정확하게 표현할 수 없습니다.
    • 이를 보완하기 위해 컴퓨터 공학에서는 부동소수점을 사용합니다
  • 부동소수점은 하나의 숫자를 형태와 자릿수로 구분하여 표현하는 것입니다.
    • 예를 들면, 478.224=4.78224102478.224 = 4.78224 * 10^2, 0.0098765=9.87651030.0098765 = 9.8765 * 10^-3
    • 일부의 데이터는 형태(4.78224)를, 나머지 데이터로 자릿수(2)를 표현합니다
      *이진법이고, 소수부와 정수부가 다르기 때문에 정확하게는 조금 다릅니다
  • 부동소수점 또한 정수와 마찬가지로 float16, float64 등을 사용하는데,
    더 큰 메모리를 사용할수록 값이 정확해지지만 데이터가 더 무거워집니다.

부동소수점 오차

  • 부동소수점은 그 원리상 필연적으로 오차를 동반합니다

  • 이러한 오차는 더 많은 메모리(16 → 32)를 사용할수록 줄어들지만
    이론적으로는 무한히 많은 메모리를 사용해야만 이 오차를 정확히 없앨 수 있습니다

  • 딥러닝의 경우 메모리 사용을 줄이기 위해,
    의도적으로 오차를 감수해서라도 메모리를 줄이기도 합니다(float 16등)

String, Category

  • 문자열은 문제가 더 복잡합니다.

  • 일반적으로 우리에게 친숙한 대부분의 소프트웨어는 [유니코드unicode](https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_0000~0FFF)를 이용하여 문자열을 인코딩합니다
    *이러한 원리를 모두 지금 이해할 필요는 없습니다

  • 중요한 것은 메모리를 굉장히 많이 차지한다는 것을 기억하면 된다는 것입니다.

  • 이에 대한 대안으로, 범주Category형 자료를 사용할 수 있습니다.

    • Pandas의 경우 각 데이터의 고유값을 내부에서 숫자로 치환하여 사용합니다
  • 본래 문자열로 이루어졌던 Species 칼럼을
    범주형으로 변환하였습니다(SpeciesCate)

  • 해당 범주 자료가 내부에서는 숫자로 사용되고 있음을 보았습니다 (SpeciesCateCode)

  • 이를 통해 90%이상의 메모리를 절약할 수 있습니다

Datetime

  • 시간과 관련된 정보입니다.

  • 일반적으로 소프트웨어들은 Unix Timestamp를 기준으로 합니다

    • UTC time zone을 사용합니다.
    • 1970년 1월 1일 0시를 기준으로 몇 초가 경과했는지를 숫자로 표현한 것입니다.
  • 연, 월, 일 시 등의 표현은 사람마다, 소프트웨어마다, 회사마다, 팀마다 모두 다를 수 있습니다
    • 이러한 표현들을 일반적으로 표현하기 위한 양식 또한 존재합니다
    • 이를 통해 숫자인 Unix timestamp를 사람이 이해 가능한 문자열로 바꾸거나
      거꾸로 문자열을 Unix timestamp로 바꿀 수도 있습니다
    • 일반적으로 년도을 %y%Y(4자리)로, 월을 %m, 일은 %d로 표현합니다.
    • 자세한 건 다음 문서를 참조해주세요

Time zone

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

Data type을 나가며

  • 이러한 자료형은 소프트웨어에 따라 다소 차이가 있으며, 파이썬 내에서도 패키지마다 차이가 존재합니다.
  • 지금까지는 특정 소프트웨어(예컨대 파이썬)에서 메모리에 데이터를 띄우는 과정이었습니다
  • 하지만 우리는 디스크에도 데이터를 저장하며, 이때 굉장히 다양한 옵션을 마주하게 됩니다
profile
Data Analysis / 맨 땅에 헤딩

0개의 댓글