블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 


Data Preprocessing in ML Pipeline


본글은 구글 클라우드 블로그에 포스팅한 글을, 재 포스팅 허가를 받은 후 포스팅한 글입니다.

다른 좋은 글들도 많으니 아래 출처 링크를 참고해 주새요

출처 링크


머신러닝 파이프라인에서, 데이터는 모델 학습 및 서빙의 입력에 알맞게 가공되어야 한다. 이를 전처리라고 하는데, 이번 글에서는 전처리에 대한 개념과 이에 대한 구현 옵션등에 대해서 알아보도록 한다.

처리 단계별 데이터 분류

머신러닝에서 데이터 전처리는 모델 학습에 사용되는 데이터 형태로 데이터를 가공하는 과정을 이야기한다.

데이터 전처리는 여러 단계로 이루어지는데, 단계별로 처리된 데이터에 대해서 다음과 같이 명명한다. 

Raw data

초기에 수집된 원본 데이터로 분석이나, 머신러닝 학습 용도로 전혀 전처리가 되지 않은 데이터를 의미한다.

하둡과 같은 데이터 레이크에 저장된 데이터나, 기본적인 처리를 통해서 테이블 구조로 데이터 레이크에 저장된 데이터가 Raw 데이터에 해당한다.

Prepared data

Prepared data는 Data engineering 전처리에 의해서, 학습을 위한 데이터만 추출한 서브셋 데이터를 의미한다. 예를 들어 서울 20대 사용자의 구매 패턴을 머신러닝 모델로 만들고자 할때, 서울 20대 사용자 데이터만 추출한 경우 이 데이터를 Prepared data라고 한다. 단순하게 서브셋만을 추출하는 것이 아니라, 깨끗한 상태의 데이터로 정재된 데이터인데, 정재의 의미는 비어 있는 행이나 열을 삭제한 데이터를 의미한다. 

Engineered feature

이렇게 정제된 데이터는 머신러닝 학습과 서빙에 적절한 형태로 재가공 되어야 하는데 이를 Feature Engineering 이라고 한다. 예를 들어 숫자와 같은 값을 0~1 사이로 맵핑 시키거나 , 카테고리 밸류 예를 들어 남자/여자를 0,1과 같은 값으로 맵핑 시키고, 전체 데이터를 학습,평가용으로 7:3 분할하여 저장하는 것이 이에 해당 한다. 



<그림. 데이터 전처리 단계 및 단계별 생성된 데이터 >

데이터 전처리 기법

그러면, 이 데이터 전처리 과정에서 구체적으로 어떤 기법으로 데이터를 처리할까? 몇가지 대표적인 기법을 정리해보면 다음과 같다. 

  • Data cleansing : 데이터에서 값이 잘못되거나 타입이 맞지 않는 행이나 열을 제거하는 작업을 한다. 

  • Instance selection & partitioning : 데이터를 학습,평가,테스트용 데이터로 나누는 작업을 한다. 단순히 나누는 작업 뿐만 아니라, 데이터를 샘플링 할때, 그 분포를 맞추는 작업을 병행한다. 예를 들어 서울/대구/부산의 선거 투표 데이타가 있을때, 인구 비율이 9:2:3이라고 할때, 전체 인구를 랜덤하게 샘플링해서 데이타를 추출하는 것이 아니라, 서울/대구/부산의 인구 비율에 따라서 서울에서 9, 대구에서 2, 부산에서 3의 비율로 샘플링을 할 수 있다. 이를 stratified partitioning 이라고 한다. 또는 데이터 분포상에서 특정 카테고리의 데이터 비율이 적을때, 이 카테고리에 대해서 샘플의 비율을 높이는 minority classed oversampling 등의 기법을 이 과정에서 사용한다. 

  • Feature tuning : 머신러닝 피처의 품질을 높이기 위해서 0~1값으로 값을 normalization 시키거나, missing value를 제거 하거나, 아웃라이어등을 제거하는 등의 과정을 수행한다.

  • Representation transformation : 피처를 숫자로 맵핑 시키는 작업을 한다. 카레고리컬 피처를 one hot encoding 등을 통해서 숫자로 맵핑하거나, 텍스트를 embedding 을 통해서 숫자로 변환하는 작업등을 수행한다. 

  • Feature extraction : PCA와 같은 차원 감소 기법을 이용하여, 전체 피처의 수를 줄이는 작업을 수행하거나, 피처를 해시값으로 변환하여, 더 효율적인 피쳐를 사용하는 작업을 한다. . 

  • Feature selection : 여러개의 피처(컬럼)중에 머신러닝에 사용할 피처만을 선별한다. 

  • Feature construction : 기존의 피처를 기반으로 polynomial expansion 이나,  feature crossing 등의 기법을 이용하여 새로운 피처를 만들어낸다. 

데이터 전처리 단위

Instance level transformation & Full pass transformation

데이터 전처리를 할때 어떤 단위로 데이터를 전처리 할지에 대한 정의이다. 예를 들어 숫자 데이터의 값을 0~1 사이로 맵핑하고자 하면, 그 데이터의 최소/최대 값을 알아야 0~1사이로 맵핑할 수가 있는데, 최소/최대값을 추출하려면, 전체 데이터에 대한 스캔이 필요하다. 반대로 NULL 값을 0으로 변환하는 작업은 전체 데이터에 대한 스캔이 필요없고 개별 데이터만 변환하면 된다. 앞에 설명한 전체 데이터에 대한 스캔이 필요한 방식을 full pass transformation 이라고 하고, 전체 데이터를 볼 필요 없이 개별 데이터에 대해 변환하는 작업을 instance level transformation이라고 한다. 


Window aggregation

전체 데이터의 볼륨이 클 경우 이를 윈도우 단위로 잘라서 처리할 수 있는 방법이 있는데, 예를 들어 10분 단위로 데이터를 처리해서, 10분 단위로 최소/최대 값을 구하거나 또는 10분 단위로 어떤 값의 평균값을 대표값으로 사용하는 것들이 이에 해당한다. 

일반적으로 입력값은 (entity, timestamp, value) 형태가 되며, 전처리된 출력 값은 다음과 같이. (entity, time_index, aggregated_value_over_time_window) 엔터티(피쳐)에 대해서 윈도우별로 처리된 값을 저장하는 형태가 된다.  보통 이런 window aggregation 방식은 리얼 타임 스트리밍 데이터에서 시간 윈도우 단위로 데이터를 처리하는 경우에 많이 사용이 되며, Apache Beam과 같은 스트리밍 프레임워크를 이용하여 구현한다. 

구글 클라우드에서 데이터 전처리 방식

이러한 데이터 전처리는 다양한 컴포넌트를 이용해서 처리할 수 있는데, 어떤 방식이 있는지 살펴보기 전에 먼저 구글 클라우드 기반의 머신러닝 학습 파이프라인 아키텍처를 살펴보자.  아래는 일반적인 구글 클라우드 기반의 머신러닝 파이프라인 아키텍처이다. 


<그림. 구글 클라우드 플랫폼 기반의 일반적인 머신러닝 학습 파이프라인 아키텍처 >


  1. 원본 데이터는 빅쿼리에 저장된다. (테이블 형태의 데이터가 아닌 이미지나 텍스트등은 클라우드 스토리지(GCS)에 저장된다.)

  2. 저장된 원본 데이터는 Dataflow를 이용해서 머신러닝 학습에 알맞은 형태로 전처리 된다. 학습/평가/테스트 셋으로 나누는 것을 포함해서, 가능하면 텐서플로우 파일형태인 *.tfrecord 형태로 인코딩 된후에, GCS 에 저장된다. 

  3. 텐서플로우등으로 모델을 개발한 후에, trainer-package로 패키징을 하고, AI Platform 트레이닝에 이 모델을 업로드 한다. 업로드된 모델을 앞서 전처리된 데이터를 이용해서 학습이되고, 학습이 된 모델은 GCS에 저장된다. (텐서플로우에서 SavedModel로 저장한다.)

  4. GCS 에 저장된 모델은 AI Plaform 서빙 엔진에 배포되고 REST API를 이용하여 서빙된다.

  5. 클라이언트에서는 이 REST API를 이용하여 학습된 모델에 대한 서빙을 이용한다.

  6. 전체 워크플로우에 대한 파이프라인 관리는 Apache Airflow 매니지드 서비스인 Composer 를 이용한다. 또는 머신러닝에 특화된 파이프라인이기 때문에, AI Platform pipeline을 사용하는 것이 좋다.

Option A: 빅쿼리에서 데이터 전처리

일반적으로 빅쿼리를 이용한 전처리는 다음과 같은 시나리오에 유용하다.

  • Sampling : 데이터에서 랜덤하게 일부 데이터셋만 가지고 오는 용도

  • Filtering : 학습에 필요한 데이터만 WHERE 문을 이용해서 가지고 오는 용도

  • Partitioning : 데이터를 학습/평가/테스트 용도로 나누는 용도

주로 빅쿼리는 Dataflow로 데이터를 인입하기 전체 최초 전처리 용도로 사용이 되는데, 주의할점은 빅쿼리에 전처리 로직이 많을 경우 향후 서빙에서 재 구현이 필요할 수 있다. 무슨 이야기인가 하면, 서빙시에도 입력 데이터에 대한 동일한 전처리가 필요한데, 빅쿼리에서 SQL로 작성한 전처리 로직은 서빙시에는 사용할 수 없기 때문에, 자바나 파이썬으로 전처리 로직을 다시 구현해야 하는 이중작업이 될 수 있다. 물론 서빙이 빅쿼리에 있는 데이터를 사용하는 배치 서빙일 경우 문제가 없지만, 리얼타임으로 단건의 데이터에 대해서 서빙을 하는 경우에는 빅쿼리에서 서빙용 데이터를 전처리할 수 없다. 


그럼에도 불구하고 배치 서빙용인 경우 전처리를 빅쿼리를 이용할 경우 편리하고 특히 Dataflow 에 데이터를 입력하기전에 Full pass transformation 이 필요한 전체 통계 데이터 (예를 들어 평균,분산,최소/최대값)은 SQL을 통해서 쉽게 뽑아낼 수 있는 장점이 있다. 

Option B: Dataflow 에서 데이터 전처리

복잡한 데이터 변환 로직이 있는 경우등에 효율적으로 사용할 수 있는 방식인데, Instance level transformation 뿐만 아니라, full pass transformation, 그리고 window aggregation 타입 모두를 지원할 수 있다.

Dataflow는 Apache Beam 오픈소스 기반의 런타임이지만, 다양한 구현 방식을 지원하고 있다.

  • Apache Beam을 사용하는 방법 : 가장 일반적인 방식으로 Apache Beam Java/Python SDK 을 이용하여 데이터 변환 로직을 구현할 수 있다.  

  • Tensorflow Transformation 을 사용하는 방법 : 텐서플로우의 경우 Tensorflow Transformation (이하 TFT) 이라는 이름으로 데이터 변환 프레임워크를 제공한다. TFT는 Apache Beam 기반으로 동작하는데, 텐서플로우 코드를 기반으로 하기 때문에, 머신러닝 개발자 입장에서는 접근이 상대적으로 쉬운 장점이 있다. 

  • Dataflow SQL을 사용하는 방법 : 앞의 두 방식의 경우에는 Java나 Python 기반의 코딩이 필요한데, 이런 코딩 없이 Window aggregation이나, 기타 복잡한 로직을 구현하고자 할때 사용할 수 있는 방식이 Dataflow SQL이다.SQL을 사용하여 구현하지만, Dataflow의 함수등을 사용할 수 있는 장점이 있다. 

  • Dataflow Template + UDF를 사용 하는 방법 : 복잡한 변환이 아니라 단순한 맵핑이나 문자열 변환들을 어렵지 않게 구현하는 방식으로 Dataflow는 Pre-built in 된 Template을 제공한다. 이 템플릿 중에는 비즈니스 로직을 자바스크립트로 넣을 수 있는 UDF 라는 방식을 지원하는데, Apache Beam 형태로 구현할 필요 없이 단순한 변환 로직을 자바스크립트로 구현하여 GCS에 파일을 저장하고, 설정 정보에서 자바 스크립트 파일만 지정하면되기 때문에, 쉽게 사용할 수 있다. 


서빙시에도 다양한 아키텍처 구현이 가능한데, Pub/Sub 큐를 통해서 데이터를 실시간으로 인입한 데이터를 머신러닝 모델로 서빙한후에, Pub/Sub으로 내보내는 near realtime 서빙이 가능하고 또는 bigtable에 서빙 결과를 저장하여 마치 serving 결과에 대한 캐쉬식으로 사용하는 구조도 가능하다.




<그림. 스트림 데이터를 이용하여 서빙을 제공하는 아키텍처>

Option C: Tensorflow 모델 내에서 데이터 전처리

아니면 데이터 전처리를 Tensorflow 모델 코드내에서 하는 방식이 있다.

  • feature_column 를 이용하여 피처를 임베딩하거나, 버킷화 하는 방식이 있고

  • 아니면 데이터를 피딩하는  input functions(train_input_fn, eval_input_fn, and serving_input_fn) 안에 데이터 전처리 로직을 구현하는 방법이 있다. 

  • Custom estimator를 사용하는 경우에는 model_fn 자체에 데이터 전처리 로직을 넣을 수 있다. 

이렇게 텐서 플로우 코드단에 전처리 기능을 넣는 경우는 Instance level transformation은 가능하지만 다른 방식에 대해서는 불가능하다. 그렇지만 이미지 데이터를 학습전에 rotation하거나 flip 하는 argumentation 등은 텐서플로우 코드에서 하게 되면 동적으로 데이터를 학습 단계에 argumentation할 수 있기 때문에 효율이 좋은 장점이 있다. 

Option D: DataPrep을 이용한 데이터  전처리

구글 클라우드 플랫폼에서는 데이터의 특성을 분석하고 간단한 변환을 지원하기 위한 wrangling 도구로 DataPrep을 제공한다. Engineered feature 단계까지 데이터를 가공하는 것은 어려울 수 있겠지만, Raw data를 Prepared data 형태로 cleansing 하는 용도로는 충분히 사용할 수 있으며, 특히 시각화를 통한 데이터 분포나 아웃라이어 분석이나 단순 변환등에는 효과적으로 사용할 수 있다.


<그림 DataPrep 을 이용한 Wrangling 과정 예시> 

Option E: DataProc을 이용한 데이터 전처리

DataProc은 Hadoop/Spark 에 대한 구글 매니지드 서비스이다. Apache Beam을 사용하는 Dataflow와 같이 코딩을 기반으로 한다는 점은 같지만, 기존에 Hadoop/Spark 에코 시스템에 익숙한 사용자들의 경우에는 기존의 에코 시스템과 개발 코드를 재활용할 수 있다는 장점을 가지고 있다. 

데이터 전처리시 고려할점

그러면 이러한 기술을 이용해서 데이터를 전처리할때, 고려해야하는 점은 무엇이 있을까?

학습/서빙 데이터에 대한 스큐(skew)

모델을 학습하여, 서비스에 배포한후에, 향후 들어오는 데이터로 서빙을 하게 되는데, 이때 학습에서 사용한 데이터와 서빙시 사용한 데이터의 특성이 다를때 이를 training-serving skew 라고 한다. 

예를 들어 피처 A가 학습시에 범위가 1~255 였는데, 서빙시에 1~500 사이로 들어오게 되면 이 모델의 서빙 결과는 정확하지 못하게 된다.

(참고 : 이런 문제를 해결하기 위해서 데이터의 분포나, 수학적 통계값을 저장해 놓은 후에, 서빙전에 검증하는 방식을 사용할 수 있으며 이는 Tensorflow data validation으로 구현이 가능하다. )

Full pass transformation

Option C의 텐서플로우 모델내의 데이터 변환 로직은 Full pass transformation을 지원하지 않기 때문에, feature scaling이나, normalization 적용이 불가능하다. 이러한 전처리 기법은 최소/최대값등의 통계 데이터가 필요한데, 이러한 데이터는 모델 학습전에 계산되어야 하고, 계산된 데이터는 어디에든 저장되어 있어야 하며, 학습과/서빙 단계에 모두 일관되게 사용될 수 있어야 한다. 

성능 향상을 위한 Up front data loading 

Option C 텐서플로우 모델내에 데이터 변환 로직을 구현할때, 고려해야 하는 사항이다.

모델 코드 상에 데이터 전처리 로직이 있을 경우, 아래 그림과 같이 데이터 변환 작업이 끝나면, 그 데이터로 모델을 학습 시키는 구조가 된다. 


<그림. 데이터 전처리가 모델 학습전에 발생하여, 대기하는 현상>


이 경우에 데이터가 전처리되고 있는 동안에는 학습이 이루어지지 않기 때문에 자원이 낭비되는 문제가 발생하고, 모델의 학습 시간에 전처리 시간까지 포함되기 때문에 전체 학습시간이 상대적으로 오래걸린다. 


Option B의 데이터 플로우를 사용하는 것처럼 미리 여러 학습에 사용될 데이터를 전처리를 해놓거나 아니면 아래 그림과 같이 병렬적으로 데이터 플로우에서 데이터를 전처리하면서 모델은 학습에만 전념하도록 하면, 모델의 전체학습 시간을 줄일 수 있다. 


<그림. 병렬로 데이타 전처리를 해서 모델 학습을 최적화 하는 방식>

이를 up front data loading 이라고 하는데, 텐서플로우에서는 Prefetching, Interleave, Parallel mapping 등을 tf.data.DataSet에서 다양한 방식으로 이를 지원하고 있다. 


Tensorflow Transform

텐서플로우 프레임웍은 이러한 데이터 변환을 위해서 Tensorflow Transform (이하 TFT) 라는 프레임웍을 데이터 전처리 기능을 제공한다. 이 TFT를 구글 클라우드에서 실행하게 되면, Dataflow를 기반으로 실행할 수 있다. (Option B) 

tf.Transform 이라는 패키지로 제공된다. TFT는 instant level transformation 뿐만 아니라, full pass transformation, window aggregation 을 지원하는데, 특히 full pass transformation을 지원하기 위해서 데이터를 변환하기 전에 Analyze 라는 단계를 거치게 된다. 

아래 그림이 TFT가 작동하는 전반적인 구조를 기술한것인데,



Analyze 단계에서는 데이터의 통계적인 특성 (최소,최대,평균 값등)을 추출하고, Transform 단계에서는 이 값을 이용하여, 데이터 변환을 수행한다. 각 단계는 tft_beam.AnalyzeDataset , tft_beam.TransformDataset 로 실행될 수 있으며, 이 두 단계를 tft_beam.AnalyzeAndTransformDataset 로 합쳐서 한번에 실행하는 것도 가능하다. 


  • Analyze 단계 : Analyze 단계에서는 통계적인 값을 Full pass operation 을 통해서 계산해내는 것이외에도, transform_fn을 생성해내는 작업을 한다. transform_fn은 텐서플로우 그래프로, 데이터 변환에 대한 instance level operation 을 계산해낸 통계값을 사용해서 수행한다. 

  • Transform 단계 : 데이터 변환 단계에서는 transform fn을 인입 데이터에 적용하여, instance level로 데이터를 변환하는 작업을 수행한다. 


모델 학습시 데이터에 대한 전처리는 학습 데이터뿐만 아니라, 평가 (Eval) 데이터에도 동일하게 적용이 되어야 하는데, Analyze는 학습데이터에만 적용되서 데이터의 특성을 추출하고, 평가 데이터에는 별도로 Analyze를 수행하지 않고, 학습 데이터에서 추출된 데이터 특성을 그대로 사용한다

TFT pipeline export  

transform_fn으로 구성된 데이터 변환 파이프라인은 내부적으로 텐서 플로우 그래프로 변환이 되는데, 학습된 텐서플로우 모델을 export 하여 SavedModel로 저장할때, 이 transform_fn 그래프가  서빙용 데이터 입력함수인 serving_input_fn에 붙어서 같이 export 된다. 이 말은, 학습에서 사용한 데이터 전처리 로직인 transform_fn이 그대로 서빙단에도 같이 적용된다는 이야기이다. 물론 full-pass transformation에서 계산한 통계값도 상수형태로 저장하게 된다. 그래서 입력값에 대해서 학습과 서빙시 같은 변환 로직을 사용할 수 있게 된다.

데이터 전처리 옵션 정리

앞서 설명한 데이터 변환 전처리 옵션을 Instance level transformation, full pass level transformation, window aggregation 에 따라 정리해보면 다음과 같다. 


Disclaimer

본 글의 작성자는 Google 직원입니다. 그러나 본 글의 내용은 개인의 입장에서 작성된 글이며, Google의 입장을 대변하지 않으며, Google이 본 컨텐츠를 보장하지 않습니다.


References






Instance-level transformation

(stateless transformation)

Full pass during training

instance -level during serving

(stateful transformation)

Real-time (window) aggregations

during training and serving 

(streaming transformation)

배치 서빙

온라인 서빙

배치 서빙

온라인 서빙

배치 서빙

온라인 서빙

BigQuery (SQL)

OK

같은 데이터 변환 로직을 학습과 서빙 단계에 적용 가능

가능은 하지만 권장하지 않음


서빙시에는 BigQuery가 아니라 다른 방식으로 데이터 변환 로직을 구현해야 하기 때문에 결과적으로 학습/서빙 Skew를 유발할 수 있음

가능


BigQuery에서 수학적 통계값(최소/최대)를 계산하여, 이 값을 이용하면 가능하다.

그러나 계산된 값을 별도로 저장해서 학습/서빙시에 사용해야 하기 때문에 구현이 번거롭다.

N/A

가능은 하지만 권장하지 않음


BigQuery의 윈도우 함수등을 이용하여 구현은 가능하지만, 서빙시에는 BigQuery가 아닌 다른 툴로 구현을 해야 하기 때문에 학습/서빙 Skew가 발생할 수 있음

Dataflow (Apache Beam)

OK

서빙시 데이터가 Pub/sub을 통해서 데이터 블로우로 들어오면 가능하지만, 그렇지 않은 경우 학습/서빙 데이터간 Skew가 발생할 수 있음

가능


Dataflow에서 수학적 통계값(최소/최대)를 계산하여, 이 값을 이용하면 가능하다.

그러나 계산된 값을 별도로 저장해서 학습/서빙시에 사용해야 하기 때문에 구현이 번거롭다.

OK


동일한 Apache Beam 기반의 데이터 변환 로직이 학습을 서빙시 적용이 가능함

Dataflow (Apache Beam + TFT)

권장함


학습과 서빙의 Skew를 방지할 수 있고, 학습/서빙전 데이터를 미리 준비할 수 있음

권장함


데이터 변환 로직과, 모델 학습시에 계산된 통계 결과 텐서플로우 그래프 형태로 저장되서, 서빙 모델을 export할시에 같이 저장됨

Tensorflow
(input_fn & serving_input_fn)

가능은 하지만 권장하지 않음


학습과 서빙 효율성을 생각하면, 학습전에 데이터를 변환하는게 좋음

가능은 하지만 권장하지 않음


학습과 서빙 효율성을 생각하면, 학습전에 데이터를 변환하는게 좋음

불가능

불가능


본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요

Data mesh

조대협 (http://bcho.tistory.com)


Data mesh는 빅데이터 분석 시스템의 아키텍쳐 스타일로, 마이크로 서비스 아키텍처 (이하 MSA)컨셉과 유사하게 데이터 분석 시스템을 각각의 분산된 서비스 형태로 개발 관리하는 아키텍쳐 모델이다. 

이번 글에서는 차세대 데이터 분석 시스템 아키텍처인 Data mesh에 대해서 알아본다. 

데이터 분석 시스템의 역사

Data mesh에 대해서 이해하려면 기존의 데이터 분석 시스템의 아키텍처와 그 역사에 대해서 이해하라 필요가 있다.데이터 분석 시스템은, DataWare house를 거쳐 현재는 Data Lake 형태가 주류를 이루고 있으며, 차세대로는 Data Mesh가 각광 받고 있다. 각각 아키텍처 스타일을 보면 다음과 같다.

Data warehouse

Data Warehouse는 전통적인 RDBMS 형태에서 데이터를 모아서 분석하는 아키텍처로 파일이나 데이터 베이스 (OLTP)시스템에 저장된 데이터를 일반적으로 ETL이나 CDC 방식으로 Data Warehouse 로 수집한 후에, Data Warehouse에서 데이터를 저장하고 분석하는 방식이다. 


각 비즈니스 부서에 따라서 데이터 분석에 대한 요구 사항이 많을 경우에 Data warehouse 에서 그 부서에만 필요한 데이터를 Data Mart라는 형태의 별도의 분석용 데이터 베이스에 저장하고 비즈니스 부서는 그 Data Mart 만 사용하는 구조를 사용하는 경우도 있다.


<그림. Data Warehouse의 일반적인 아키텍처>


이 구조는 전통적인 RDBMS 를 활용하는 아키텍처이기 때문에, 테이블처럼 구조화된 데이터 (structure data)를 처리하는데 유리하다. 통상적으로 상용 벤더에서 제공되는 솔루션을 기반으로 구축이 되는데, 

이러한 Data Warehouse는 RDBMS의 특성으로 인하여 빅데이터에 대해서 횡적인 스케일에 한계가 있고, 상용 소프트웨어와 이를 지원하기 위한 인증된 하드웨어를 사용해야하기 때문에 인프라 비용이 높다는 단점을 가지고 있다. 

Data lake

데이터의 볼륨이 늘어나고 다양화되어감에 따라 빅데이터 분석의 요구 사항이 발생하였고, 이러한 문제를 해결하기 위한 아키텍처 구조가 Data Lake 이다. 기존의 Data Warehouse가 테이블 형태의 정형 데이터 (structured data)를 지원했다면, Data Lake는 데이터 형식에 제한이 없이 텍스트나, 이미지등의 비정형 데이터 (unstructured data)에 대한 저장과 분석을 지원하며, JSON과 같은 반정형 데이터 (semi-structured data)까지 지원하는 특성을 가지고 있다.


데이터 처리 측면에서는 Data Warehouse가 기존의 RDBMS등의 소스로 부터 배치로 데이터를 주기적으로 적재하여 처리 및 분석 했다면, Data Lake 기반의 분석 시스템의 특징은 로그 스트림이나 모바일 앱 이벤트로그와 같은 실시간 스트리밍성 데이터에 대한 실시간 처리가 가능하다는 강점을 가지고 있다. 


이렇게 처리된 데이터는 결과 데이터 저장소에 저장이 되서 직접 분석이 되거나 (원본 데이터를 전처리 과정을 끝난 후에, 데이터 분석가들이 Hive 등의 쿼리를 이용해서 분석하는 시나리오를 예를 들 수 있다.) 또는 정형 데이터의 경우에는 기존의 Data Warehouse나 Data Mart로 복사되어 비즈니스 사용자가 좀 더 편리하게 분석할 수 있도록 서비스를 제공한다.



<그림. 일반적인 Data Lake 시스템 아키텍처 예시>


이러한 Data Lake 시스템은 일반적으로 Hadoop/Spark 기반으로 구축되며, Data Lake의 저장소로는 HDFS (Hadoop File System)을 사용하고, 분석 엔진으로는 Hadoop 이나 Spark 을 사용하며, 실시간 스트리밍 처리는 Kafka 와 같은 대용량 큐를 사용하고, 뒷단에 처리 시스템으로 Spark Streaming 등을 사용하는 것이 일반적인 아키텍처 구조이다. 

기존 아키텍처의 문제점

Data Lake나, Data Warehouse 아키텍처 시스템은 하나의 중앙 집중화된 시스템에 데이터를 모으고 분석하는 형태이고, 데이터를 분석하는 주체가 중앙 집중화된 데이터 분석 팀이라는 특징을 가지고 있다. 

한군데 데이터를 모두 모아서 한 조직이 분석한다는 개념은 이론적으로 봤을때는 완벽한 개념으로 보이지만 실무적으로 봤을때 문제가 있는 아키텍처 구조이다.

도메인 지식의 부족

데이터를 중앙에 모아놓고, 데이터 분석팀이 데이터 분석을 진행할때, 이 데이터 분석가들은 데이터 분석 업무 자체에는 전문성을 가질 수 있으나, 데이터의 특성을 이해하기 위한 도메인 지식이 부족하다. 예를 들어 영업/마케팅/회계등. 도메인 지식이 부족한 상태에서는 데이터에 대한 인사이트를 뽑아내기 어렵다. 그래서 현업팀 (각 도메인별)과 커뮤니케이션을 하면서 요구사항 기반으로 도메인의 지식을 습득하여 데이터를 분석하는데, 이로 인해서 하나의 분석팀이 여러 현업팀을 상대해야 하기 때문에, 커뮤니케이션의 지속성이 떨어지고 이로 인해서 도메인에 대한 이해도가 떨어지기 때문에, 결과적으로 신속하고 깊은 수준이 데이터 분석이 어려워 진다.


<그림. 하나의 데이터 분석팀이 여러 현업 부서와 커뮤니케이션 하는 모델>


여기에 더해서 현업팀과 데이터 분석팀은 별도의 부서이기 때문에, 부서간의 커뮤니케이션이 필요한 만큼 서로간의 업무를 이해하기 어려워지게 된다. 특히나 다른 부서는 다른 골을 가지고 있기 때문에, 새로운 데이터 분석 시스템을 올린다고 했을때 쉽게 성공하지 못하는 이유이다. 예를 들어 회사에서 차세대 데이터 분석 시스템을 만들겠다고 데이터 분석팀이 과제를 시작한다고 했을 때, 이 시스템들은 각 현업 부서로 부터 데이터도 수집해와야 하고, 요구 사항을 수집도 해야 하지만, 협업 부서 (예를 들어 영업팀)는 해당 부서의 골(매출 향상)에 가장 최우선 목적을 두는 만큼 기대했던것 만큼 충분한 성과를 이루어내기가 어렵다. 

단일화된 기술 체계

중앙 집중화된 단일 데이타 분석 시스템의 경우에는 단일 시스템이기 때문에 단일화된 분석 기술 솔루션을 사용한다. 그러나 데이터나 도메인의 특성에 따라서 유용한 솔루션이 다른 경우가 많다. 예를 들어 디지털 마케팅의 경우 Adobe 등과 같이 디지털 마케팅에 최적화된 플랫폼등이 있을 수 있는데, 중앙 집중화된 데이터 분석 플랫폼은 이런 다양한 기술 체계를 수용하기가 어렵다. 

예산 및 인력 부족 

데이터 분석팀은 전통적으로 이윤을 남기는 영업 조직이나 마케팅 조직이 아닌 연구성 조직에 가깝기 때문에, 이윤 조직(profit center) 보다는 비용만 쓰는 비용 조직 (cost center)으로 인식 되는 경우가 많다. 데이터 분석으로 인한 수익에 대한 기여 부분을 수치화 하기가 어렵기 때문인데, 독립적으로 수익을 내지 못하기 때문에, 회사내의 투자된 비용에 따라 조직을 운영하는 경우가 많다. 특정 도메인(부서)를 위한 데이터 분석 시스템을 만들기 위해서, 그 부서로 부터 자금을 투자 받아 시스템등을 운영하는 케이스가 있는데, 이도 결과적으로 외부 투자와 지원에 의존적인 구조이다.

이렇다 보니, 일반적으로 데이터 분석 조직은 필요한 인력과 장비에 대한 투자를 충분히 하기가 어렵고 이로 인해서 인력 부족으로 원하는 만큼 데이터 분석을 하기 어려운 경우가 많다. 

실제 필드 상황

이미 실제 필드에서는 이러한 상황을 잘 이해하고 있기 때문에, 중앙 집중화된 데이터 분석 플랫폼이 있음에도 불구하고 각 부서에서 데이터 분석 플랫폼을 따로 만드는 경우가 있다. 예산이 충분하고 데이터에 대한 인사이트가 있는 부서의 경우, 자신의 부서를 위한 데이터 분석 플랫폼을 올리는 경우인데, 

예를 들어 마케팅 팀에서 마케팅 데이터 분석 플랫폼을 새로 만들고, 웹 사이트를 위한 웹 분석 플랫폼, 고객 지원 서비스에 대한 데이터 분석 플랫폼들이 따로 생기는 경우이다. 


Data Mesh

이러한 문제를 해결 하기 위한 데이터 분석 시스템 아키텍처가 Data Mesh 이다. 

기존 데이터 분석 플랫폼이 아래와 같이 모든 도메인에 대해서 단일 시스템과 단일 분석팀을 사용하였다. 이를 Monolithic (모노리틱) 구조라고 한다. 


<그림. Monolithic data analytics platform architecture > 


아래와 같이 도메인(업무) 별로 시스템과 팀을 분리하는 구조를 Data Mesh 아키텍처라고 한다. 데이터 분석팀과 분석 시스템이 각 업무 별로 할당되어 있는 Distributed 구조가 된다. 


<그림. Distributed data analytics platform architecture>


핵심은 부서별로 독립된 시스템과 팀을 보유하고, 데이터 생성자와 소비자 (현업) 역시 한 팀에 묶어서 요구 사항에 대한 반영을 빠르게 하고, 독립된 예산과 팀으로 움직여서 비즈니스 여건에 맞는 시스템을 빠르게 개발할 수 있다는 장점이 있으며, 해당 도메인에 적합한 기술을 사용함으로써, 기술적인 최적화가 가능하다는 장점을 가지고 있다. 

이 아키텍처 구조는 애플리케이션 아키텍처인 마이크로 서비스 아키텍처와 같은 철학과 특징을 가지고 있다. 마이크로 서비스 아키텍처로 업무 단위로 서비스를 나누고 각 팀안에서 기획에서 부터 개발/운영을 모두 담당하게 함으로써 속도를 높이는 아키텍처 라고 하면, Data Mesh도 데이터 도메인별로 팀과 시스템을 나누는 방식으로 해서 해당 데이터에 대한 이해도와 속도를 높이는 장점을 제공하는 것이다. 


Data Mesh는 기동성을 높인다는 의미에서는 장점이 있으나 반대로 단점도 있다.  다음은 몇몇 단점과 함께 Data Mesh 시스템이 가지고 있어야 하는 기능에 대해서 설명한다. 

타부서간의 데이터 조회 지원

특히 다른 부서간에 데이터를 억세스 하고자 할때 이런 단점이 있다. 예를 들어 아래 그림과 같이 마케팅 팀이 세일즈 팀의 데이터를 접근하고자 할때, 전혀 다른 시스템이기 때문에 추가적인 계정 생성과 접근 권한을 받아야 하는 문제가 필요하고, 특히 마케팅 데이터 분석 시스템과 영업 데이터 분석 시스템의 분석 도구나 UI 등이 달라서 타 부서 데이터를 접근하는 것이 어려울 수 있다.  

 

<그림. 타 부서의 데이터를 조회 해야하는 요구 사항>


이런 문제를 해결하기 위해서는 데이터 분석 도구를 통일하는 방법이 있는데, 아래 그림과 같이 분석 시스템 앞단에 분석용 UI (시각화나 쿼리 인터페이스)를 통합하여, 같은 인터페이스로 여러 데이터를 쿼리 하도록 하고, 데이터에 대한 접근 통제도 분석용 UI단에서 하는 방식이다. 


<그림. 여러 부서의 데이터를 통합된 분석용 UI로 조회하는 구조>


이런 UI는 멀티 백앤드를 지원하는 타블루, Looker 등을 사용하여 이기종 데이터 분석단에도 통합된 경험을 제공할 수 있다. 유사한 오픈소스로는 Hue 등이 있다.

타부서 데이터에 대한 통합 데이터 분석

이렇게 다른 부서의 데이터를 조회하게 하도록 지원하더라도, 다른 부서 데이터를 참고해서 (JOIN)해서 데이터를 분석하고자 하는 요건이 있을 수 있다. 예를 들어 마케팅 캠페인을 한 사용자 목록과 세일즈 데이터를 JOIN 해서, 마케팅이 실제 판매에 어떤 영향을 주었는지등을 분석하는 시나리오이다. 

 

<그림. 타 부서의 데이터를 JOIN하여 분석하는 페더레이션 시나리오>


이 시나리오는 각각 독립적인 두개의 이기종 데이터 분석 시스템간의 Federation을 요구로 한다. 기존에는 이런 시나리오를 ETL등을 이용해서, 특정 테이블만 상대쪽에 복사해놓고 하는 방법을 사용하였다. 지금도 유효한 방법이지만, 플랫폼이 지원해준다면, 별도로 데이터를 복사하지 않고 문제를 풀어나갈 수 있다. 


예를 들어 구글의 BigQuery의 경우 특정 데이터셋(테이블의 집합)을 타 부서의 프로젝트로 공유를 해줄 수 있다.  이 경우 별도의 ETL 작업이 불필요 하며, 이 기종 분석 시스템에 대해서도 구글의 MySQL/PostgreSQL 매니지드 서비스인 CloudSQL에 저장되어 있는 데이터나 구글의 NoSQL인 BigTable에 있는 데이터를 쿼리할 수 있다. (이를 Federation 이라고 한다. )

이 보다 핵심 기능은 GCS (Google Cloud Storage)에 있는 파일을 직접 쿼리할 수 있는데, Parquet 과 같은 파일 포맷을 지원한다. Parquet은 Hive 등에서 데이터 저장 파일포맷으로 사용되는데, 정리해서 이야기 하면 별도의 연동 ETL이 없이 Hadoop eco 시스템으로 구축되어 있는 데이터를 조회하여 통합 (JOIN)분석을 할 수 있다는 이야기가 된다. 


이렇게 서로 다른 시스템간의 데이터를 서로 상호 조회할 수 있는 기능을 Federation이라고 하고, Data Mesh에서 매우 중요한 항목으로 취급된다. 

데이터 카탈로그 서비스 

이렇게 조직간의 데이터를 서로 크로스로 조회하고, 연관 분석을 할 수 있게 되면 다음 문제는 여러 부서간의 방대한 데이터에 대해서 어디에 어떤 데이터가 있는지를 찾을 수 있어야 한다. 데이터 거버넌스 측면에서 데이터 검색 및 메타 데이터 관리 기능에 대한 컴포넌트가 반드시 필요하다. 

필요한 데이터를 사용자가 찾고 쉽게 액세스할 수 있어야 하며, 여기에 더불어 사용자에 따라서 데이터 접근 권한을 관리할 수 있는 기능이 필요하다. 

또한 보안 관점에서 데이터에 대한 액세스 히스토리를 통해서 누가 언제 어떤 데이터를 조회하였는지 확인할 수 있어야 한다. 

이러한 메터데이터에 대한 관리를 할 수 있는 소프트웨어로는 오픈소스에 Apache Atlas와 상용 솔루션으로는  Colibra 등이 있고, 구글 클라우드에서는 Data Catalog라는 서비스로 구글 클라우드에 저장되는 데이터 (빅쿼리, GCS, Pub/Sub 메시징 큐)에 대한 메타 데이터 저장 검색 및 정책에 따른 접근 관리 기능을 제공한다. 

실시간 스트리밍 데이터

현대 빅데이터 시스템의 특징 중의 하나는, 정형,비정형의 데이터를 실시간 형태로 처리하는 스트리밍 데이터 처리가 추가된다는데 있다. 예를 들어 웹 접속 로그를 실시간으로 수집하여 분석하거나, 매장의 제품 판매 내용을 실시간으로 수집해서 분석하는 것과 같은 유스 케이스인데, 이러한 실시간 데이터 처리는 대용량 메시지 큐를 사용한다. 


<그림. 실시간 스트리밍 데이터 처리 아키텍처>


이 메세지 큐의 특징은 1:1 메시지 딜리버리뿐만 아니라 1:N 메시지 딜리버리를 지원해야 한다는 것인데, 

실시간 메시지 큐는 데이터를 저장하는 데이터 베이스 성격이 아니지만, 데이터를 다룬다는 점에서 데이터 엣셋으로 분류되어서 데이터 카달로그에 등록되어서 관리되어야 한다. 

Devops

Data Mesh 시스템도 마이크로 서비스와 유사하게 Devops의 개념을 도입하는 것이 좋은데, 이유는 속도 중심의 아키텍처 스타일로 각 도메인에 대한 데이터 분석을 각 팀이 수행하기 때문인데, 여기에 빠른 속도를 더하기 위해서는 운영과 개발을 함께 하는 구조가 되는 것이 좋다. 

단순하게 개발과 운영을 그팀에서 한다는 개념으로 소화를 하면 안되고, 제대로된 Devops를 하기 위해서는 데이터 분석 시스템이 플랫폼화가 되어 있어야 한다.

예를 들어서 마케팅 데이터 분석 시스템을 개발/운영 하는 팀이 있다고 할때, 이 시스템을 Hadoop으로 개발한다고 하자. 마케팅 데이터 분석 팀은 필요한 하드웨어 구매에서 부터, Hadoop 설치, 데이터 카탈로그, 분석 로직 개발, 시각화든 인프라에서 부터 툴 셋업 및 그위에 분석 업무까지 모두 개발해야 하는데, 이는 시간이 많이 걸리는 작업이고, 타 부서의 분석팀도 동일한 작업을 계속해야 한다. 

그래서 플랫폼의 필요성이 대두되는데, 분석가들은 분석 업무와 비즈니스 로직을 구현하는데만 집중하고, 하부에 인프라와 솔루션은 플랫폼 형태로 제공되서 Self Service 형태로 분석가들이 인프라를 구성하고 사용할 수 있는 구조가 되어야 한다.


이 개념 아키텍처를 도식화 한것이 아래 그림이다. 



< 그림. 데이터 플랫폼 아키텍처와 Devops 팀의 역할 관계 개념도 >


특히 이 공통 플랫폼을 개발하고 운영 하는 팀이 Devops 팀이고, 이 팀의 역할은 플랫폼을 개발해서 이를 각 데이터 분석팀이 사용할 수 있는 구조로 해주고 플랫폼을 운영 유지보수 하는 역할을 한다. 


참고 자료


본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요

  1. 루크 2021.01.05 17:58  댓글주소  수정/삭제  댓글쓰기

    깔끔한 정리, 항상 유용하게 잘 보고 있습니다. 감사 합니다.