Kekeの日記

エンジニア、読書なんでも

Apache Beamのコンセプトと開発指南書

image.png

本記事

この記事はApache Beamのコンセプトや開発方針を調査します。

別の記事にて、実際にApache BeamのPipelineを開発してみようと思います。

1. Apache Beamとは

Apache Beamとは、

Apache Beamとは、バッジ処理とストリーム処理を統合されたプログラミングモデル

です。また、Beamがサポートしている以下のような分散処理バックエンドで実行することができます。

スクリーンショット 2018-08-24 2.01.32.png

また、公式の対応表は以下の通りです。

スクリーンショット 2018-08-24 2.03.26.png

特に他のストリーム処理やバッジ処理を行うものは「システム」と呼ばれることが多いのに対して「プログラミングモデル」というものは新しい気がします。

以下の記事になぜApache Beam(Cloud Dataflow)を採用するべきかを書いています。

特に

ストリーミングとバッチの未来は Apache Beam にあります。

の部分にはApache Beam一択になるのではないかと思います。ちなみに他のストリーム処理を基本とするシステムはApache Flinkをベースとしています。

cloudplatform-jp.googleblog.com

1.1 特徴

Apache Beamの特徴は以下の三つです。

  • 統合されている。
    • バッジ処理とストリーム処理をどっちとも書くことができる
  • 携帯性
    • あらゆる環境でパイプラインを実行することができる。
  • 拡張性
    • SDKを書いて、シェアしてほしい

1.2 執筆時のSDK対応

執筆時では、以下の言語でSDKが出されていました。

  • Java
  • Go
  • Python

2. コンセプト

以下の四つの重要な概念があります。

2.1 Pipeline

データ処理全体のことです。

2.2 PCollection

Pipelineで絶えず流れるデータセットのことであり、有限でも無限でもいい。

2.3 Transform

Pipelineにおいて、実際の処理を行うものである。

2.4 SourceとSink

Sourceとは、データの取得元となるものをさす。

Sinkとは、Pipelineの出力として吐き出すものである。

3. Pipeline設計指南書

3.1 Pipelineの基本

Apache Beam Pipelineを開発するなかで、何を考慮しなければならないのでしょうか。

項目  備考
データの入力  どのくらいのデータがあるのかを知る必要がある
データのスキーマ どのスキーマで扱うか。データベースのレコードなのか、テキストなのか。
データの変換  Beamの主目的であるはず。
データの出力 どこに何を出力するか。

基本的なスキーマは、以下の図で表されます。

image.png

しかし、実際にはもっと複雑です。

設定を書いたoptionsを引数に、実装される。

PipelineOptions options = PipelineOptionsFactory.create();

Pipeline p = Pipeline.create(options);

自身で定義したオプションを使いたいのならば以下のようにしてPipelineOptionextendして拡張するようになります。

PipelineOptionsFactory.register(MyOptions.class);
MyOptions options = PipelineOptionsFactory.fromArgs(args)
                                                .withValidation()
                                                .as(MyOptions.class);

ここではfromArgsを使ってコマンドラインから使うようにしています。

3.2 PCollectionを分岐させる

画像がもっとも直感的だと思うので、ご覧ください。

image.png

TrasformAとTransformBに分かれている。

3.3 複数の出力をする単一のtrasform

タグ付きアウトプットというものを使用していくつものPCollectionを作成している。

image.png

3.4 PCollectionのマージ

PCollectionを集約するときに使います。

二つ種類があって、

  • Flatten:
  • Join:

image.png

3.4 マルチリソース

ひとつ以上のリソースから参照することができます。

ここでは、3.3のマージを使用しています。

image.png

4. Pipelineのテスト

個人的にテストのないコードを見るだけでぞっとします。 たとえば、合計金額を算出するような単純な関数でさえもテストがあると安心できます。

では、Pipelineではどのようにするべきか解説をします。

一般的には、リモートでデバックするよりもローカルでユニットテストをした方がシンプルで、早く済むことが多いです。

Apache BeamではDirectRunnerを使用するとテストのヘルプができます。 これでテストしたあとは、小さなスケールで試してください。

また、SDKを使うと、様々なユニットテストをすることができます。

  • DoFnでPipelineのTransformをテストできます。
  • Composite Transform全体をテストできます。
  • Pipelineでエンドツーエンドのテストもすることができます。

詳しくは別の記事で解説しようと思います。

参考文献