📚 오늘 공부한 내용
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 Manager
가 Node Manager
에게 요청해 현재 사용할 수 있는 컨테이너(Application Master)를 실행한다.
Application Master
는 Resource Manager
코드에 실행에 필요한 리소스를 받아온다.
Application Master
는 Name 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를 더 많이 사용하기 때문에.