App Engine MapReduce에서 Apache Beam과 Cloud Dataflow로 이전

이 가이드는 App Engine MapReduce 사용자를 위해 작성되었으며, App Engine MapReduce에서 Cloud Dataflow로 이전하는 방법을 보여줍니다.

이전이 필요한 이유

App Engine MapReduce는 대량의 데이터를 병렬 및 분산 방식으로 처리하기 위한 프로그래밍 모델입니다. 다음과 같이 단일 요청의 범위 내에서 처리할 수 없는 크고 오래 실행되는 작업에 유용합니다.

  • 애플리케이션 로그 분석
  • 외부 소스로부터 관련 데이터 집계
  • 한 형식에서 다른 형식으로 데이터 변환
  • 외부 분석을 위해 데이터 내보내기

하지만 App Engine MapReduce는 App Engine 서비스를 기반으로 커뮤니티에서 관리하는 오픈소스 라이브러리이며 더 이상 Google에서 지원하지 않습니다.

반면에 Cloud Dataflow는 Google에서 완벽하게 지원하며, App Engine MapReduce와 비교했을 때 확장된 기능을 제공합니다.

이전 사례

다음은 App Engine MapReduce에서 Cloud Dataflow로 이전함으로써 이점을 얻을 수 있는 몇 가지 사례입니다.

  • SQL을 사용하는 분석 처리를 위해 Cloud Datastore 데이터베이스 애플리케이션 데이터를 BigQuery 데이터 웨어하우스에 저장합니다.
  • Cloud Datastore 데이터 세트의 유지관리나 업데이트를 위해 Cloud Dataflow를 App Engine MapReduce의 대안으로 사용합니다.
  • Cloud Datastore 데이터베이스의 일부를 Cloud Storage에 백업합니다.

Cloud Dataflow 및 Apache Beam이란 무엇인가요?

Cloud Dataflow는 다양한 데이터 처리 패턴을 실행하는 관리형 서비스입니다. Apache Beam은 데이터 처리 워크플로를 정의하기 위한 SDK를 제공하는 통합 프로그래밍 모델입니다. Apache Beam을 사용하면 일괄 처리 및 스트리밍을 위해 복잡한 파이프라인을 생성하고 Cloud Dataflow에서 실행할 수 있습니다.

Cloud Dataflow 및 Apache Beam 시작하기

시작하려면 다음 중에서 원하는 빠른 시작을 따르세요.

파이프라인 생성 및 실행

App Engine MapReduce를 사용할 때는 데이터 처리 클래스를 생성하고 MapReduce 라이브러리를 추가합니다. 그리고 작업의 사양과 설정이 정의되면 해당 작업 클래스에서 정적 start() 메소드를 사용하여 한 번에 작업을 생성하고 시작합니다.

Map 작업의 경우, InputOutput 클래스 그리고 매핑을 수행할 Map 클래스를 생성합니다. App Engine MapReduce 작업의 경우, InputOutput 클래스를 생성하고, 데이터 변환을 위한 MapperReducer 클래스를 정의합니다.

Apache Beam에서는 방법이 약간 다릅니다. 먼저 파이프라인을 생성합니다. 입력 및 출력 커넥터를 사용하여 데이터 소스 및 싱크에서 데이터를 읽고 씁니다. 사전 정의된 데이터 변환을 사용하거나 또는 직접 작성하여 데이터 변환을 구현합니다. 그런 다음에 코드가 준비되면 파이프라인을 Cloud Dataflow 서비스에 배포합니다.

App Engine MapReduce 작업을 Apache Beam 파이프라인으로 전환

다음 테이블은 App Engine MapReduce 모델의 매핑, 셔플, 축소 단계에 해당하는 Apache Beam 클래스를 보여줍니다.

자바: SDK 2.x

App Engine MapReduce 해당하는 Apache Beam 클래스
Map MapElements<InputT,OutputT>
Shuffle GroupByKey<K,V>
Reduce Combine.GroupedValues<K,InputT,OutputT>

일반적인 방법은 Combine.PerKey<K,InputT,OutputT>GroupByKeyCombineValues 대신 사용하는 것입니다.

Python

App Engine MapReduce 해당하는 Apache Beam 클래스
Map beam.Map
Shuffle beam.GroupByKey
Reduce beam.CombineValues

일반적인 방법은 beam.CombinePerKeybeam.GroupByKeybeam.CombineValues 대신 사용하는 것입니다.


다음 샘플 코드는 Apache Beam에서 App Engine MapReduce 모델을 구현하는 방법을 보여줍니다.

자바: SDK 2.x

MinimalWordCount.java에서 발췌:
p.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/*"))

 // Apply a ParDo that returns a PCollection, where each element is an
 // individual word in Shakespeare's texts.
 .apply("ExtractWords", ParDo.of(new DoFn() {
                   @ProcessElement
                   public void processElement(ProcessContext c) {
                     for (String word : c.element().split(ExampleUtils.TOKENIZER_PATTERN)) {
                       if (!word.isEmpty()) {
                         c.output(word);
                       }
                     }
                   }
                 }))

 // Apply the Count transform that returns a new PCollection of key/value pairs,
 // where each key represents a unique word in the text.
 .apply(Count.perElement())

 // Apply a MapElements transform that formats our PCollection of word counts
 // into a printable string, suitable for writing to an output file.
 .apply("FormatResults", MapElements.via(new SimpleFunction, String>() {
                   @Override
                   public String apply(KV input) {
                     return input.getKey() + ": " + input.getValue();
                   }
                 }))

 // Apply a write transform that writes the contents of the PCollection to a
 // series of text files.
 .apply(TextIO.write().to("wordcounts"));

Python

wordcount_minimal.py에서 발췌:
# Read the text file[pattern] into a PCollection.
lines = p | ReadFromText(known_args.input)

# Count the occurrences of each word.
counts = (
    lines
    | 'Split' >> (beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
                  .with_output_types(unicode))
    | 'PairWithOne' >> beam.Map(lambda x: (x, 1))
    | 'GroupAndSum' >> beam.CombinePerKey(sum))

# Format the counts into a PCollection of strings.
output = counts | 'Format' >> beam.Map(lambda (w, c): '%s: %s' % (w, c))

# Write the output using a "Write" transform that has side effects.
# pylint: disable=expression-not-assigned
output | WriteToText(known_args.output)

추가적인 Apache Beam 및 Cloud Dataflow 이점

App Engine MapReduce 작업을 Apache Beam 파이프라인으로 이전하면 Apache Beam과 Cloud Dataflow가 제공하는 여러 가지 기능을 활용할 수 있습니다.

Cloud Dataflow 작업 예약

App Engine 작업 대기열에 익숙하면 Cron을 사용하여 되풀이 작업을 예약할 수 있습니다. 이 에서는 App Engine Cron을 사용하여 Apache Beam 파이프라인을 예약하는 방법을 보여줍니다.

파이프라인 실행을 예약할 수 있는 여러 가지 추가적인 방법이 있습니다. 다음과 같이 할 수 있습니다.

Cloud Dataflow 작업 모니터링

App Engine MapReduce 작업을 모니터링하기 위해 appspot.com에서 호스팅되는 URL을 사용합니다.

Cloud Dataflow 관리형 서비스를 사용하여 파이프라인을 실행할 때는 편리한 Cloud Dataflow 웹 기반 모니터링 사용자 인터페이스를 사용하여 파이프라인을 모니터링할 수 있습니다. 파이프라인에 관한 자세한 내용은 Stackdriver Monitoring을 참조하세요.

읽기 및 쓰기

Apache Beam에서는 App Engine MapReduce의 리더 및 작성기를 데이터 소스 및 싱크 또는 I/O 커넥터라고 합니다.

Apache Beam에는 Cloud Bigtable, BigQuery, Cloud Datastore, Cloud SQL 등 여러 Google Cloud 서비스를 위한 다수의 I/O 커넥터가 있습니다. Apache Cassandra와 MongoDB 등 Google 이외 서비스를 위해 Apache Beam 참여자들이 생성한 I/O 커넥터도 있습니다.

다음 단계

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

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

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