변환

Dataflow 파이프라인에서 변환은 데이터를 변환하는 단계 또는 처리 작업을 나타냅니다. 변환은 데이터의 수학 계산, 한 형식에서 다른 형식으로 데이터 변환, 데이터 그룹화, 데이터 읽기 및 쓰기, 원하는 요소만 출력하도록 데이터 필터링, 데이터 요소를 단일 값으로 결합을 포함한 거의 모든 종류의 처리 작업을 수행할 수 있습니다.

Dataflow 모델에서의 변환은 중첩될 수 있습니다. 즉, 변환에 다른 변환을 포함시키고 호출하여 복합 변환을 형성할 수 있습니다.

변환 작동 방식

변환은 파이프라인의 처리 논리를 나타냅니다. 각 변환은 PCollection 한 개(또는 여러 개)를 입력으로 수용하고 입력 PCollection의 요소에서 작업을 수행한 후 새 PCollection 한 개(또는 여러 개)를 출력으로 생성합니다.

자바

변환을 사용하려면 PCollection 입력에서 apply 메소드를 호출하여 처리할 PCollection 입력에 변환을 적용합니다. PCollection.apply를 호출하면 사용할 변환을 인수로 전달합니다. 출력 PCollectionPCollection.apply의 반환 값입니다.

예를 들어, 다음 코드 샘플은 ComputeWordLengths라 하는 맞춤 설정 변환을 PCollection<String>apply하는 방법을 보여줍니다. ComputeWordLengths는 입력 컬렉션에서 각 String 길이를 포함한 새로운 PCollection<Integer>를 반환합니다.

  // The input PCollection of word strings.
  PCollection<String> words = ...;

  // The ComputeWordLengths transform, which takes a PCollection of Strings as input and
  // returns a PCollection of Integers as output.
  static class ComputeWordLengths
      extends PTransform<PCollection<String>, PCollection<Integer>> { ... }

  // Apply ComputeWordLengths, capturing the results as the PCollection wordLengths.
  PCollection<Integer> wordLengths = words.apply(new ComputeWordLengths());

Dataflow 프로그램으로 파이프라인을 빌드하면 사용자가 포함한 변환은 정확히 지정된 순서로 실행되지 않을 수 있습니다. 예를 들어, Cloud Dataflow 관리형 서비스는 최적화된 실행을 수행합니다. 최적화된 실행에서 Dataflow 서비스는 종속성 순서로 변환 순서를 결정하여 파이프라인에 정의된 입력과 출력의 정확한 순서를 유추합니다. 특정 변환은 가장 효율적인 실행을 위해 병합되거나 다른 순서로 실행될 수 있습니다.

Dataflow SDK의 변환 종류

핵심 변환

Dataflow SDK에는 Cloud Dataflow 병렬 처리 모델의 기반이 되는 핵심 변환이라는 작은 그룹이 있습니다. 핵심 변환은 파이프라인 처리의 기본 빌드 블록을 형성합니다. 각 핵심 변환은 PCollection의 요소에 사용자가 제공하는 비즈니스 논리를 적용하기 위한 일반 처리 프레임워크를 제공합니다.

핵심 변환을 사용하면 사용자는 처리 논리를 함수 객체로 제공합니다. 사용자가 제공하는 함수는 입력 PCollection의 요소에 적용됩니다. 데이터세트가 충분히 크고 파이프라인 실행기 서비스에 의해 보류 중인 최적화가 수행되므로, 함수 인스턴스는 여러 Google Compute Engine 인스턴스에 걸쳐 병렬로 실행될 수 있습니다. 작업자 코드 함수는 출력 PCollection에 추가되는 출력 요소(있는 경우)를 생성합니다.

사용자 제공 함수 객체 요구 사항

변환을 위해 사용자가 제공하는 함수 객체에는 Cloud Platform 프로젝트의 여러 Compute Engine 인스턴스에서 병렬로 실행되는 많은 복사본이 있을 수 있습니다. 따라서 이러한 함수 생성 시 몇 가지 사항을 고려해야 합니다.

  • 함수 객체는 직렬화되어야 합니다.
  • 함수 객체는 스레드와 호환되어야 하고 Dataflow SDK가 스레드 안전임을 인식해야 합니다.
  • 함수 객체를 멱등성으로 만드는 것이 좋습니다.

이러한 요구 사항은 DoFn(ParDo 핵심 변환에 사용됨), CombineFn(Combine 핵심 변환에 사용됨), WindowFn(Window 변환에 사용됨)의 하위 클래스에 적용됩니다.

직렬화 가능성

사용자가 핵심 변환에 제공하는 함수 객체는 완전히 직렬화되어야 합니다. DoFn, CombineFn, WindowFn과 같은 사용자 코드의 기본 클래스는 이미 Serializable를 구현한 상태입니다. 그러나 사용자의 하위 클래스는 직렬화할 수 없는 구성원을 추가하지 않아야 합니다.

다음은 고려해야 하는 기타 직렬화 가능성 요소들입니다.

  • 함수 객체의 일시적 필드는 Cloud Platform 프로젝트의 작업자 인스턴스로 전달되지 않아야 합니다. 그 이유는 자동으로 직렬화되지 않기 때문입니다.
  • 직렬화 전에 대량의 데이터를 필드로 로드하지 않습니다.
  • 함수 객체의 개별 인스턴스는 데이터를 공유할 수 없습니다.
  • 적용된 후에는 함수 객체를 변환시켜도 효과가 없습니다.
  • 익명의 내부 클래스 인스턴스를 사용하여 함수 객체를 인라인으로 선언하는 경우 주의해야 합니다. 비 정적 컨텍스트에서 내부 클래스 인스턴스는 바깥쪽 클래스와 해당 상태에 대한 포인터를 암시적으로 포함합니다. 해당 바깥쪽 클래스도 직렬화되므로, 함수 객체 자체에 적용되는 고려 사항은 이 바깥 클래스에도 동일하게 적용됩니다.
스레드 호환성

함수 객체는 스레드와 호환되어야 합니다. 자체 스레드를 명시적으로 만들지 않은 경우, 함수 객체의 각 인스턴스는 작업자 인스턴스의 단일 스레드에서 액세스될 수 있습니다. 하지만 Dataflow SDK는 스레드 안전이 아닙니다. 함수 객체에서 자체 스레드를 만드는 경우, 자체 동기화를 제공해야 합니다. 정적 구성원은 작업자 인스턴스로 전달되지 않으며, 여러 스레드에서 함수의 여러 인스턴스에 액세스할 수 있습니다.

멱등성

함수 객체를 멱등적으로 만드는 것이 좋습니다. 즉, 특정 입력에 대해 함수는 항상 동일한 출력을 제공합니다. 멱등성은 필수는 아니지만 함수를 멱등적으로 만들면 출력에 결정성이 생기고 변환의 디버깅과 문제 해결이 간편해집니다.

핵심 변환 종류

파이프라인에서 직접 핵심 변환을 사용하는 경우가 종종 있습니다. 또한, Dataflow SDK에서 제공되는 다른 많은 변환들은 핵심 변환 면에서 구현됩니다.

Dataflow SDK는 다음 핵심 변환을 정의합니다.

  • ParDo: 일반 병렬 처리에 사용
  • GroupByKey: 키-값 쌍의 키 그룹화에 사용
  • Combine: 컬렉션 또는 그룹화된 값을 결합하는 데 사용
  • Flatten: 컬렉션 병합에 사용

복합 변환

Dataflow SDK는 여러 하위 변환에서 빌드된 변환인 복합 변환을 지원합니다. Dataflow SDK에서 변환 모델은 모듈형입니다. 즉, 다른 변환 면에서 구현되는 변환을 빌드할 수 있습니다. 여러 중첩 단계를 포함한 파이프라인의 복합 단계로 복합 변환을 생각한다면 이해가 쉽습니다.

복합 변환은 다수의 단계를 포함한 반복 가능한 작업을 만들려는 경우에 유용합니다. CountTop 등 Dataflow SDK에 포함된 많은 기본 제공 변환들이 이러한 형태의 복합 변환입니다. 이 변환들은 다른 변환과 정확하게 동일한 방식으로 사용됩니다.

자세한 내용은 복합 변환 만들기를 참조하세요.

Dataflow SDK에 미리 작성된 변환

Dataflow SDK는 핵심 및 복합 변환을 모두 포함한 다양한 사전 작성된 변환을 제공합니다. 이러한 변환은 처리 논리가 사용자를 위해 이미 작성되어 있습니다. 이러한 변환들은 데이터를 결합, 분할, 조작, 데이터 통계적 분석을 수행하기 위한 더욱 복잡한 변환입니다.

자바

com.google.cloud.dataflow.sdk.transforms 패키지와 하위 패키지에서 이러한 변환을 찾을 수 있습니다.

Dataflow SDK에서 제공하는 변환 사용에 대한 자세한 설명은 SDK에 포함된 변환을 참조하세요.

데이터를 읽고 쓰기 위한 루트 변환

Dataflow SDK는 파이프라인에서 데이터를 가져오고 내보내기 위한 루트 변환이라는 특수 변환을 제공합니다. 이러한 변환은 언제든지 파이프라인에서 사용될 수 있지만 파이프라인의 루트 및 엔드포인트 역할을 수행하는 경우가 많습니다. 여기에는 읽기 변환, 쓰기 변환, 만들기 변환이 포함됩니다.

초기 PCollection을 만들기 위해 파이프라인의 루트 역할을 수행할 수 있는 읽기 변환은 다양한 소스에서 파이프라인 데이터를 만드는 데 사용됩니다. 이러한 소스에는 Google Cloud Storage의 텍스트 파일, BigQuery 또는 Pub/Sub에 저장된 데이터, 기타 클라우드 저장소 소스가 포함될 수 있습니다. 또한 Dataflow SDK는 고유한 커스텀 데이터 소스로 작동하기 위한 확장 가능 API를 제공합니다.

쓰기 변환은 처리된 출력 데이터를 포함한 PCollection을 외부 저장소에 쓰기 위한 파이프라인 엔드포인트 역할을 수행할 수 있습니다. 외부 데이터 저장소 싱크에는 Google Cloud Storage의 텍스트 파일, BigQuery 테이블, Pub/Sub 또는 기타 클라우드 저장소 메커니즘이 포함될 수 있습니다.

만들기 변환은 메모리 내 데이터에서 PCollection을 만들 때 유용합니다. 자세한 내용은 PCollection 만들기를 참조하세요.

읽기 및 쓰기 변환에 대한 자세한 내용은 파이프라인 I/O를 참조하세요.

다중 입력 및 출력이 있는 변환

일부 변환은 여러 PCollection 입력 또는 특수 부차 입력을 수용합니다. 또한 변환은 여러 PCollection 출력과 부차 출력을 생성할 수 있습니다. Dataflow SDK는 다양한 종류의 여러 입력과 출력을 추적하고 전달할 수 있도록 태깅 API를 제공합니다.

여러 입력과 출력을 포함한 변환, 태깅 시스템의 자세한 내용은 여러 PCollection 처리를 참조하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.