[TIL 61일자] 데브코스 데이터엔지니어링

·2023년 7월 6일
0

데브코스

목록 보기
50/55
post-thumbnail
post-custom-banner

📚 오늘 공부한 내용

1. 빅데이터의 정의

  • 서버 한 대로 처리할 수 없는 규모의 데이터 - 아마존 데이터 사이언티스트 존 라우저
    • 분산 환경이 필요하느냐에 포커스
  • 기존의 소프트웨어로는 처리할 수 없는 규모의 데이터
    • 여기서 말하는 기존은 오라클이나 MySQL 같은 관계형 데이터베이스
    • 첫 번째 빅데이터의 정의와 비슷하다
    • 분산 환경을 염두에 두지 않는다
    • Scale-Up, Scale Out 접근 방식 (Scale Out이 더 scalable한 방법임)
  • 4V
    • Volume: 데이터 크기 대용량?
    • Velocity: 데이터의 처리 속도?
    • Variety: 구조화된 데이터인지? 비구조화된 데이터인지?
    • Veracity: 데이터 품질이 좋은지?

2. 빅데이터 처리의 특징은?

  • 큰 데이터를 손실 없이 보관할 수 있는 스토리지가 필요하다.
  • 이런 데이터를 빠르게 처리할 수 있게 병렬 처리가 필요하다.
  • 모든 데이터가 구조화된 데이터는 아니기 때문에 비구조화된 데이터도 처리할 수 있어야 한다.

3. 해결 방안은?

  • 큰 데이터를 손실 없이 보관하기 위해 큰 데이터 저장이 가능한 분산 파일 시스템이 필요하다.
  • 시간이 오래 걸리는 문제는 병렬 처리가 가능한 분산 컴퓨팅 시스템이 필요하다.
  • 비구조화 데이터를 처리할 수 있는 방법이 필요하다.
  • 결국 다수의 컴퓨터로 구성된 프레임워크가 필요해진다.

4. 대용량 분산 시스템이란?

  • 다수의 서버로 구성이 되어야 한다. 즉, 분산 파일 시스템과 분산 컴퓨팅 시스템이 되어야 한다.
  • Fault Tolerance가 되어야 한다. 소수의 서버가 고장이 나도 동작해야 한다.
  • 확장에 용이해야 한다. Scale Out이 되어야 한다.

5. 하둡 (Hadoop)

1) 하둡이란?

  • 큰 데이터를 다수의 컴퓨터로 처리할 수 있는 분산 파일 시스템과 분산 컴퓨팅 시스템의 오픈 소스 플랫폼.
  • 다수의 노드로 구성된 클러스터 시스템으로 마치 하나의 거대한 컴퓨터처럼 동작한다.

2) 하둡의 변화

  • 하둡 1.0은 HDFS 위MapReduce라는 분산 컴퓨팅 시스템이 도는 구조였다.
    • 두 개의 오퍼레이션만 지원
    • 다만 프로그래밍이 너무 어려워져 생산성이 떨어진다는 단점 존재
    • 그로 인해 사람들이 분산 처리를 하기 위해 좀 더 사용하기 쉬운 프레임워크를 만들기 시작
  • 하둡 2.0에서는 아키텍처가 크게 변경되었다. YARN이란 이름의 분산 처리 시스템 위에서 동작하는 애플리케이션이 되었다
    • Spark는 YARN 위에서 애플리케이션 레이어로 실행된다.

3) HDFS - 분산 파일 시스템

  • 데이터를 블록 단위로 나눠서 저장한다.
  • 블록 복제 방식 (Replication)
    • 항상 세 대에 저장이 될 수 있도록 백그라운드에서 복사 명령을 내린다.
    • 이는 Fault Tolerance를 보장할 수 있도록 하는 방식으로 블록들은 저장된다.
  • 2.0부터 네임 노드를 이중화해서 원래 네임 노드(Active)에서 문제가 발생할 경우 스탠바이(Standby) 네임 노드를 동작하도록 방식이 바뀌었다.

4) MapReduce - 분산 컴퓨팅 시스템

  • 하둡 1.0
  • 하나의 잡 트래커와 다수의 태스크 트래커로 구성된다.
  • 실제 실행은 태스크 트래커에서 실행되지만 이 태스크들에게 일을 할당해 주는 것은 잡 트래커가 진행하게 된다.
  • MapReduce만 지원하는데 이것이 제너럴한 시스템이 아니기 때문에 그게 단점이 된다.

6. YARN

1) 분산 컴퓨팅 시스템: 하둡 2.0 (YARN 1.0)

  • MapReduce라는 오퍼레이션만 지원하는 게 아니라 범용적으로 지원한다.
  • 그래서 세부 리소스 관리가 가능한 범용 컴퓨팅 프레임워크이다.
  • 마스터 역할을 하는 리소스 매니저가 있고, 내부에는 Job Scheduler, Application Manager가 있다.
  • 슬레이브들마다 노드 매니저가 설치되어 있다. 이는 리소스를 관리하는 역할을 한다.
  • 그 리소스들은 컨테이너가 되고 앱 마스터와 태스크라는 두 종류의 프로세스를 지원한다.

2) YARN 동작

  • YARN Client는 실행하려는 코드와 환경 정보를 Resource Manager에게 넘긴다.
  • Resource ManagerNode Manager에게 요청해 현재 사용할 수 있는 컨테이너(Application Master)를 실행한다.
  • Application MasterResource Manager 코드에 실행에 필요한 리소스를 받아온다.
  • Application MasterName Manager를 통해 컨테이너들을 받아 코드를 실행한다. (태스크)
  • 태스크들은 주기적으로 자신의 상황을 Application Manager에게 업데이트한다. 이를 Heartbeat라고 부른다. 만일 어떤 태스크가 실패하거나 보고가 오랜 시간 없으면 해당 태스크를 대신할 컨테이너를 찾아서 다른 컨테이너로 재실행해 준다.

3) YARN 2.0 - 하둡 3.0

  • YARN 프로그램들의 논리적인 그룹으로 나눠서 비슷한 목적을 갖는 애플리케이션들끼리 리소스를 공유하도록 자원 관리가 가능하다.
  • 타임라인 서버에서 HBase를 기본 스토리지로 사용한다.
  • 다수의 Standby 네임 노드를 지원한다. (2.0은 하나만 가능했다.)
  • Azuer Data Lake 스토리지를 지원한다.

7. 맵리듀스 (MapReduce)

1) 맵리듀스의 특징

  • 기본적인 목적이 큰 데이터를 처리하는 것이기 때문에 데이터 셋을 하나로 통일했다.
  • Key, Value의 집합이 데이터 셋이며 변경이 불가능하다.
  • 데이터 조작은 map과 reduce만 가능하다.
    • 모든 데이터 조작은 map과 reduce의 쌍으로 이루어진다.
    • map, reduce의 함수를 개발자가 채워 준다.
    • 일반적으로 한 번만으로 되는 게 아니라 여러 번 진행해 주어야 한다.
  • Map 결과를 Reduce단으로 모아 주는데 이를 보통 셔플링이라고 부르며 네트워크 단을 통한 데이터 이동이 생긴다.

2) 맵리듀스 동작

  • Map
    • (k, v) -> [(k', v')*]
    • 입력이 시스템에 의해 주어지며 HDFS 파일에서 넘어온다.
    • key, value 페어를 새로운 key, value 페어로 변환하고, 입력과 동일한 key, value를 출력하거나 아무 값도 없이 출력한다.
  • Reduce
    • 입력은 시스템에 의해 주어진다. 맵 출력 중 같은 키를 가지는 key/value를 시스템이 묶어서 입력으로 넣어 준다.
  • Shuffling
    • Mapper의 출력을 Reducer로 보내 주는 프로세스
    • 전송되는 데이터 크기가 크면 네트워크 병목을 초래하고 시간이 오래 걸리게 됨
  • Sort
    • 모든 Mapper 출력을 Reduce가 받으면서 키별로 정렬

3) Data Skew

  • 각 태스크가 처리하는데 데이터 불균형이 존재한다면 병렬 처리가 큰 의미가 없다. 가증 느린 태스크가 전체 처리 속도를 결정한다.
  • 특히 Reducer로 오는 데이터 크기는 큰 차이가 있을 수 있다. (Group By나 JOIN)
  • 처리 방식에 따라 Reducer의 수에 따라 메모리 에러가 날 수 있다.
  • 빅데이터 시스템에 모두 존재하는 문제이다.

4) MapReduce의 문제점

  • 프로그래밍 모델이 두 가지 오퍼레이션만을 지원하기 때문에 생산성이 낮다.
  • 튜닝/최적화가 쉽지 않다.
  • 배치 작업 중심으로 Low Latency가 아니라 Throughput에 초점이 맞춰져 있다. (모든 입출력이 디스크를 통해 이루어지기 때문에 큰 데이터를 배치 프로세싱하기에는 적합하지만 속도가 느림)
  • Shuffling 이후에 Data Skew가 발생하기 쉽다. Reduce 태스크 수를 개발자가 지정해 주어야 하기 때문에 예외적 케이스가 발생할 수 있다.

8. Spark

1) Spark 3.0 구성

  • Spark Core
  • Spark SQL
  • Spark ML
  • Spark Streaming
  • Spark GraphX

2) Spark vs MapReduce

  • Spark는 기본적으로 메모리 기반이고, 메모리가 부족해지면 디스크를 사용하므로 Spark가 속도가 더 빠르다. MapReduce는 디스크 기반이다.
  • MapReduce는 하둡(YARN) 위에서만 동작하지만 Spark는 다른 분산 컴퓨팅 환경(K8s, Mesos)에서도 지원한다.
  • Spark는 Pandas Data Frame과 개념적으로 동일한 데이터 구조를 가진다. MapReduce는 Key, Value 기반 데이터 구조만을 지원한다.
  • Spark는 다양한 방식의 컴퓨팅을 지원하지만 MapReduce는 배치 작업이 중심이다.

3) Spark 프로그래밍 API

  • 세 종류의 API가 존재한다.
  • RDD (Resilient Distributed Dataset)
    • 로우 레벨이기 때문에 코딩 복잡도가 증가한다.
  • DataFrame & Dataset
    • Python으로 하면 DataFrame, Java나 Scala는 Dataset을 주로 사용한다.
    • 하이레벨 프로그래밍 API이다.
    • 만약 구조화된 데이터를 조작하고 직관적인 데이터를 다룬다면 Spark SQL을 사용하는 게 더 효율적이다.
    • 다만 ML 피쳐 엔지니어링을 하거나 Spark ML을 쓰는 경우, SQL만으로 할 수 없는 일일 경우 사용한다.

4) Spark SQL

  • 구조화된 데이터 처리를 SQL로 처리한다.
  • 데이터 프레임을 SQL로 처리 가능하고, Pandas도 동일 기능을 제공한다.
  • Hive 쿼리보다 최대 100 배까지 빠른 성능을 보장한다고는 하나 최근 Hive가 메모리와 디스크를 같이 사용하게 되면서 비슷해졌다. 왜냐하면 Spark와 Presto는 메모리만 사용하다 큰 데이터를 사용하기 위해 디스크도 사용하게 되었고 결론적으로 셋 다 디스크와 메모리 사용을 범용하기 때문이다.

5) Spark ML

  • 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리이다.
  • 두 가지 버전이 있는데 RDD 기반의 spark.mllib와 데이터 프레임 기반의 spark.ml이 있다. (현재는 spark.mllib는 사용하지 않음)
  • 항상 import pyspark.ml을 해야 된다.
  • 원스톱 ML 프레임워크이고, 대용량 데이터도 처리가 가능하다는 것이 가장 큰 장점이다.

6) Spark 데이터 시스템 사용 예

  • 기본적으로 대용량 데이터 배치 처리, 스트림 처리, 모델 빌딩에서 사용한다.
  • 대용량 비구조화된 데이터 처리하기. (ETL/ELT)
    • Hive나 Presto를 대체하는 용도로 쓰인다.
    • 데이터 레이크 스토리지에 있는 데이터를 Spark와 같은 기술을 이용해 주기적으로 프로세싱해 데이터 웨어하우스 스토리지로 적재하거나 데이터 레이크 스토리지에 재적재한다.
  • ML 모델에 사용되는 대용량 피쳐 처리
    - 과거 행동이나 실시간 행동을 통해 피쳐를 계속 백그라운드에서 계산하고 있고 그걸 spark를 통해 만든다.
    • 그렇게 배치 처리 및 스트리밍으로 만들어진 데이터를 NoSQL에 저장한다.
    • 실시간 행동을 카프카나 키네시스를 통해 기록해 두고 이 정보와 다른 정보를 JOIN해 spark로 계산해 이를 NoSQL에 저장한다.
    • 이를 ML API에 사용한다.

7) Spark 프로그램 구조

  • Driver
    • 내가 실행하려는 spark 코드를 총 지휘하는 역할을 한다.
    • 모드에 따라 client, cluster 모드 두 개로 작동할 수 있다.
    • client로 돌 때는 노트북이나 spark shell처럼 spark 클러스터 밖에서 돌린다.
    • cluster 모드는 spark 클러스터 내부에서 돌게 된다.
    • configuration도 몇 가지 설정이 있는데. --num-executors 몇 개의 executor를 쓸 건지, --executor-cores, --executor-memory 등이 있다.
    • 이를 이용해서 YARN의 리소스 매니저나 Cluster 매니저를 통해 통신한다. (Driver Code)
  • Executor
    • 실제 태스크를 실행해 주는 역할을 수행한다.
    • Transformations, Actions.
    • YARN에서는 컨테이너 역할을 한다.

8) Spark 클러스터 매니저 옵션

  • local[n]
    • 여기서 n은 몇 개의 스레드를 가지느냐이다. 즉, executor의 수가 된다.
    • 개발/테스트용으로 spark shell이나 IDE, 노트북이 된다.
    • local[*]를 써 주면 컴퓨터에 있는 모든 코어를 사용한다는 뜻이다.
  • YARN
    • Client와 Cluster 모드가 될 수 있다.
    • Client 모드는 Driver가 Spark 클러스터 밖에서 동작하며 YARN 기반 Spark 클러스터를 바탕으로 개발/테스트 환경에서 사용한다.
    • Cluster 모드는 Driver가 Spark 클러스터 안에서 동작한다. 하나의 Container 슬롯을 차지하고 실제 프로덕션 운영에 사용되는 모드이다.
  • Kubernetes
  • Mesos
  • Standalone


🔎 어려웠던 내용 & 새로 알게 된 내용



✍ 회고

- 처음 Hadoop 환경을 세팅하는 게 조금 오래 걸렸다. Hadoop 환경보다 Spark를 더 많이 사용한다고 해서 Spark를 더 열심히 들어야 되겠다 생각했다. 다음 일자부터는 Spark 실습 위주인데 이 이유 때문인 것 같다. 현업에서도 Spark를 더 많이 사용하기 때문에.

profile
송의 개발 LOG
post-custom-banner

0개의 댓글