Table of Contents
Data Engineering의 Builder Pattern : 유연성을위한 기초
이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.
Builder 패턴 이해
근원과 핵심 개념
구조상 패턴은 여러 옵션 부품과 구성 객체의 문제를 해결하기 위해 객체 중심 프로그래밍에서 시작되었습니다. 수많은 매개 변수 또는 모든 조합을 처리하기 위해 클래스를 사용하는 대신 builder] 객체는 각 구성 요소를 설정하는 단계별 방법을 제공합니다. 최종 방법은 전체 객체를 조립합니다. 이러한 분리는 다른 표현에 따라 구조 프로세스 재사용 할 수 있습니다.
Analogy: 주문 피자
맞춤 피자를 주문하고 같은 빌더 패턴을 생각하십시오. 당신은 원유, 소스, 치즈 및 토핑을 한 번에 지정합니다. 피자 빌더 ( 요리사)는 그 재료를 완성 된 피자로 결합하는 방법을 알고 있습니다. 동일한 빌더는 Margherita, Hawaiian 또는 고기 애호가의 파이를 생산할 수 있습니다. 마찬가지로 데이터 파이프라인 빌더는 소스, 변형 및 건축가 방법의 동일한 세트에서 싱크의 다른 조합을 조립 할 수 있습니다.
왜 Data Pipelines가 구성할 수 있는 디자인이 필요합니까?
데이터 파이프라인은 거의 정적이다. S3 버킷에서 CSV 파일을 섭취하고 데이터 창고에로드하는 파이프라인은 JSON, 스트리밍 소스 또는 추가적인 enrichment 단계를 지원해야 할 수 있습니다. 구성 디자인이 없다면, 이러한 변경 사항을 자주 복사하고 복제 및 오류에 대한 대량의 코드를 수정하는 것을 의미합니다.
- Changing source system: 일괄 파일에서 이벤트 스트림 또는 전환 데이터베이스 커넥터로 이동.
- Evolving transform: 데이터 정리, 기능 엔지니어링, 또는 새로운 참조 테이블과 결합.
- 다중 대상: 여러 데이터 저장소에 대한 결과를 작성 (예: BigQuery, Snowflake, 실시간 대시보드) 같은 파이프라인.
- 테스트 및 시효 변형:코드 변경 없이 개발 및 생산 데이터에 대한 동일한 논리를 실행합니다.
Builder 패턴은 엔지니어를 드리기 위해이 요구 사항을 직접적으로 해결합니다 compose 파이프라인 선언적으로 - 그들이 연결하는 구성 요소와 연결하는 방법을 정의하고, 언 변경되지 않는 동안.
구성 가능한 Data Pipeline의 핵심 구성 요소
Builder 패턴을 적용하려면 데이터 파이프라인은 분리, 구성 가능한 빌딩 블록으로 끊어야 합니다.
데이터 소스
모든 파이프라인은 하나 이상의 소스로 시작: 파일 시스템, 데이터베이스, 스트리밍 플랫폼 (Kafka), APIs, 또는 데이터 호수. 각 소스는 자체 구성 (path, credentials, schema, polling interval). 빌더는 같은 방법을 제공 할 수 있습니다 , ], 또는 .
변환 단계
Transformations 조작 또는 enrich 데이터. 일반적인 예제는 필터링 행, 파싱 배열된 JSON, 집계 미터 및 데이터 세트에 참여합니다. ], , 과 같은 Builder 메소드는 엔지니어가 유연하게 전환 할 수 있도록합니다.
데이터 싱크
싱크는 처리 된 데이터 토지 : 관계 데이터베이스, 클라우드 스토리지, 메시지 큐, 또는 분석 엔진. 빌더는 과 ]과 같은 데이터를 여러 개의 싱크를 지원할 수 있으며, 여러 목적지에 체인링을 허용한다.
연결관과 Middleware
소스와 싱크를 넘어, 파이프라인은 종종 오류 핸들러, 속도 제한기, 스키마 검증기 및 모니터링 후크가 필요합니다. 이러한 교차 절단 문제는 또는 와 같은 빌더 단계로 쉽게 추가됩니다.
Pipelines용 Builder Pattern 구현
전형적인 구현은 pipeline builder class 을 포함하여 구성 옵션과 ]build() 메소드 을 유효성 검사하고 완전히 건설 파이프 객체를 반환합니다. 빌더는 체인딩을위한 빌더 자체를 반환하는 유창한 방법을 노출합니다.
class PipelineBuilder:
def __init__(self):
self._source = None
self._transformations = []
self._sinks = []
self._retry_policy = None
def with_source(self, source):
self._source = source
return self
def add_transform(self, transform):
self._transformations.append(transform)
return self
def add_sink(self, sink):
self._sinks.append(sink)
return self
def with_retry(self, retry_policy):
self._retry_policy = retry_policy
return self
def build(self):
if not self._source or not self._sinks:
raise ValueError("Source and at least one sink are required")
return Pipeline(self._source, self._transformations, self._sinks, self._retry_policy)
Builder를 사용하여 파이프라인 생성은 선언됩니다.
pipeline = (PipelineBuilder()
.with_source(S3CsvSource(bucket="data-landing", prefix="orders/"))
.add_transform(FilterTransform(condition="status == 'active'"))
.add_transform(AggregateTransform(group_by="customer_id", metrics=["sum(amount)"]))
.add_sink(DatabaseSink(connection="prod_db", table="customer_orders"))
.add_sink(ParquetSink(path="s3://analytics/orders/"))
.with_retry(RetryPolicy(max_attempts=3, backoff_seconds=5))
.build())
이 접근은 구성을 중앙 집중화하고, 그것에게 staging와 생산 환경을 위한 다른 모수를 가진 동일한 건축업자를 재사용하게 쉬운 합니다.
Real-World Application: 유연한 ETL 파이프 라인 구축
여러 지역에서 매일 주문 데이터를 섭취해야 하는 전자 상거래 회사, 깨끗하고 표준화, 카테고리별로 일일 수익 계산, 그리고 보고서 데이터베이스와 데이터 호수에 결과를로드. 빌더 패턴을 사용하여 재사용 가능한 OrderETLBuilder]를 만듭니다.
- Define source configs: 각 지역의 주문은 다른 데이터베이스(PostgreSQL, MySQL)에서 제공하지만, 공유된 CSV 형식으로 내보내기. 빌더는 를 제공합니다.
- 표준 변환 추가: 데이터 정리 (비밀번호, 유효화 코드) 및 enrichment (제품 카탈로그 카테고리를 얻기 위해 조인). 이 추가 및 .
- 설정: .
- 다수로에 의거: ] ]].
- Build and execute:] 동일한 빌더는 테스트에 대한 EU 지역만 읽는 파이프라인을 먼저 구성할 수 있으며, 생산에 대한 모든 영역으로 교체할 수 있습니다.
이 패턴은 극적으로 코드 복제를 감소시킵니다. 이 회사는 이제 지역 또는 환경에 대한 여러 광고 - 텍스트 스크립트 대신 하나의 빌더 클래스를 유지합니다.
혜택 Recap
- Flexibility: 의 변경 파이프라인 동작 없이 실행 논리. 새로운 변환을 추가해야? 그냥 호출 새로운 단계.
- Maintainability: Pipeline 정의는 고도의 조리법과 같이 읽습니다. 각 성분의 구성은 격리되고, 디버깅 및 코드 검토를 곧게 만듭니다.
- 재사용성: 빌더는 라이브러리로 포장될 수 있습니다. 팀은 프로젝트 전반에 걸쳐 동일한 빌더를 재사용하여 입력 매개 변수만 조정합니다.
- Scalability: 새로운 구성 요소 유형 추가(예: 스트리밍 싱크)만 전체 파이프라인 어셈블리를 다시 작성하지 않는 빌더를 확장해야 합니다.
- 테스트성: Builders는 조형 소스와 싱크를 가진 테스트 파이프라인을 만들 수 있으며, 파이프라인 조립 논리 자체에 대한 격리된 단위 테스트를 가능하게 합니다.
Data Engineering의 Builder Pattern 사용을위한 모범 사례
Builder Pure 구성 유지
빌더는 수집 및 검증 구성을해야합니다. 실제 파이프라인 실행은 Pipeline] 에 의해 건설 된 객체의 책임이어야합니다. 이 분리는 빌더를 간단하고 테스트 할 수 있습니다.
유효성 조기, 실패 빠른
] 메소드에서 필요한 모든 구성 요소가 존재하고 그 구성이 일관성 (예를 들어, 변환 단계 참조 기존 소스 열)인지 확인. Throw descriptive 오류를 그래서 사용자는 정확히 무엇을 누락.
레버리지 Immutable 빌드
라는 후, 빌더는 다른 설정으로 다른 파이프라인을 만들거나 재사용 될 수 있습니다. 의도하지 않고 빌드를 통해 지속되는 상태를 저장하지 마십시오.
Sensible 기본값 제공
재량 정책 또는 로깅과 같은 옵션 구성 요소에 대해서는, 빌더의 생성자에 대한 감지 가능한 기본을 설정합니다. 이것은 보일러 플레이트를 최소화하면서 여전히 과도하게 허용됩니다.
당신의 빌더를 버전으로 확장하십시오.
데이터 인프라가 진화함에 따라, 빌더의 API도 마찬가지입니다. 태그 빌더는 버전 컨트롤에 릴리스를 설치하여 특정 빌더 버전으로 핀을 낼 수 있으며, 예상치 못한 예기치 않은 전파에서 변화를 방지합니다.
Complex Components에 대한 외부 참조
많은 내부 세부 사항 (예 : 불꽃 세션 구성 또는 사용자 정의 UDF)을 가진 구성 요소에 대해서는 파이프 라인 빌더 내부를 구축하는 것보다 미리 만들어진 객체로 전달해야합니다. [[FLT : 0]]Refactoring.Guru의 Builder Pattern description[FLT : 1)]는이 분리를 이해하기위한 우수한 기반을 제공합니다.
관련 기사
구조상 패턴은 데이터 엔지니어링 팀이 강력한 적응성이 있는 파이프라인을 만드는 실용적인 방법을 제공합니다. what (configuration) 의 ]how](execution)를 분리하여 기술 부채를 줄이고 비즈니스 요구를 변경할 수 있는 응답을 가속화합니다. 데이터 생태계는 복잡성에서 계속 성장할 수 있습니다. 실시간 흐름, 멀티 클라우드 스토리지, 복잡한 컴퓨터를 통해, 컴퓨터의 구조 및 컴퓨터의 구조가 없는 구조화 없이는 신뢰할 수 있는 도구로 유지됩니다.
구조가 접근하는 것을 고려하면 다음 데이터 파이프라인을 설계할 때. 초기에는 추가 계층과 같은 느낌이 있지만, 유연성과 유지 가능성에 대한 장기적인 이득은 훨씬 더 앞선 비용을 나타낼 수 있습니다. 데이터 엔지니어링의 디자인 패턴에 대한 자세한 내용은 Dributed Systems]의 패턴을 참조하십시오.