일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 분산 시스템
- codingtest
- recommendation system
- 파이썬
- Cosine-similarity
- 코딩테스트
- 데이터 엔지니어링
- 프로그래머스
- coursera
- Overfitting
- 데이터
- 부스트캠프
- 코테
- 협업 필터링
- Tensor
- 딥러닝
- 웹크롤링
- TF-IDF
- 웹스크래핑
- Python
- SGD
- 시각화
- 추천시스템
- wordcloud
- pytorch
- 추천 시스템
- 알고리즘
- 머신러닝
- selenium
- 백준
- Today
- Total
개발자식
[Data Engineering] 빅데이터를 지탱하는 기술_빅데이터의 분산 처리 본문
빅데이터의 분산 처리
다수의 컴퓨터에 데이터 처리를 분산하기 위해서는 그 실행을 관리하기 위한 프레임워크가 필요하다.
구조화된 데이터(structured data)
- SQL로 데이터를 집계하는 경우, 먼저 테이블의 칼럼 명과 데이터형, 테이블 간의 관계 등을 스키마(schema)로 정한다. 스키마가 명확하게 정의된 데이터를 구조화된 데이터라고 한다.
비구조화 데이터(unstructured data)
- 텍스트, 이미지, 동영상 등의 이러한 스키마가 없는 데이터를 비구조화 데이터라고 한다.
- 이 상태로는 SQL로 제대로 집계할 수 없다.
스키마리스 데이터(schemaless data)
- CSV, JSON, XML 등의 데이터는 서식은 정해져 있지만, 칼럼 수나 데이터형은 명확하지 않아 스키마리스 데이터라고 부른다.
데이터 구조화의 파이프라인
- 각 데이터 소스에서 수집된 비구조화 데이터, 또는 스키마리스 데이터는 처음에는 분산 스토리지에 보존되고, 그대로 SQL로 집계할 수 없어 '구조화 데이터'로 변환한다. 그리고 데이터의 압축률을 높이기 위해 열 지향 스토리지로 저장한다.
열 지향 스토리지의 작성
- MPP 데이터베이스의 경우 제품에 따라 스토리지의 형식이 고정되어 있지만 Hadoop의 경우 사용자가 직접 열 지향 스토리지의 형식을 선택해야 한다.
- 대표적인 Hadoop의 열 지향 스토리지는 Apache ORC, Apache Parquet가 있다.
비구조화 데이터를 읽어 들여 열 지향 스토리지로 변환하는 과정에서는 데이터의 가공 및 압축을 위해 많은 컴퓨터 리소스가 소비된다. 그래서 Hadoop, Spark 등의 분산 처리 프레임워크를 사용한다.
Hadoop
- 단일 소프트웨어가 아니라 분산 시스템을 구성하는 다수의 소프트웨어로 이루어진 집합체이다.
분산 시스템의 구성 요소
- Hadoop의 기본 구성 요소 3가지
- 분산 파일 시스템인 HDFS
- 리소스 관리자인 YARN
- 분산 데이터 처리의 기반인 MapReduce
- 그 외의 프로젝트는 Hadoop 본체와는 독립적으로 개발되어 Hadoop을 이용한 분산 애플리케이션으로 동작한다.
- 모든 분산 시스템이 Hadoop에 의존하는 것이 아니라, Hadoop을 일부만 사용하거나 혹은 전혀 이용하지 않는 구성도 있다.
분산 파일 시스템과 리소스 관리자
- Hadoop에서 처리되는 데이터 대부분은 분산 파일 시스템인 HDFS에 저장된다. 이것은 네트워크에 연결된 파일 서버와 같은 존재이지만, 다수의 컴퓨터에 파일을 복사하여 중복성을 높인다는 특징이 있다.
- CPU나 메모리 등의 계산 리소스는 리소스 매니저인 YARN에 의해 관리된다. YARN은 애플리케이션이 사용하는 CPU 코어와 메모리를 '컨테이너(container)' 단위로 관리한다.
- 분산 시스템은 많은 계산 리소스를 소비하지만, 호스트의 수에 따라 사용할 수 있는 리소스의 상한이 결정된다.
- 리소스 관리자는 어느 애플리케이션에 얼마만큼의 리소스를 할당할지 관리해야 한다.
분산 데이터 처리 및 쿼리 엔진
- MapReduce도 YARN 상에서 동작하는 분산 애플리케이션 중 하나이다. 분산 시스템에서 데이터 처리를 실행하는 데 사용된다. 자바 프로그램을 실행시킬 수 있어 비구조화 데이터를 가공하는 데 적합하다.
- SQL 등의 쿼리 언어에 의한 데이터 집계가 목적이라면 그것을 위해 설계된 쿼리 엔진을 사용한다. ex) 'Apache Hive'
- Apache Hive는 쿼리를 자동으로 MapReduce 프로그램으로 변환하는 SW로 개발되었다.
MapReduce, Hive 둘 다 대량의 데이터 배치 처리하기 위한 시스템으로 작은 프로그램을 실행하려면 오버헤드가 너무 커서 몇 초 안에 끝나버리는 쿼리 실행에는 적합하지 않다.
Hive on Tez
- Hive를 가속화하기 위해 개발된 것이 'Apache Tez'이다.
- Tez는 MapReduce를 대체할 목적으로 개발되어 MapReduce와 달리 스테이지의 종료를 기다리지 않고 처리가 끝난 데이터를 차례대로 후속 처리에 전달함으로써 쿼리 전체의 실행 시간을 단축한다.
- 현재 Hive는 Tez를 사용해도 동작하게 재작성 되어 있다.
대화형 쿼리 엔진
- Hive를 고속화하는 것이 아니라 처음부터 대화형의 쿼리 실행만 전문으로 하는 쿼리 엔진으로 'Apache Impala'와 'Presto'가 있다.
- 순간 최대 속도를 높이기 위해 모든 오버헤드가 제거되어 사용할 수 있는 리소스를 최대한 활용하여 쿼리를 실행한다.
그래서 Hadoop에서는 성질이 다른 쿼리 엔진을 목적에 따라 구분한다.
Spark
- MapReduce보다 효율적인 데이터 처리를 실현하는 프로젝트로 Hadoop과는 독립된 프로젝트이다.
- 디스크에 기록하지 않고 대량의 메모리를 활용하여 고속화를 실현하는 것이 특징이다.
- 스크립트 언어를 사용할 수 있어 표준으로 자바, 스칼라, 파이썬, R 언어에 대응한다.
- SQL로 쿼리를 실행하기 위한 'Spark SQL'과 스트림 처리를 수행하기 위한 'Spark Streaming' 기능이 포함되어 있다.
-> 대규모 배치 처리, 대화형 쿼리 실행, 실시간 스트림 처리까지 가능하다.
데이터 마트 구축의 파이프라인 with Hive, Presto
1. 분산 스토리지에 저장된 데이터를 구조화하고 열 지향 스토리지 형식으로 저장한다. (Hive 이용)
2. 완성된 구조화 데이터를 결합, 집계하고 비정규화 테이블로 데이터 마트에 써서 내보낸다. (Presto 이용)
- Hive에서 만든 각 테이블 정보는 'Hive 메타 스토어'라고 불리는 특별한 데이터베이스에 저장된다.
Hive에 의한 구조화 데이터 작성
- Hive를 사용하여 구조화 데이터를 작성한다.
- CREATE EXTERNAL TABLE로 '외부 테이블(external table)'을 정의한다.
외부 테이블이란 Hive의 외부에 있는 특정 파일을 참고해 마치 거기에 테이블이 존재하는 것처럼 읽어 들이기 위해 저장한다. (Hive를 비롯한 대부분의 SQL-ON-Hadoop의 쿼리 엔진이 그렇다.)
- 그 자리에서 바로 집계할 수 있는 성질은 애드 혹 데이터 분석하기에 유용하다.
열 지향 스토리지의 변환
- 열 지향 스토리지로 변환하여 그대로 집계하는 것의 비효율성을 개선하여 속도를 높인다.
- 쿼리를 다시 작성함으로써 테이블을 다시 만들 수 있다.
Hive로 비정규화 테이블 작성하기
- 데이터의 구조화가 완료되면 다음은 데이터 마트의 구축이다.
- 테이블을 결합 및 집약해서 '비정규화 테이블'을 만든다.
- 시간이 걸리는 배치는 Presto와 같은 대화형 쿼리 엔진 보다 Hive 같은 배치형 쿼리 엔진을 사용한다.
- 비정규화 테이블을 만드는데 오랜 시간이 걸리기 때문에 효율적인 쿼리를 작성해야 한다.
효율적인 쿼리 작성 방식
- 서브쿼리 안에서 레코드 수를 줄이는 방법 : 초기에 팩트 테이블을 작게 하여 집계한다.
- 데이터 편향을 방지하는 방법 : 데이터 편차를 최대한 없애 분산 시스템의 성능을 발휘하게 한다.
대화형 쿼리 엔진 Presto의 구조
- 작은 쿼리를 여러 번 실행하는 대화형 데이터 처리에는 대규모 데이터 처리에 적합하지 않다.
- 쿼리 실행의 지연을 감소시키는 것을 목적으로 개발되었다.
- '플러그인 가능한 스토리지 설계'가 하나의 특징이다.
- Presto가 성능을 최대한 발휘하려면 원래 스토리지가 열 지향 데이터 구조로 되어 있어야 한다.
Presto의 CPU 처리화
- CPU 이용 효율이 높아 메모리와 CPU 리소스만 충분하다면 데이터의 읽기 속도와 쿼리 실행 시간을 결정하게 된다.
- Presto 쿼리는 실행이 시작되면 중간에 끼어들 수 없어 너무 큰 쿼리를 실행해서는 안 된다.
Presto의 인 메모리 처리에 의한 고속화
- Hive와 달리 Presto는 쿼리의 실행 과정에서 디스크에 쓰기를 하지 않아, 모든 처리를 메모리상에서 실시한다.
분산 결합과 브로드캐스트 결합
- Presto는 '분산 결합(distribute join)'을 실시하며, 같은 키를 갖는 데이터는 동일한 노드에 모인다.
- 한쪽 테이블이 충분히 작은 경우에는 '브로드캐스트 결합(broadcast join)'을 이용하여 처리 속도를 크게 고속화한다.
데이터 분석의 프레임워크 선택하기
MPP 데이터 베이스
- 구조화 데이터를 SQL로 집계하는 것뿐이라면 기존의 데이터 웨어하우스와 클라우드 서비스를 이용하는 것이 좋다.
- MPP 데이터 베이스는 ETL 프로세스 등으로 데이터를 가져오는 절차만 완성하면 된다.
- 시각화를 위한 데이터 마트로 생각하면 MPP 데이터 베이스는 BI 도구와의 조합으로 최적이다.
Hive
- 대규모 배치 처리를 꾸준히 실행하여 특히 텍스트 데이터를 가공하거나 열 지향 스토리지를 만드는 무거운 처리는 Hive에서 실행하는 것이 적합하다.
Presto
- Hive와 정반대인 쿼리 엔진으로 속도로 인해 다양한 것을 희생한다.
- 실행 중에 장애가 발생하면 처음부터 다시 실행하고 메모리가 부족하면 쿼리를 실행할 수 없는 경우도 있다.
- 대화식 쿼리의 실행에 특화되어 있어 ETL 프로세스 및 데이터 구조화에는 적합하지 않다.
Spark
- SQL에 특화한 쿼리 엔진은 아니다.
- 인 메모리의 데이터 처리가 중심이며 대화형 쿼리 실행에도 적합하다.
- 큰 장점은 ETL 프로세스에서 SQL에 이르기까지의 일련의 흐름을 데이터 파이프라인으로 기술할 수 있다.
- 메모리를 어떻게 관리하느냐가 중요하다.
위에서 정리한 Hive에 의한 데이터 구조화와 Presto에 의한 SQL의 실행을 Spark로 이 둘을 하나의 스크립트 안에서 실행할 수 있다.
팩트 테이블
- 빅데이터의 분석은 데이터를 구조화하는 것부터 시작하는데 압도적으로 많은 부분을 차지하는 테이블이다.
- 팩트 테이블이 크면 열 지향 스토리지에서 데이터를 압축해야 빠른 집계를 할 수 있다.
- 팩트 테이블의 작성에는 '추가(append)', '치환(replace)'가 있다.
- 추가 : 새로 도착한 데이터만을 증분으로 추가한다.
- 치환 : 과거의 데이터를 포함하여 테이블 전체를 치환한다. (처리 시간 오래 걸림)
효율만을 생각하면 추가가 유리하지만, 아래와 같은 잠재적인 문제가 있다.
- 추가에 실패한 것을 알아채지 못하면 팩트 테이블의 일부에 결손이 발생한다.
- 추가를 잘못해서 여러 번 실행하면 팩트 테이블의 일부가 중복된다.
- 나중에 팩트 테이블을 다시 만들고 싶은 경우의 관리가 복잡해진다.
-> 이러한 문제를 '테이블 파티셔닝(table partitioning)' 기술로 해결한다.
테이블 파티셔닝
- 하나의 테이블을 여러 물리적인 파티션으로 나눔으로써 파티션 단위로 정리하여 데이터를 쓰거나 삭제할 수 있도록 한 것이다.
- 데이터 웨어하우스를 구축하는 데 유용하다. 데이터 마트를 만드는 경우 단순히 팩트 테이블을 치환하는 경우가 더 많다.
집계 테이블(summary table)
- 팩트 테이블을 어느 정도 모아서 집계하면 데이터의 양이 크게 줄어든다.
- 일일 집계(daily summary)는 데이터를 1일 단위로 집계한 것이다.
카디널리티(cardinality)
- 각 칼럼이 취하는 값의 범위를 말한다.
- 성별과 같은 값은 카디널리티가 작고, ip 주소와 같은 값은 카디널리티가 커진다.
집계 테이블을 작게 하려면 카디널리티를 줄여야 한다. (너무 줄이면 정보 손실)
업데이트 가능성이 있는 테이블 방안
- 스냅샷 테이블 : 정기적으로 테이블을 통째로 저장하는 방법
- 이력 테이블 : 변경 내용만을 저장하는 방법
디멘전을 추가하여 비정규화 테이블 완성시키기
- 팩트 테이블과 디멘전 테이블을 결합하여 비정규화 테이블을 만든다.
데이터 집계하는 전형적인 쿼리 정리
1. 팩트 테이블에서 필요한 데이터를 꺼낸다. 여기서 시간에 의한 검색이나 참고하는 칼럼 수를 줄인다.
2. 디멘젼 테이블과 결합하여 데이터 마트에 저장할 칼럼을 선택한다. (카디널리티는 가급적 작게)
3. 그룹화하여 측정값을 집계한다.
4. 결과를 데이터 마트로 내보내거나 csv 파일로 저장한다.
'Data > Data Engineering' 카테고리의 다른 글
[Data Engineering] 빅데이터를 지탱하는 기술_빅데이터의 축적 (0) | 2022.09.14 |
---|---|
[Data Engineering] 빅데이터를 지탱하는 기술_빅데이터의 탐색 (0) | 2022.09.12 |
[Data Engineering] 빅데이터를 지탱하는 기술_빅데이터의 기초 지식 (0) | 2022.09.11 |
[Data Engineering] 데이터 웨어하우스 (2) | 2022.09.10 |
[Data Engineering] 병렬 컴퓨팅, 분산 컴퓨팅, 분산 시스템 (0) | 2022.09.10 |