워크플로 관리

기업 내의 신청, 승인, 보고 등의 정형적인 업무 프로세스와 같이 정해진 업무를 원할하게 진행하기 위한 구조를 일반적으로 워크플로 관리라고 합니다.

태스크는 정해진 스케줄에 따라 자동으로 실행되고, 무언가 비정상적인 일이 발생한 경우에는 사람이 개입하여 문제를 해결합니다.

 

워크플로 관리 도구

워크플로 관리 도구의 주요 역할은 정기적으로 태스크를 실행하고 비정상적인 상태를 감지하여 그것에 대해 해결을 돕는 것입니다.

워크플로 관리 도구는 주로 다음과 같은 기능을 제공합니다

  • 태스크를 정기적인 스케줄로 실행하고 그 결과 통지
  • 태스크 간의 의존 관계를 정하고 정해진 순서대로 빠짐없이 실행
  • 태스크의 실행 결과를 보관하고 오류 발생 시에는 재실행

워크플로 관리 도구는 크게 두 종류가 있습니다.

하나는 선언형 도구입니다.

선언형 도구는 XML이나 YAML 등의 서식으로 워크플로를 기술하는 타입입니다.

선언형 도구에서는 미리 제공된 기능만 이용할 수 있는데, 그 범위 안이라면 최소한의 기술로 태스크를 정의할 수 있는 특징이 있습니다.

누가 작성해도 동일한 워크플로가 되기 때문에 유지 보수성이 높아집니다.

동일 쿼리를 바꾸어 여러번 실행하거나,워크플로를 단순 반복적으로 자동 생성하는 경우에도 선언형 도구가 사용됩니다.

오픈 소스로 Azkaban, Digdag, Oozie 등이 있습니다.

 

다른 하나는 스트립트형 도구입니다.

스트립트형 도구는 스트립트 언어로 워크플로를 정의하는 유형입니다.

스크립트형 도구는 일반적인 스크립트와 동일하게 변수나 제어 구문을 사용할 수 있어서 태스크의 정의를 프로그래밍할 수 있습니다.

스크립트 언어에 의해 데이터 처리를 태스크 안에서 실행하는 것도 가능합니다.

예를 들어 파일의 문자코드를 변환하면서 서버에 업로드하는 식의 태스크는 스트립트형 도구의 강점입니다.

오픈 소스로 Airflow, Luigi 등이 있습니다.

 

ETL 프로세스에는 스크립트형 도구, SQL의 실행에는 선언형 도구를 쓰는 것도 하나의 방법입니다.

 

오류로부터의 복구 방법

데이터 파이프라인을 매일 동작시키다보면 다양한 오류가 발생합니다.

오류가 일시적인 장애든지 구현상의 버그든지 신속하게 문제를 해결하여 태스크를 재실행해야 합니다.

 

워크플로 관리 도구에 의해 실행되는 일련의 태스크를 플로우라고 합니다.

각 플로우에는 실행 시에 고정 파라미터가 부여되어 있습니다.

즉, 플로우에 같은 파라미터를 넘기면 같은 태스크를 실행하게 됩니다.

이렇게 하는 이유는 플로우가 도중에 실패해도 나중에 같은 파라미터로 재실행할 수 있기 때문입니다.

이것이 복구의 기초입니다.

 

대부분의 워크플로 관리 도구는 과거에 실행한 플로우와 그 파라미터를 자동으로 데이터베이스에 기록하게 되어 있습니다.

그래서 실패한 플로우를 선택하여 재실행하는 것으로 복구를 하게 됩니다.

 

 

원자성 조작과 멱등한 조작

복구를 하기위해서는 재실행의 안정성이 필요합니다.

태스크가 도중에 실패했을 때 그 도중 경과가 사라지지 않고 남아있으면 태스크의 재실행에 의해 데이터가 혼재하는 문제가 발생합니다.

그래서 각 태스크는 원칙적으로 마지막까지 성공하거나 실패하면 아무것도 남지 않아야 합니다.

재실행의 안정성을 높이는 방법에는 원자성 조작멱등한 조작이 있습니다.

 

원자성 조작

트랜잭션 처리에 대응한 데이터베이스라면 여러번의 트랜잭션이 한번의 쓰기로 실행할 수 있지만, 그럴 수 없다면 쓰기가 필요한 만큼 태스크를 나눠야 합니다.

이를 일반적으로 원자성 조작이라고 합니다.

 

하지만 원자성 조작도 문제를 일으킬 가능성이 있습니다.

태스크 구현상의 버그 등으로 원자성 조작 직후에 문제가 발생하면 원자성 조작 자체는 성공하고 있어도 워크플로 관리 도구는 그것을 오류로 여기는 경우가 있습니다.

예를 들어, 데이터베이스에 쓰는 태스크가 있다고 하고 네트워크 경유로 쓰기 명령을 발행한 직후에 통신이 끊겼다고 합시다.

이 경우에는 원자성 조작에 성공하였지만, 데이터베이스에 쓰였는지는 데이터베이스를 봐야 알 수 있습니다.

만약 데이터베이스에 쓰였는데, 워크플로 관리 도구가 오류로 인식하여 재실행하게 되면 중복이 일어나게 됩니다.

 

이러한 가능성도 허가하지 않을 때는 원자성 조작에 의존한 플로우를 만들면 안됩니다.

적어도 워크플로 관리 도구에 의한 자동적인 재시도는 피하고, 오류의 내용을 반드시 확인한 뒤에 수동으로 복구해야 합니다.

 

멱등한 조작

더욱 확실한 방법은 동일한 태스크를 여러번 실행해도 동일한 결과가 되도록 하는 것입니다.

이것을 멱등한 조작이라고 합니다.

 

예를 들어, SQL에서 테이블을 삭제한 후에 다시 만드는 방법 즉, 치환하는 태스크라면 아무리 재실행해도 같은 결과가 나오므로 중복이 발생하지 않습니다.

 

하지만 현실에서는 항상 멱등한 태스크를 구현할 수 없습니다.

예를 들어, 크기가 큰 기존 테이블에 데이터를 추가하고 싶을 때 과거의 모든 데이터들을 치환하는 것으로 멱등하게 만든다면 부하가 커지게 됩니다.

이러한 경우에는 멱등한 추가원자성을 지닌 추가가 있습니다.

 

멱등한 추가는 테이블 파티셔닝을 이용하여 기존 테이블을 파티션으로 나누고 파티션 단위로 치환하는 것입니다.

원자성을 지닌 추가는 중간 테이블을 멱등하게 만든 후 마지막에 기존 테이블에 추가하는 것입니다.

 

데이터 파이프라인을 안정적으로 운용하기 위해서는 거기에 포함된 태스크나 플로우를 가능한 한 멱등으로 해야 합니다.

성능상의 이유 등으로 치환이 아닌 추가를 해야할 경우도 있기 때문에 전부 멱등으로 하는 것은 필수가 아닙니다.

최종적으로 워크플로가 안정적으로 실행되고 있는 한, 태스크가 멱등이지 않아도 동작에 지장은 없습니다.

추가가 문제가 되는 것은 중복 뿐이므로, 그것만 주의하면 일반적은 운용으로 문제 될 일은 없습니다.

 

 

자원 소비량 컨트롤

워크플로 관리 도구에서 요구되는 다른 하나의 커다란 역할은 외부 시스템의 부하 컨트롤입니다.

태스크의 크기나 동시 실행 수를 변화시켜서 자원의 소비량을 조정하여 모든 태스크가 원할하게 실행되도록 합니다.

너무 대량의 태스크를 동시 실행하지 못하게 제한하는 구조를 잡큐 또는 태스크 큐라고 합니다.

태스크 큐 구조 예시

 

워크플로에 등록하는 모든 태스크는 너무 크지도 작지도 않도록 적절히 나눔으로써 높은 효율로 실행할 수 있고 오류 발생 시의 영향 또한 작게 억제할 수 있습니다.

 

 

배치형 데이터 플로우

기술적인 발전에 따라 현재는 다단계의 데이터 처리를 그대로 분산 시스템의 내부에서 실행할 수 있게 됐습니다.

이것을 데이터 플로우라고 합니다.

 

현재는 MapReduce를 대신할 프레임워크들이 있습니다.

이 프레임워크들에 공통으로 들어가는 것이 DAG 데이터 구조입니다.

 

DAG

DAG는 수학과 컴퓨터 알고리즘에서 사용되는 데이터 모델 중 하나입니다.

DAG는 다음과 같은 성질을 가지고 있습니다.

  • 노드와 노드가 화살표로 연결(방향성)
  • 화살표를 아무리 따라가도 동일 노드로는 되돌아오지 않음(비순환)

DAG 예시

실행해야 할 태스크를 DAG로 정의하면 태스크 간의 의존 관계를 유지하면서 실행 순서를 결정하는 것이 가능합니다.

즉, 분산 시스템의 내부에서 높은 효율로 실행할 수 있도록 합니다.

 

데이터 플로우와 워크플로 조합

데이터 플로우에서 프로그래밍할 수 있게 되면, 데이터의 입출력 모두 하나의 DAG로 기술할 수 있습니다.

예를 들어, 배치 형의 데이터 플로우를 스크립트화 해두면 데이터 구조화나 데이터 마트 구축이라는 프로세스를 단순 태스크로 워크플로에서 호출할 수 있습니다.

 

 

스트리밍형 데이터 플로우

스트리밍형 데이터 플로우도 DAG를 사용합니다.

 

분산 스토리지를 거치지 않고 처리를 계속하는 것을 스트림 처리라고 합니다.

 

스트림 처리는 실시간성이 우수하지만, 과거의 데이터를 취급하는 데에는 부적합합니다.

 

스트림 처리에는 잠재적인 두가지 문제가 있습니다.

바로 틀린 결과를 어떻게 수정할 것인가와 과거의 결과를 수정하고 싶을 때 어떻게 할 것인가입니다.

 

이러한 문제를에 대한 전통적인 대처 방법은 스트림 처리와는 별개로 배치 처리를 실행시켜 후자의 결과가 옳다고 하는 것입니다.

예를 들어, 일별 보고서를 속보 값으로 하고 월별 보고서를 확정값으로 하는 것입니다.

이 방법을 이용한 것에 람다 아키텍처카파 아키텍처가 있습니다.

 

람다 아키텍처

람다 아키텍처는 배치 처리를 조합시켜 2계통의 데이터 처리 구조를 가지고 있습니다.

람다 아키텍처는 3가지 레이어를 가지고 있습니다.

람다 아키텍처 예시

 

모든 데이터는 반드시 배치 레이어에서처리합니다.

과거의 데이터를 장기적인 스토리지에 축적하고, 여러번 다시 집계할 수 있게 합니다.

배치 레이어는 대규모 배치 처리를 실행할 수 있지만 1회 처리에는 긴 시간이 걸립니다.

 

배치 처리 결과는 서빙 레이어를 통해서 접근합니다.

여기에 응답이 빠른 데이터베이스를 설치하여 집계 결과를 바로 추출하도록 합니다.

서빙 레이어에서 얻어진 결과를 배치 뷰라고 합니다.

배치 뷰는 정기적으로 업데이트 되는 것이므로 실시간 정보를 얻을 수 없습니다.

 

다른 경로인 스피드 레이어는 스트림 처리를 합니다.

스피드 레이어에서 얻은 결과를 실시간 뷰라고 합니다.

실시간 뷰는 배치 뷰가 업데이트될 동안까지만 이용되고 오래된 데이터는 순서대로 삭제됩니다.

 

마지막에는 배치 뷰와 실시간 뷰 모두를 조합시키는 형태로 쿼리를 실행합니다.

 

하지만 람다 아키텍처는 시스템을 복잡하게 해서 나쁜 개발 효율을 가지고 있습니다.

 

카파 아키텍처

람다 아키텍처에서 배치 레이어와 서빙 레이어를 완전히 제거하고 스피드 레이어만 남겨서 단순화한 것입니다.

카파 아키텍처는 메시지 브로커의 데이터 보관 기간을 충분히 길게 하여 무슨 문제가 일어났을 때는 메시지 배송 시간을 과거로 다시 설정합니다.

그러면 과거의 데이터가 다시 스트림 처리로 흘러 들어 실질적으로 재실행이 이루어집니다.

즉, 배치 처리와 같은 과거 데이터의 일괄 처리를 스트림 처리만으로 실행할 수 있습니다.

 

 하지만 이렇게 하면 부하가 높아지는 단점이 있습니다.

예를 들어, 스트림 처리의 데이터 플로우에 대량의 과거 데이터를 흘려보내면, 평상시와 비교해 몇 배 또는 몇십 배의 계산 자원을 일시적으로 소비하게 됩니다.

 

아웃 오브 오더의 데이터 처리

앞 글에서 설명한 이벤트 시간과 프로세스 시간의 차이 때문에 스트림 처리는 올바른 집계 결과를 얻기 힘듭니다.

이때 이벤트 시간과 프로세스 시간 차이 때문에 생기는 문제를 기술적으로는 아웃 오브 오더의 데이터 문제라고 불립니다.

 

이벤트 시간 윈도잉

스트림 처리에서는 종종 시간을 일정 간격으로 나누어 윈도우를 만들고 그 안에서 데이터 집계를 합니다.

예를 들어, 과거 1시간의 이벤트 수 추이를 그래프로 만들고 싶으면, 데이터를 1분 간격인 60개의 윈도우로 나누어 각각의 윈도우로 이벤트 수를 셉니다.

이벤트 시간에 의해 윈도우를 나누는 것을 이벤트 시간 윈도윙이라 합니다.

 

과거 이벤트의 상태를 보관하면서, 데이터가 도달할 때마다 해당하는 윈도우를 재집계 합니다.

데이터를 무한히 계속 보관할 수는 없으므로 일정 이상 늦게 온 데이터는 무시하게 됩니다.

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터의 축적  (0) 2023.01.06
빅데이터의 분산 처리  (0) 2023.01.05
빅데이터 탐색  (0) 2022.12.29
스몰 데이터 분석  (0) 2022.12.29
데이터 파이프라인  (0) 2022.12.28

객체 스토리지

빅데이터는 대부분 확장성이 높은 분산 스토리지에 저장됩니다.

분산형 데이터베이스가 이용되는 경우도 있지만, 기본적으로 객체 스토리지가 이용됩니다.

하둡이라면 HDFS, 클라우드 서비스라면 Amazon S3 등이 있습니다.

객체 스토리지의 구조

객체 스토리지의 파일의 읽기 쓰기는 네트워크를 거쳐서 실행합니다.

객체 스토리지의 이러한 구조는 데이터가 여러 디스크에 복사되기 때문에 일부 하드웨어가 고장나도 데이터가 손실되지 않습니다.

또한 데이터를 다수의 하드웨어에 분산하기 때문에 데이터양이 늘어나도 성능이 떨어지지 않습니다.

하지만 크기가 작은 데이터에 대해서는 비효율적입니다.

예를들어 아주 작은 파일을 자주 읽고 쓰면 데이터양에 비해 통신 오버헤드가 너무 크게됩니다.

 

데이터 수집

빅데이터에서 자주 다루는 데이터는 시계열 데이터입니다.

이것을 수시로 객체 스토리지에 기록하면 작은 데이터가 계속해서 들어가기 때문에 비효율적입니다.

그래서 작은 데이터는 적당히 모아서 하나의 큰 파일로 만들고 객체 스토리지에 기록하는 것으로 효율을 높일 수 있습니다.

 

그와 반대로 너무 큰 파일은 문제가 발생합니다.

너무 큰 파일은 네트워크 전송에 시간이 걸려 예상치 못한 오류 발생률이 높아집니다.

 그래서 너무 큰 파일은 적당히 나눠서 객체 스토리지에 기록하는 것으로 이러한 문제를 줄일 수 있습니다.

 

즉, 빅데이터는 단지 수집만 하는 것이 아니라 나중에 처리하기 쉽도록 준비해둘 필요가 있습니다.

 

 

벌크형과 스트리밍형

데이터 전송에는 벌크형과 스트리밍형 두종류의 구조가 있습니다.

이 둘은 기술적인 특성과 사용되는 도구가 전혀 다르므로 그 성질을 이해한 다음 구분해서 사용해야 합니다.

벌크형

전통적인 데이터 웨어하우스에서 사용된 것은 주로 벌크형 방식으로 데이터베이스나 파일 서버 또는 웹 서비스 등에서 SQL이나 API 등으로 정리해 데이터를 추출합니다.

빅데이터 경우에도 축적된 대량의 데이터가 이미 있거나 기존의 데이터베이스에서 데이터를 추출하고 싶을 때 벌크형을 사용합니다.

 

원래 데이터가 처음부터 분산 스토리지에 저장되어 있는 것이 아니라면 ETL서버로 데이터 전송을 합니다.

ETL서버는 구조화 데이터 처리에 적합한 데이터 웨어하우스를 위한 ETL도구와 오픈 소스의 벌크 전송 도구 또는 손수 작성한 스크립트 등을 이용하여 데이터를 전송합니다.

 

벌크형의 장점은 문제가 발생했을때 여러번 데이터 전송을 재실행할 수 있어서 신뢰성이 우수합니다.

그리고 워크플로 관리 도구와의 궁합도 좋습니다.

그렇기에 과거의 데이터를 빠짐없이 가져오거나 실패한 작업은 재실행해야 한다면 벌크형 전송을 해야합니다.

벌크형 데이터 전송 예시

 

벌크형에서의 파일 사이즈 적정화

벌크형 ETL 프로세스는 하루 또는 1시간 마다의 간격으로 정기적인 실행을 하므로 적정한 크기의 파일로 모아 전송 할 수 있습니다.

만약 정기적인 실행이 적정한 크기의 파일로 모으지 않는다면 시간 간격 변경 등 전송 방법을 변경하는 것이 좋습니다.

 

스트리밍형

계속해서 전송되어 오는 작은 데이터를 취급하기 위한 데이터 전송 방식입니다.

대다수 데이터는 통신 장비 및 소프트웨어에 의해 생성되고, 네트워크를 거쳐서 전송됩니다.

이러한 데이터는 벌크형 도구로 모을 수 없기 때문에 스트리밍형 데이터 전송이 필요합니다.

 

이러한 데이터 전송의 공통점은 다수의 클라이언트에서 계속해서 작은 데이터가 전송 된다는 것입니다.

이러한 데이터 전송 방식을 일반적으로 메시지 배송이라고 합니다.

메시지 배송 시스템은 전송되는 데이터양에 비해 통신 오버헤드가 크기 때문에 이를 처리하는 서버는 높은 성능을 요구합니다.

스트리밍형 메시지 배송 예시

 

보내온 메시지를 저장하는 몇가지 방법이 있는데 그 중 하나는 작은 데이터 쓰기에 적합한 NoSQL 데이터베이스를 이용하는 것입니다.

이 경우 Hive와 같은 쿼리 엔진으로 NoSQL 데이터베이스에 연결해 데이터를 읽을 수 있습니다.

또 다른 하나는 분산 스토리지에 직접 쓰는 것이 아니라 메시지 큐메시지 브로커 등의 중계 시스템에 전송하는 것입니다.

이 경우 기록된 데이터는 일정한 간격으로 꺼내고 모아서 함께 분산 스토리지에 저장합니다.

 

메시지 브로커

대량의 메시지를 안정적으로 받기 위해서는 빈번한 쓰기에도 견딜 수 있는 높은 성능의 스토리지가 필요하지만, 분산 스토리지가 반드시 높은 성능을 가지고 있다고 할 수 없기 때문에 빅데이터의 메시지 배송 시스템에서는 종종 데이터를 일시적으로 축적하는 중산층이 설치됩니다.

이것을 메시지 브로커라고 합니다.

 

빅데이터를 위한 메시지 브로커는 오픈 소스의 경우 Apache Kafka, 클라우드 서비스의 경우는 Amazon Kinesis 등이 있습니다.

 

메시지 브로커에 써넣은 데이터는 복수의 다른 소비자에서 읽어 들일 수 있습니다.

이를 통해 메시지가 복사되어 데이터를 여러 경로로 분기시킬 수 있습니다.

이것을 메시지 라우팅이라 합니다.

즉, 메시지를 여러 경로로 라우팅함으로써 동일한 데이터를 스트리밍 처리 및 배치 처리 모두에서 사용할 수 있습니다.

 

메시지 배송의 신뢰성 문제와 3가지 설계 방식

성능 문제 외에도 피할 수 없는 것이 신뢰성의 문제인데, 신뢰성은 성능과 트레이드 오프 관계에 있습니다.

모바일 회선과 같은 신뢰성이 낮은 네트워크에서는 반드시 메시지의 중복이나 누락이 발생합니다.

그것을 처리하는 시스템은 다음 3가지 중 하나를 보장하도록 설계됩니다.

  • at most once : 메시지는 한 번만 전송, 도중에 전송에 실패하면 데이터 손실
  • exactly once : 메시지는 손실 중복 없이 한번만 전달
  • at least once : 메시지는 확실히 전달, 중복 가능성 있음

at most once는 무슨 일이 일어나도 메시지를 다시 보내지 않습니다.

그렇게 때문에 오류가 발생하면 데이터 손실이 가능성이 있습니다.

 

exactly once는 양쪽 통신 내용을 중계하는 코디네이터라는 것이 있습니다.

송신 측과 수신 측 모두 서로의 정보를 코디네이터에게 전달하고, 문제가 발생하면 코디네이터에 따라 문제를 해결합니다.

하지만 분산 시스템에 항상 코디네이터가 있다고 할 수 없기 때문에 장애가 발생할 가능성이 있습니다.

그리고 코디네이터의 처리에 시간이 소요되기 때문에 성능이 저하됩니다.

 

at least once는 오류가 발생하면 재전송을 하기 때문에 중복이 일어날 수 있습니다.

중복을 제거하는 방법은 있지만 중복 제거에 시간이 소요되고 비용도 들기 때문에 일반적으로 중복 제거는 사용자에게 맡깁니다.

 

대부분의 메시지 배송 시스템은 at least once를 보장합니다.

 

오프셋을 이용한 중복 제거

전송해야 할 데이터에 파일명 등의 이름을 부여해 그것을 작은 메시지에 실어서 배송합니다.

각 메시지에는 파일 안의 시작 위치를 덧붙입니다.

만일 메시지가 중복되어도 같은 파일의 같은 장소를 덮어쓸 뿐이므로 문제가 되지 않습니다.

시스템이 at least once 보장한다면 언젠가는 파일이 재구성되어 데이터 전송이 완료됩니다.

 

이 방법은 벌크형 데이터 전송과 같이 데이터양이 고정된 경우에는 잘 작동하지만, 스트리밍형 메시지 배송에서 쓰는 경우는 거의 없습니다.

 

고유 ID에 의한 중복 제거

스트리밍형 메시지 배송에서 자주 사용되는 것은 모든 메시지에 UUID 등의 고유 ID를 지정하는 방법입니다.

이 방법은 메시지가 늘어남에 따라 ID가 폭발적으로 늘어나기 때문에 그것을 어떻게 관리하느냐가 문제입니다.

 

현실적으로는 예를 들어 최근 1시간 등 최근에 받은 ID만을 기억해두고 그보다 늦게 온 메시지는 중복을 허용합니다.

중복 대부분은 일시적인 통신 오류로 인해 발생하기 때문에 그것만 제거하면 99퍼의 신뢰도는 달성할 수 있습니다.

 

데이터베이스에서의 중복 제거

분산 스토리지로 Cassandra와 Elasticsearch 등의 NoSQL 데이터베이스를 이용한다고 하면, 데이터를 쓸 때 고유 ID를 지정되기 때문에 동일한 ID의 데이터는 덮어씁니다.

그렇기에 중복이 일어나도 아무런 변화가 없기 때문에 중복 제거가 됩니다.

 

보내온 데이터를 그대로 객체 스토리지에 저장하고 나중에 읽어 들이는 단계에서 SQL로 중복을 제거하는 방법도 있습니다.

이 방법은 대규모 데이터 처리이므로 메모리에서 실행하는 것은 거의 불가능하며, Hive 같은 배치형 쿼리 엔진에서 실행합니다.

 

종단간의 신뢰성

스트리밍형 메시지 배송은 다수의 요소로 구성되는데 그 중 일부분에서 중복 제거가 되더라도 다른 일부분에서 중복이 발생할 수 있습니다.

그렇기에 중복 제거는 종단 간에 실행하지 않으면 의미가 없습니다.

즉, 신뢰성이 높은 메시지 배송을 실현하려면 중간 경로를 모두 at least once로 통일한 후 클라이언트 상에서 모든 메시지에 고유 ID를 포함하도록 하고 경로의 말단에서 중복 제거를 실행해야 합니다.

 

 

시계열 데이터 최적화

이벤트 시간과 프로세스 시간

클라이언트 상에서 메시지가 생성된 시간을 이벤트 시간, 서버가 처리하는 시간을 프로세스 시간이라 합니다.

스마트 폰에서 데이터를 수집하면 메시지가 며칠 늦게 도착하는 일은 드물지 않습니다.

왜냐하면 사용자가 전파가 닿지 않는 곳으로 외출하거나 배터리가 완전히 방전될 수도 있기 때문입니다.

그렇기에 며칠 정도의 지연을 예측해서 데이터 분석을 고려해야 합니다.

 

주로 데이터 분석의 대상은 이벤트 시간이기 때문에 이 두 시간의 차이가 문제를 일으킵니다.

 

예를 들어, 과거 특정일 1월 1일에 대한 이벤트를 집계한다고 하면 한달 뒤인 2월 1일까지의 모든 파일을 열고 거기에 1월 1일 데이터를 뽑아내면 비교적 정확한 결과를 얻을 수 있습니다.

하지만 데이터가 이벤트 시간으로 정렬되어 있지 않기 때문에 한달 동안의 모든 데이터를 로드해야 원하는 이벤트 시간이 포함되어 있는지 알 수 있기 때문에 시간과 자원을 많이 낭비하게 됩니다.

 

시계열 인덱스

이벤트 시간에 의한 집계의 효율화를 위한 방법 중 하나로 이벤트 시간에 대해 인덱스를 만드는 것입니다.

Cassandra와 같은 시계열 인덱스에 대응하는 분산 데이터베이스를 이용하여 처음부터 이벤트 시간으로 인덱스 된 테이블을 만들 수 있습니다.

시계열 인덱스를 사용하면 매우 짧은 범위의 특정 시간에 맞춘 데이터 집계를 빠르게 실행할 수 있습니다.

정해진 시간에 발생한 이벤트를 조사하거나, 실시간 대시보드를 만드는 경우에 유용합니다.

 

하지만 장기간에 걸쳐서 대량의 데이터를 집계하는 경우에는 분산 데이터베이스가 그다지 효율적이지 않기 때문에 장기적인 데이터 분석은 집계 효율이 높은 열지향 스토리지를 지속적으로 만들어야 합니다.

 

조건절 푸쉬다운

이벤트 시간에 의한 집계의 효율화를 위한 방법 중 하나로 매일 한번씩 새로 도착한 데이터를 배치 처리로 변환하는 것입니다.

열지향 스토리지에서는 RDB와 동등한 인덱스를 만들 수 없지만, 처음에 데이터를 정렬할 수 있습니다.

이벤트 시간으로 데이터를 정렬한 후에 열지향 스토리지로 변환하도록 합니다.

열지향 스토리지는 칼럼 단위의 통계 정보를 이용하여 이벤트 시간의 최솟값(시작 시각)과 최댓값(종료 시각) 정보를 얻을 수 있습니다.

이 정보를 이용하면 파일의 어떤 부분에 원하는 데이터가 포함되어 있는지 알 수 있습니다.

 

이 통계를 이용하여 필요 최소한의 데이터만을 읽도록 하는 최적화를 조건절 푸시 다운이라고 합니다.

 

시계열 테이블

조건절 푸시 다운에서 데이터 검색을 효율적으로 하는 방법이 있습니다.

앞의 글에서 테이블 포지셔닝에 대해 설명을 했고, 그 중 시간을 이용하여 분할된 테이블을 시계열 테이블이라고 합니다.

그러면 새로운 데이터들이 오면 이벤트 시간에 해당하는 파티션이 있다면 데이터를 추가하고, 없다면 파티션을 만들어 추가하면 됩니다.

 

하지만 새로운 데이터 때문에 새로운 파티션을 만드는 것은 잠재적인 문제가 있습니다.

계속해서 새로운 데이터가 추가된다면 결국 분산 스토리지에는 대량의 작은 파티션들이 만들어지게 되고 점차 쿼리의 성능이 악화됩니다.

그렇기때문에 작은 데이터를 효율적으로 추가할 수 있는 분산 데이터베이스를 사용하거나 오래된 데이터는 버리는 방법이 필요합니다.

 

데이터 마트를 이벤트 시간으로 정렬

데이터 검색에 더 좋은 방법은 데이터 마트만이 이벤트 시간에 의한 정렬을 고려하도록 하는 것입니다.

즉, 데이터 마트를 만드는 단계에서 이벤트 시간에 의한 정렬을 함께 하도록 하는 것입니다.

그러면 파일이 조각나는 일도 없고, 항상 최적의 데이터 마트를 유지할 수 있습니다.

 

 

NoSQL 데이터베이스

NoSQL 데이터베이스는 비구조화 데이터 분산 스토리지로 사용할 수 있습니다.

NoSQL 데이터베이스의 구조는 분산 KVS, 와이드 칼럼 스토어, 다큐먼트 스토어가 있습니다.

분산 KVS

분산 KVS는 모든 데이터를 키값 쌍으로 저장하도록 설계된 데이터 저장소입니다.

모든 데이터에 고유의 키를 지정하고 그것을 부하 분산을 위해 이용합니다.

키가 정해지면 그 값을 클러스터 내의 어느 노드에 배치할 것인지 결정합니다.

이 구조에 의해 노드간에 부하를 균등하게 분산하고 노드를 증감하는 것만으로 클러스터의 성능을 변경할 수 있게 되어 있습니다.

 

가장 간단한 경우에 하나의 키에 하나의 값을 할 수 있습니다.

시스템에 따라서는 키에 여러 값을 할당하거나, 반대로 여러 키 조합에 값을 할당할 수 있습니다.

 

분산 KVS 아키텍처에는 마스터/슬레이브 형, P2P 형이 있습니다.

마스터/슬레이브 형은 1대의 마스터가 전체를 관리하게 되어있고 마스터가 중지되면 아무도 데이터를 읽고 쓸 수 없습니다.

P2P 형은 모든 노드가 대등한 관계이기 때문에 클라이언트는 어떤 노드에 연결해도 데이터를 읽고 쓸 수 있습니다.

마스터/슬레이브 형과 P2P 형 예시

 

클라우드 서비스로 Amazon DynamoDB 등이 있습니다.

 

와이드 칼럼 스토어

와이드 칼럼 스토어는 2개 이상의 임의의 키에 데이터를 저장할 수 있도록 한 것입니다.

내부적으로 행 키와 칼럼 명의 조합에 대해 값을 지정합니다.

테이블에 새로운 행을 추가는 것과 마찬가지로 칼럼도 추가할 수 있습니다.

즉, 하나의 테이블에 가로 세로 2차원에 데이터를 쓸 수 있도록 한 것입니다.

와이드 칼럼 스토어 예시

 

클라우드 서비스로 Google Cloud Bigtable, 오픈 소스로 Apache HBase, Apache Cassandra 등이 있습니다.

 

다큐먼트 스토어

와이드 칼럼 스토어가 주로 성능 향상을 목표로 한다면, 다큐먼트 스토어데이터 처리의 유연성을 목적으로 합니다.

 

JSON처럼 복잡하게 뒤얽힌 스키마리스 데이터를 그대로의 형태로 저장하고 쿼리를 실행할 수 있도록 합니다.

물론 간단한 분산 KVS도 JSON 텍스트로 저장할 수 있지만, 그에 대한 복잡한 쿼리를 실행할 수 있다고 할 순 없습니다.

다큐먼트 스토어는 배열과 연상 배열과 같은 중첩된 데이터 구조에 대해 인덱스를 만들거나 다큐먼트 일부만을 치환하는 식의 쿼리를 쉽게 실행할 수 있습니다.

 

다큐먼트 스토어는 외부에서 들여온 데이터를 저장하는데 특히 적합합니다.

보통 자체 개발한 애플리케이션 등에서는 명시적으로 스키마를 정하는 편이 좋은 점이 많기 때문에 주로 참고 시스템의 데이터 및 로그 저장 등에 적합니다.

 

오픈 소스로 MongoDB 등이 있습니다.

 

ACID 특성

ACID 특성은 트랜잭션 처리에 요구되는 4가지 성질을 말합니다.

  • 원시성(atomicity)
  • 일관성(consistency)
  • 독립성(isolation)
  • 내구성(durability)
  • 원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 예를 들어, 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안된다. 원자성은 이와 같이 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.
  • 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
  • 독립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다. 성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건이다. 자세한 내용은 관련 문서를 참조해야 한다.
  • 지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.

 

일반적인 RDB는 이들을 충족하고 있어 신뢰성 있는 트랜잭션 처리를 실현하고 있습니다.

 

CAP 정리

ACID 특성을 만족하면서 분산 시스템을 구축하는 것은 어렵기 때문에 그 한계에 대해서 제창된 것이 CAP 정리입니다.

일반적으로 분산 시스템에서는 다음 3가지를 동시에 충족시킬 수 없어 어느 하나가 희생될 수 있습니다.

  • 일관성(consistency)
  • 가용성(availability)
  • 분단내성(partition-tolerance)

CAP 정리는 제한된 조건에서만 성립하며, 분산 시스템에서 트랜잭션 처리를 실행할 수 없다는 의미는 아닙니다.

그러나 실제 NoSQL 데이터베이스 중에는 성능상의 이유로 ACID 특성을 충족하지 않는 것도 있으므로 주의가 필요합니다.

 

결과 일관성

NoSQL 데이터베이스의 일부는 CAP 정리의 일관성이나 가용성 중 하나를 선택합니다.

일관성을 선택하면 단시간의 장애 발생을 수용한다는 것이고, 가용성을 선택하면 오래된 데이터를 읽을 수 있도록 한다는 것입니다.

그 중 자주 볼 수 있는 것이 결과 일관성의 개념으로 써넣은 데이터를 바로 읽을 수 있다고는 말할 수 없다는 것입니다.

 

결과 일관성은 시간이 지나면 언젠가 최신 데이터를 읽을 수 있음을 보장하지만 그게 언제가 될지는 알 수 없습니다.

 

검색 엔진

NoSQL 데이터베이스와는 조금 성격이 다르지만, 저장된 데이터를 쿼리로 찾아낸다는 점에서는 유사한 부분도 많고, 특히 텍스트 데이터 및 스키마리스 데이터를 집계하는데 자주 사용됩니다.

 

검색 엔진의 특징은 텍스트 데이터를 전문 검색하기 위해 역 색인을 만듭니다.

역 색인을 만들기 때문에 데이터를 기록하는 시스템 부하 및 디스크 소비량은 커지지만, 그 덕분에 키워드 검색이 훨씬 고속화 됩니다.

만약 역 색인이 없다면 모든 텍스트를 전체 스캔해야 원하는 레코드를 찾을 수 있기에 검색 효율이 크게 저하됩니다.

 

대부분의 NoSQL 데이터베이스가 성능 향상을 위해 색인 작성을 제한하고 있는 것과 대조적으로 적극적으로 색인을 만들어서 데이터를 찾는 것에 특화 되어 있습니다.

결과적으로 검색 엔진은 데이터의 집계에 적합하며, 특히 비정상적인 상태의 감지 및 보안 체크, 고객 서포트처럼 민첩성이 요구되는 용도에서 최근의 데이터를 보기 위해 사용됩니다.

그래서 검색 엔진은 장기적으로 데이터를 축적하기보다는 실시간 집계 시스템의 일부로 이용됩니다.

 

오픈 소스로 Elasticsearch 등이 있습니다.

오픈 소스는 아니지만, 사용 검색 엔진인 Splunk도 있습니다.

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터 파이프라인  (0) 2023.01.09
빅데이터의 분산 처리  (0) 2023.01.05
빅데이터 탐색  (0) 2022.12.29
스몰 데이터 분석  (0) 2022.12.29
데이터 파이프라인  (0) 2022.12.28

데이터

구조화 데이터

테이블의 칼럼과 데이터형, 데이블들 간의 관계 등을 스키마라고 하는데,

스키마가 명확하게 정의된 데이터를 구조화 데이터라고 합니다.

 

비구조화 데이터

자연 언어로 작성된 텍스트 데이터, 이미지, 동영상 등의 미디어 데이터 처럼 스키마가 없는 데이터를 비구조화 데이터라고 합니다.

 

스키마리스 데이터

CSV, JSON, XML 등의 데이터처럼 서식은 정해져있지만, 칼럼 수나 데이터형은 명확하지 않은 데이터를 스키마리스 데이터라고 합니다.

 

데이터 구조화 파이프라인

SQL로 테이블을 집계하기 위해서는 비구조화 데이터와 스키마리스 데이터를 구조화 데이터로 변환시킬 필요가 있습니다.

데이터 구조화 파이프라인 예시

 

 

하둡(Hadoop)

현재는 빅데이터를 대표하는 분산 처리 프레임워크입니다.

분산 시스템을 구성하는 다수의 소프트웨어로 이루어져 있습니다.

하둡에서 사용할 수 있는 열 지향 스토리지에는 몇가지 종류가 있습니다.

그 중 Apache ORC는 구조화 데이터를 위한 스토리지로 스키마를 정한 후 데이터를 저장합니다.

Apache Parquet은 스키마리스에 가까운 데이터 구조로 되어있어서 JSON과 같은 데이터를 그대로 저장할 수 있습니다.

 

분산 시스템의 구성 요소

하둡의 기본 구성 요소는 분산 파일 시스템인 HDFS, 리소스 관리자인 YARN, 분산 데이터 처리의 기반인 MapReduce 이렇게 3가지입니다.

그 외의 프로젝트는 하둡 본체와는 독립적으로 개발되어 하둡을 이용한 분산 애플리케이션으로 동작합니다.

모든 분산 시스템이 하둡에 의존하는 것이 아니라 하둡의 일부만 사용하거나 혹은 전혀 이용하지 않는 구성도 있습니다.

예를 들어 분산 파일 시스템은 HDFS, 리소스 관리자는 Mesos, 분산 데이터 처리는 Spark를 사용하는 것입니다.

즉, 다양한 소프트웨어들 중에서 자신에게 맞는 것을 선택하고 조합하여 사용하면 됩니다.

하둡 분산 시스템 예시

 

분산 파일 시스템과 리소스 관리자

하둡에서 처리되는 데이터 대부분은 분산 파일 시스템인 HDFS에 저장됩니다.

다수의 컴퓨터에 파일을 복사하여 중복성을 높인다는 특징이 있습니다.

 

CPU나 메모리 등의 계산 리소스는 리소스 관리자인 YARN에 의해 관리됩니다.

YARN은 애플리케이션이 사용하는 CPU 코어와 메모리를 컨테이너 단위로 관리합니다.

하둡에서 분산 애플리케이션을 실행하면 YARN이 클러스터 전체의 부하를 보고 비어 있는 호스트부터 컨테이너를 할당합니다.

 

리소스 관리자는 어느 애플리케이션에 얼마만큼의 리소스를 할당 할 것인지를 관리하여 모든 애플리케이션이 차질없이 실행되도록 제어합니다.

그리고 애플리케이션마다 실행 우선순위를 결정할 수 있습니다.

즉, 덜 중요한 애플리케이션에 낮은 우선순위를 부여해서 아무도 리소스를 사용하지 않을 경우에만 실행하는 등, 높은 우선순위부터 실행함으로써 한정된 리소스를 낭비없이 활용하면서 데이터 처리를 진행할 수 있습니다.

 

분산 데이터 처리 및 쿼리 엔진

MapReduce는 YARN 상에서 동작하는 애플리케이션 중 하나이며, 분산 시스템으로 데이터 처리를 실행하는데 사용합니다.

비구조화 데이터를 가공하는데 적합하고 한번 실행으로 대량의 데이터를 읽을 수 있습니다.

하지만 작은 프로그램을 실행하면 오버헤드가 너무 크기 때문에 몇 초 안에 끝나는 쿼리 실행에는 적합하지 않습니다.

 

SQL 등의 쿼리 언어에 의한 데이터 집계가 목적인 쿼리 엔진 중 Apache Hive가 있습니다.

Apache Hive는 MapReduce의 성질을 계승하였기 때문에 시간이 걸리는 배치 처리에는 적합하나 애드 혹 쿼리를 여러번 실행하는데는 적합하지 않습니다.

 

Hive on Tez

Hive를 가속화하기 위해 개발된 것이 Apache Tez입니다.

Tez는 기존의 MapReduce를 대체할 목적으로 개발된 프로젝트이며, MapReduce에 있던 몇가지 단점을 해소함으로써 고속화를 실현했습니다.

 

현재의 Hive는 MapReduce뿐만 아니라 Tez에도 동작하도록 되어있습니다.

이것을 Hive on Tez라고 불리고 예전 Hive는 Hive on MR이라 불립니다.

 

대화형 쿼리 엔진

Hive를 고속화하는 것이 아닌, 처음부터 대화형의 쿼리 실행만을 전문으로 하는 쿼리 엔진 중 Apache ImpalaPresto가 있습니다.

대화형 쿼리 엔진은 순간 최대 속도를 높이기 위해 모든 오버헤드가 제거되어 사용할 수 있는 리소스를 최대한 활용하여 쿼리를 실행합니다.

그 결과 MPP 데이터베이스와 비교해도 꿀리지 않는 응답속도를 가졌습니다.

 

대량의 비구조화 데이터를 가공하는 무거운 배치 처리에는 높은 처리량을 가진 Hive를 이용하고, 그렇게 해서 만들어진 구조화 데이터를 대화식으로 집계하고자 할 때 지연이 적은 Impala와 Presto를 이용합니다.

 

하둡에서는 다수의 쿼리 엔진이 개발되어 있으며, 그것들을 총칭해 SQL-on-Hadoop이라 불립니다.

 

 

Spark

Apache Spark는 하둡과는 다른 독립된 프로젝트입니다.

컴퓨터에서 취급하는 메모리의 양이 증가함에 따라 대량의 메모리를 활용하여 고속화를 실현한 것이 Spark의 특징입니다.

이 경우 컴퓨터가 비정상 종료되면 중간 데이터들이 사라져 버리지만, 처리를 다시 시작해서 중간 데이터를 다시 만들면 됩니다.

 

Spark는 하둡을 대체하는 것이 아니라 MapReduce를 대체하는 존재입니다.

즉, 분산 파일 시스템 HDFS, 리소스 관리자 YARN, 분산 데이터 처리 Spark로 쓸 수 있습니다.

 

Spark 상에서 실행되는 데이터 처리는 스크립트 언어를 사용할 수 있습니다.

표준으로 자바, 스칼라, 파이썬 그리고 R언어가 있습니다.

 

Spark에서는 SQL로 쿼리를 실행하기 위한 Spark SQL과 스트림 처리를 수행하기 위한 Spark Streaming 기능이 있습니다.

그래서 대규모 배치 처리뿐만 아니라 대화형 쿼리 실행과 실시간 스트림 처리에도 이용되고 있습니다.

 

 

비정규화 테이블 만들기

데이터의 구조화가 끝나면 다음은 데이터 마트의 구축을 합니다.

즉, 테이블을 결합 및 집약해서 비정규화 테이블을 만듭니다.

이때 Hive와 같은 배치형 쿼리 엔진을 사용할 것인지 Presto와 같은 대화형 쿼리 엔진을 사용할 것인지 선택할 수 있습니다.

 

Hive

시간이 걸리는 배치 처리는 원칙적으로 Hive를 사용합니다.

비정규화 테이블을 만드는데 오랜 시간이 걸리는 것은 흔한 일이며, 그렇기에 효율적인 쿼리를 작성해야 합니다.

Hive의 쿼리를 개선하는 예로 서브 쿼리 안에서 레코드 수 줄이기데이터 편향 피하기가 있습니다

 

서브 쿼리 안에서 레코드 수 줄이기

예시로 모든 데이터를 읽어 들인 후 결합된 테이블을  WHERE 문으로 검색한다고 해봅시다.

테이블을 결합 한 후 WHERE문으로 검색하기 보다는 먼저 WHERE문을 적용하고 테이블을 결합하는 것이 서브 쿼리 안에서 팩트 테이블을 작게 하기 때문에 좀 더 효율적입니다.

즉, 초기에 팩트 테이블을 작게 하여 데이터 양을 줄이는 것입니다.

 

데이터 편향 피하기

예시로 30일의 기간동안 하루마다의 고유 방문자 수를 알아낸다고 합시다.

그렇다면 보통 날짜별로 GROUP BY를 하고 distinct count로 방문자를 중복제거하여 고유 방문자 수를 구할 것입니다.

이때 날짜별로 GROUP BY를 했기 때문에 하나의 노드에서 하루의 방문자들을 distinct로 중복제거를 할 것입니다.

30일 동안 고유 방문자가 모두 균등하게 방문하였다면 노드에 distinct로 처리해야할 데이터 양이 균등하게 분산이 되어 데이터 편향은 없겠지만, 어느 특정 기간에만 고유 방문자가 많이 방문하였다면 일부 노드에 distinct로 처리해야할 데이터 양이 많아져 데이터편향이 생길 것입니다.

그러면 처음에 distinct로 (날짜, 방문자)를 중복제거하고 날짜별로 GROUP BY하고 방문자 수를 세주는 것이 데이터 편향을 줄임으로써 좀 더 효율적입니다.

즉, 최초에 중복을 제거하여 균등하게 분산 처리를 하는 것입니다.

 

 

Presto

작은 쿼리를 여러번 실행하는 대화형 데이터 처리, 쿼리 실행의 지연을 감소시키는 것에 적합한 것이 대화형 쿼리 엔진입니다.

Presto는 그 중 하나입니다.

 

Presto는 다양한 데이터 소스를 테이블로 참고할 수 있는 플러그인 가능한 스토리지입니다.

예를 들어, 하나의 쿼리 안에서 분산 스토리지 상의 팩트 테이블과 MySQL의 마스터 테이블을 조인할 수 있습니다.

 

메모리 상에서 할 수 있는 단시간 쿼리 실행에 효율적입니다.

열지향 스토리지에서 집계를 매우 빠르게 실행합니다.

 

 

데이터 마트  구축

팩트 테이블의 작성에는 추가와 치환 두가지 방법이 있습니다.

추가는 새로 도착한 데이터만을 증분으로 추가하는 것이고, 치환은 과거의 데이터를 포함하여 테이블 전체를 치환하는 것입니다.

 

추가

효율만을 생각하면 추가가 압도적으로 좋으나 잠재적인 문제가 있습니다.

첫째, 추가에 실패한 것을 알아채지 못하면 팩트 테이블의 일부에 결손이 발생합니다.

둘째, 추가를 잘못해서 여러번 실행하면 팩트 테이블의 일부가 중복됩니다.

셋째, 나중에 팩트 테이블을 다시 만들고 싶은 경우의 관리가 복잡해집니다.

이러한 문제가 일어날 가능성을 줄이기 위해 테이블 파티셔닝이라는 기술을 사용합니다.

 

테이블 파티셔닝

테이블 파티셔닝은 하나의 테이블을 여러 물리적인 파티션으로 나눔으로써 파티션 단위로 정리하여 테이터를 쓰거나 삭제할 수 있도록 한 것입니다.

일반적으로 1일 1회, 또는 1시간에 1회라는 식으로 자주 새 파티션을 만들고 그것을 팩트 테이블에 붙입니다.

각 파티션은 매번 교체하도록 하고 만약 이미 존재한다면 덮어씁니다.

이렇게 하면 데이터가 중복될 가능성을 배제하면서 필요에 따라 여러번 데이터의 기록을 바로 잡을 수 있습니다.

테이블 파티셔닝 예시

 

치환

데이터 파티셔닝은 데이터 웨어하우스를 구축하는데 유용합니다.

데이터 마트를 만드는 경우에는 단순히 팩트 테이블을 치환하는 경우가 많을 수도 있습니다.

왜냐하면 상당히 거대한 테이블을 만들지 않는 한 매번 치환하기는 어렵지않기 때문입니다.

예를 들어, 일일 보고서를 위해 지난 30일 동안의 데이터를 매일 꺼내서 치환하는 식입니다.

테이블 파티셔닝과 치환 예시

치환은 처리 시간이 우려되는 방법이지만 많은 장점이 있습니다.

첫째, 중간에 데이터가 중복되거나 빠드릴 가능성이 없습니다.

둘째, 테이블을 처음부터 다시 만들고 싶다면 쿼리를 한번 실행하기만 하면 됩니다.

셋째, 스키마 변경 등에도 유연하게 대응할 수 있습니다.

넷째, 오래된 데이터는 자동으로 지워지기 때문에 데이터 마트가 계속 확대되는 일은 없습니다.

 

만약 데이터 양이 너무 많아 처리 시간이 너무 오래 걸린다면 데이터 마트 측에도 테이블 파티셔닝을 하거나 기존의 테이블에 추가한 다음 주의 깊게 모니터링을 해야할 것입니다.

 

집계 테이블

팩트 테이블을 어느 정도 모아서 집계하면 데이터의 양이 크게 줄어드는데 이것을 집계 테이블이라고 합니다.

특히 1일 단위로 집계한 일일 집계는 일일 보고서를 만드는데 자주 사용됩니다.

 

집계 테이블을 만들기 위해서는 필요한 칼럼을 골라 숫자 데이터를 집계하면 됩니다.

이때, 각 칼럼이 취하는 값의 범위를 카디널리티라고 합니다.

카디널리티를 너무 적으면 원래 있던 정보가 크게 손실되고 너무 많으면 시각화의 효율을 낮춥니다.

그렇기에 균형에 맞춰서 카디널리티를 정해야합니다.

 

스냅샷 테이블

마스터 데이터처럼 업데이트될 가능성이 있는 테이블에 대한 방안 중 하나로 정기적으로 테이블을 통째로 저장하는 것을 스냅샷 테이블이라고 합니다.

스냅샷의 날짜를 지정하여 과거의 마스터 테이블을 언제든지 볼 수 있고, 팩트 테이블과 스냅샷 테이블을 날짜를 포함해서 결합할 수 있습니다.

이것은 매일 변화하는 마스터 정보를 이용하여 데이터를 분석하고 싶을 때 유용합니다.

 

스냅샷은 특정 시점의 테이블의 상태를 기록한 것이므로 나중에 다시 만들 수 없습니다.

그렇기에 데이터 레이크나 데이터 웨어하우스와 같은 영구적인 저장소에 보관하여 삭제되지 않도록 합니다.

 

이력 테이블

마스터 데이터처럼 업데이트될 가능성이 있는 테이블에 대한 방안 중 하나로 변경된 데이터만 저장하는 것을 이력 테이블이라고 합니다.

이력 테이블은 데이터의 양을 줄이는데 도움이 되지만, 어느 순간의 완전한 마스터 테이블을 나중에 복원하는 것이 어려워지므로, 디멘전 테이블로는 사용하기 힘듭니다.

 

디멘전을 추가하여 비정규화 테이블 완성시키기

마지막에 팩트 테이블과 디멘전 테이블을 결합하여 비정규화 테이블을 만듭니다.

디멘전 테이블로는 스냅샷 뿐만 아니라 목적에 따라 각종 중간 테이블이 만들어집니다.

 

데이터를 집계하는 전형적인 쿼리는 다음과 같습니다.

먼저 팩트 테이블에서 필요한 데이터를 꺼냅니다.

이때, 시간에 의한 검색이나 참고하는 칼럼 수를 줄이면 데이터 로드 속도는 빨라집니다.

다음으로 디멘전 테이블과 결합하여 데이터 마트에 저장할 칼럼을 선택합니다.

이때, 카디널리티를 가급적 작게하는 것이 좋습니다.

마지막으로 그룹화하여 측정값을 집계합니다.

 

그 결과, 충분히 작은 비정규화 테이블이 만들어지고 이후에는 데이터 마트로 보내면됩니다.

 

 

 

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터 파이프라인  (0) 2023.01.09
빅데이터의 축적  (0) 2023.01.06
빅데이터 탐색  (0) 2022.12.29
스몰 데이터 분석  (0) 2022.12.29
데이터 파이프라인  (0) 2022.12.28

빅데이터를 효율적으로 탐색하려면 데이터를 시각화하는 환경이 마련되어야 합니다.

 

크로스 집계

데이터 시각화에서 먼저 기본이 되는 것은 크로스 집계입니다.

테이블

행과 열이 교차하는 부분에 숫자 데이터가 들어가는 테이블을 크로스 테이블이라고 합니다.

크로스 테이블 예시

크로스 테이블은 사람들이 보기 편한 테이블이지만, 데이터베이스에서는 다루기 힘든 데이터 형식입니다.

데이터베이스에 새로운 행을 추가하는 것은 쉽지만 새로운 열을 추가하는 것은 쉽지 않기 때문입니다.

따라서, 테이블의 바탕이 되는 데이터는 행방향으로만 증가하게하고, 열방향으로는 증가하지 않도록 해야합니다.

행 방향으로만 증가하는 테이블을 트랜잭션 테이블이라고 합니다.

트랜잭션 테이블 예시

트랜잭션 테이블에서 크로스 테이블로 변환하는 것이 크로스 집계라고 합니다.

 

소량의 데이터를 크로스 집계하는데 편리한 것이 스프레드시트의 피벗 테이블 기능입니다.

피벗 테이블 기능은 엑셀에서 사용하는 것이 일반적이지만, 구글 스프레드시트에서도 사용할 수 있습니다.

 

트랜잭션 테이블에서 특정 칼럼을 기준으로 다른 테이블을 결합하고 싶을 때 사용하는 것이 룩업 테이블 기능입니다.

 

크로스 집계는 BI 도구, 파이썬 Pandas, SQL로도 할 수 있습니다.

 

 

데이터 베이스의 지연 줄이기

데이터 마트를 만들 때 가급적 데이터 처리 지연이 적은 데이터베이스가 있어야 하는데, 거기에는 크게 2가지 선택이 있습니다.

 

첫 번째는 모든 데이터를 메모리에 올리는 것입니다.

수 GB에서 수십GB의 메모리를 제공하는 것은 어렵지 않기 때문에 그 정도의 데이터 양이라면 메모리에 다 올릴 수 있습니다.

그리고 그 정도의 데이터 양이라면 일반적인 RDB가 데이터 마트에 적합합니다.

RDB는 원래 지연이 적고, 많은 수의 클라이언트가 동시 접속해도 성능이 나빠지지 않기 때문에 많은 사용자가 사용하는 실제 운영 환경에서 우수합니다.

하지만 RDB는 메모리가 부족하면 급격히 성능이 저하됩니다.

 

두 번째는 압축과 분산 기법을 사용하는 것입니다.

즉, 데이터를 가능한 한 작게 압축하고 그것을 여러 디스크에 분산함으로써 데이터 로드의 지연을 줄이는 것입니다.

분산된 데이터를 멀티 코어를 활용하면서 디스크 I/O를 병렬 처리하는 아키텍쳐를 MPP(대규모 병렬 처리)라 합니다.

이 아키텍쳐는 대량의 데이터를 분석하기 위해 데이터베이스에서 널리 사용되고 있습니다.

예를 들어, Amazon Redshift, Google BigQuery 등이 있습니다.

 

행 지향 데이터베이스와 열 지향 데이터베이스

행 지향 데이터베이스는 테이블의 각 행을 하나의 덩어리로 디스크에 저장합니다.

그러면 새로운 행을 추가한다면 파일의 끝에 데이터만 쓰면 되기 때문에 고속으로 쓰기가 가능합니다.

데이터 검색을 고속화하기 위해 적절한 인덱스를 만드는 것이 중요합니다.

 

열 지향 데이터베이스는 테이블의 컬럼 단위로 디스크에 저장합니다.

칼럼 단위로 저장 함으로써, 필요한 칼럼만을 로드할 수 있어서 디스크 I/O를 줄입니다.

같은 칼럼에는 종종 유사한 데이터가 나열되고, 같은 문자열의 반복은 매우 작게 압축할 수 있습니다.

그렇기 때문에 열 지향 데이터베이스는 행 지향 데이터베이스의 1/10 이하로 압축할 수 있는 우수한 압축 효율을 보여줄 수 있습니다.

 

MPP

MPP는 열 지향 데이터베이스에서 사용합니다.

왜냐하면 열 지향 데이터베이스의 디스크에서 대량의 데이터를 읽기 때문에 한 번의 쿼리 실행 시간이 길어지고 압축된 데이터의 전개 등으로 CPU 리소스를 필요로 하므로 멀티 코어를 활용하여 고속화하는 것이 좋기 때문입니다.

 

오른쪽이 MPP를 사용한 것

쿼리가 잘 병렬화할 수 있다면, MPP를 사용한 데이터의 집계는 CPU 코어 수에 비례하여 고속화됩니다.

단, 디스크를 로드하는 과정에서 병목현상일 발생하지 않게 데이터가 고르게 분산되어 있어야합니다.

 

MPP는 구조상, 고속화를 위해 CPU와 디스크 모두를 균형 있게 늘려야합니다.

따라서, 일부 제품은 하드웨어와 소프트웨어가 통합된 제품으로 제공됩니다.

이처럼 하드웨어 수준에서 데이터 집계에 최적화된 데이터베이스를 MPP 데이터베이스라고 합니다.

 

MPP의 아키텍처는 Hadoop과 함께 사용되는 대화형 쿼리 엔진으로도 채택되고 있습니다.

(Hadoop: 대량의 데이터를 분산 처리를 위한 프레임워크)

이 경우 데이터를 저장하는 것은 분산 스토리지의 역할입니다.

안정성은 MPP 데이터베이스, 편리성은 대화형 쿼리 엔진 쪽이 좋습니다.

 

 

시각화 도구

데이터를 시각화하는 소프트웨어는 여러 종류가 있습니다.

스프레드시트

스프레드시트는 도입이 간단해 피벗 테이블을 사용하여 크로스 집계를 하고 그래프를 작성하기 쉽습니다.

또한 클라우드 서비스라면 다른 팀원과 공유하기 좋고, API 등으로 데이터를 자동으로 업데이트하는 것도 가능합니다.

 

스프레드시트 도구로는 구글 스프레드시트 등이 있습니다.

 

주피터 노트북(Jupyter Notebook)

어떤 데이터 분석이라도 처음에는 애드 혹(adhoc) 분석부터 시작합니다.

원하는 데이터가 어디에 있는지 모르고, 집계 시간도 얼마나 걸릴지 모르기 때문에 여러 번의 시행착오를 반복하면서 데이터를 살펴봐야 합니다.

그런 과정에서는 대화형 실행 환경이 자주 사용되고 그 도구로 인기가 있는 것이 주피터 노트북입니다.

주피터 노트북은 웹 브라우저에서 실행되고 사용할 수 있는 언어 중에서 선택해서 사용할 수 있습니다.

주피터 노트북에서 matplotlib 라이브러리를 사용해 시각화 할 수 있습니다.

그리고 수동으로 워크플로의 실행이 가능하고 !명령어로 외부 명령어를 실행할 수 있습니다.

주피터 노트북 예시

 

대시보드 도구

정기적으로 쿼리를 실행해 보고서를 작성하거나 주요 그래프를 모아서 대시보드를 작성한다고 하면 BI 도구를 사용할 수 있습니다.

하지만 대시보드를 만드는 것만이 목적이라면 그것에 특화된 도구가 있습니다.

 

대시보드는 새로운 그래프를 쉽게 추가하거나 정해진 지표의 일상적인 변화를 모니터링 할 때 더 적합합니다.

 

오픈 소스의 대시보드 도구는 Redash, Superset 등이 있고, 실시간 시각화 도구는 Kibana등이 있습니다.

Kinana는 검색 엔진인 Elasticsearch의 프론트 엔드로 개발되었기 때문에 Elasticsearch 설치가 필요합니다.

Redash 예시

 

BI 도구

몇 개월 단위의 장기적인 데이터의 추이를 시각화하거나, 집계의 조건을 세부적으로 바꿀 수 있는 즉, 대화적인 대시보드를 만들 때 적합합니다.

 

BI 도구로 무엇을 보고 싶은지에 따라 여러개의 대시보드가 만들어집니다.

그 과정에서 대시보드의 바탕이 되는 테이블을 하나로 통합하고 그 테이블에서 여러개의 대시보드를 만들면 배치 처리의 부하가 안정됩니다.

 

BI 도구로는 Tableau Desktop 등이 있습니다.

Tableau Desktop 예시

 

BI 도구에서 데이터를 볼 때 어떤 숫자가 어디에서 오는 것인지 그 내역을 파악하고 싶을때, 복잡한 데이터를 분석하기 쉽게 하려면 데이터를 몇 개의 그룹으로 분산하여 각 그룹에 내용을 정리하는 것이 효과적입니다.

이것을 브레이크 다운 분석이라고 합니다.

 

 

테이블

트랜잭션과 마스터

데이터베이스의 설계에서는 종종 테이블을 마스터와 트랜잭션으로 구분합니다.

시간과 함께 생성되는 데이터를 기록한것이 트랜잭션, 트랜잭션에서 참고되는 각종 정보가 마스터입니다.

트랜잭션은 한 번 기록하면 변화하지 않지만, 마스터는 상황에 따라 다시 쓰입니다.

트랜잭션과 마스터의 관계 예시

 

팩트 테이블과 디멘전 테이블

데이터 웨어하우스의 세계에서는 트랜잭션처럼 사실이 기록된 것을 팩트 테이블, 거기에서 참고되는 마스터 데이터 등을 디멘전 테이블이라 합니다.

팩트 테이블을 중심으로 스키마를 그리면 별 모양으로 보여서 스타 스키마라 합니다.

팩트 테이블과 디멘전 테이블 스타 스키마 예시

 

비정규화 테이블

팩트 테이블에 모든 테이블을 결합한 것을 비정규화 테이블이라고 합니다.

대부분의 경우, 데이터 마트는 비정규화 테이블로 하는 것이 가장 단순하며, 충분히 효율적인 방법입니다.

열 지향 데이터베이스가 아니라면 비정규화 테이블은 데이터양 때문에 바람직하지 않지만, 수백만 레코드 정도의 스몰 데이터라면 문제가 되지 않습니다.

하지만 데이터양이 수천만~수억 레코드 정도가 되어 메모리보다 엄청 많아진다면 열 지향 스토리지를 사용해야 합니다.

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터 파이프라인  (0) 2023.01.09
빅데이터의 축적  (0) 2023.01.06
빅데이터의 분산 처리  (0) 2023.01.05
스몰 데이터 분석  (0) 2022.12.29
데이터 파이프라인  (0) 2022.12.28

데이터를 분석하기 위해선 먼저 데이터를 수집해야 합니다.

데이터에는 서버에서 다운로드를 해서 얻는 데이터, API를 통해 얻는 데이터, 전처리(preprocessing)가 필요한 상태의 데이터가 있습니다.

 

이때 많이 사용하는 것이 스크립트 언어입니다.

데이터 분석에 쓰는 스크립트 언어는 여러가지가 있습니다.

데이터 엔지니어에게 인기 있는 것은 파이썬입니다.

파이썬은 Numpy 등의 수치 계산용 라이브러리와 머신러닝의 프레임워크가 충실하고 데이터 프레임 형태의 Pandas 라이브러리를 많이 사용합니다.

 

데이터 프레임(Data Frame)

데이터 프레임은 표 형식의 데이터를 추상화한 객체입니다.

Pandas 데이터 프레임 예시

데이터 프레임을 사용하면 스크립트 언어 안에서 데이터 가공과 집계를 할 수 있습니다.

즉, 분석하기 어려운 데이터 형태를 파이썬으로 데이터 프레임 형태로 변환하면 분석이 훨씬 수월해집니다.

물론,  DB에 접속하여 SQL의 결과를 파이썬의 데이터 프레임으로 가져와 분석 할 수 있습니다.

 

BI 도구

BI 도구는 데이터를 시각화 해주는 도구라고 보시면 됩니다.

스프레드시트 형식 되어 있는 데이터를 모니터링을 한다고 하면, 변화와 변화의 원인을 단숨에 파악하기엔 무리가 있습니다.

데이터를 시각화하여 모니터링을 한다면 보다 변화와 변화의 원인을 파악하기 쉬워집니다.

BI 도구로는 Tableau Public, 구글 Data Studio 등이 있습니다.

Tableau Public는 주로 블로그에 공개하는 데이터를 위해 만들어지기 때문에 회사에 적합하지 않지만 BI 도구를 이해하는데 도움이 됩니다.

구글 Data Studio

 

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터 파이프라인  (0) 2023.01.09
빅데이터의 축적  (0) 2023.01.06
빅데이터의 분산 처리  (0) 2023.01.05
빅데이터 탐색  (0) 2022.12.29
데이터 파이프라인  (0) 2022.12.28

데이터 웨어하우스를 중심으로 하는 데이터 파이프 라인

- ETL

    E는 데이터 추출

    T는 데이터 변형

    L은 데이터 적재

 

- 원시 데이터

    데이터 수집할 때의 데이터 그자체입니다.

    로우(raw) 데이터라고도 합니다.

 

- 데이터 웨어하우스

    원시 데이터를 가공한 후 장기 보존의 목적으로 적재되는 데이터베이스입니다.

 

- 데이터 마트

    데이터 웨어하우스에서 사용하려는 목적에 맞게 필요한 데이터를 뽑아 분석하기 위한 테이블입니다.

 

- BI 도구

    데이터를 시각화하기 위한 도구입니다.

 

데이터 레이크를 중심으로 하는 데이터 파이프 라인

- 데이터 레이크

    원시 데이터 그대로 보존한 데이터베이스입니다.

    데이터 웨어하우스와 차이는 원시 데이터를 가공하여 보존하느냐 그대로 보존하느냐의 차이입니다.

 

빅데이터를 위한 데이터 파이프 라인

- 스트리밍형 데이터 수집

    실시간으로 데이터를 수집하는 방식입니다.

 

- 벌크형 데이터

    이미 어딘가에 존재하는 데이터를 정기적으로 수집하는 방식입니다.

 

- 스트림 처리

    실시간으로 데이터를 처리하는 방법입니다.

 

- 분산 스토리지

    여러 컴퓨터와 디스크로부터 구성된 스토리지 시스템을 말합니다.

 

- 분산 데이터 처리

    말 그대로 분산 스토리지에 있는 데이터를 처리합니다.

 

- 워크플로 관리

    전체 데이터 파이프라인의 동작을 관리하기 위한 기술입니다.

    매일 정해진 시간에 배치 처리를 설계한대로 실행하고, 오류가 발생하면 관리자에게 알리는 목적으로 사용됩니다.

'to become 데이터 엔지니어 > 간단한 정리' 카테고리의 다른 글

빅데이터 파이프라인  (0) 2023.01.09
빅데이터의 축적  (0) 2023.01.06
빅데이터의 분산 처리  (0) 2023.01.05
빅데이터 탐색  (0) 2022.12.29
스몰 데이터 분석  (0) 2022.12.29

+ Recent posts