カーキ色はヒンディー語らしい

技術記事は https://zenn.dev/notrogue

Apache BeamのDoFnで匿名クラス使う時はSerializableに気をつけようという話

BeamでDoFn書く時に、↓のように匿名クラスを使って書けます。

PCollection<Integer> wordLengths = words.apply(
  "ComputeWordLengths",                     // the transform name
  ParDo.of(new DoFn<String, Integer>() {    // a DoFn as an anonymous inner class instance
      @ProcessElement
      public void processElement(@Element String word, OutputReceiver<Integer> out) {
        out.output(word.length());
      }
    }));

  しかし、Beam Programming Guideを良く見ると

 Take care when declaring your function object inline by using an anonymous inner class instance. In a non-static context, your inner class instance will implicitly contain a pointer to the enclosing class and that class’ state. That enclosing class will also be serialized, and thus the same considerations that apply to the function object itself also apply to this outer class.

という注意書きがあります。

  • BeamのDoFnはSerializableである必要がある(ワーカーに送るので)
  • Javaの匿名クラスは、enclosing class(匿名クラスを含んでいるクラス)への、暗黙の参照を持つ (参考: SER05-J. 内部クラスのインスタンスをシリアライズしない
  • ので、enclosing class(とそのフィールド)はSerializableである必要がある

というわけです。

 

気をつければ大丈夫な話ですが、

  • 引っかかりやすい
  • ネストが深くなるので見にくい
  • 匿名クラスの部分のテストしづらい

ので、DoFnを書く時、私は匿名クラスとしては書きたくない派です。

Airflowの動的なDAGでclearする時の話

ハマったのでメモ。(Airflow 1.10.2/Cloud Composer)

 

状態

  1. Airflow Variableにも基づき、Airflowのタスクを動的に作成していた
    Apache Airflow: Create dynamic DAG – Big Data & ETLのようにタスク外の部分でループしている感じ)
  2. DAG Runが実行・修了
  3. Airflow Variableを修正し、DAGにタスクインスタンスが追加される
    (Airflow Variablesの変更によって追加されたTaskはstatusが空欄)

通常はclearでTask Instanceを再実行する事ができますが、今回の場合は対象のTask Instanceをclearしても実行されません。

 

 

f:id:toukoudo:20200712075431p:plain

Task Instanceが増えた状態のDAG Run

 

f:id:toukoudo:20200712075528p:plain

増えたTask Instanceをclearした時のエラー

 

対応

  1. 対象のTask Instanceを「Mark Failed」にする
  2. 対象のTask Instanceをclearする
  3. DAGがRunningになり、Task Instanceが実行される

増えたTask Instanceが複数ある時、どれか一つで1・2を実行すると、追加されたTask Instanceは全て実行されます。

 

原因

  1. AirlfowはDAG Run・Task InstanceをDBのレコードとして持っている
  2. clearを実行すると、Airflowは、Task Instanceのレコードを探しステータスを変える
  3. DAGが変化した時、過去のDAG Runに対応するTask Instanceのレコードは追加されない(下図)
    (画面からは追加されたように見えますが、見えているだけ)

ので、DAGが変化してTask Instanceが増えた時、増えたTask Instanceは単純にはClear出来ないです。

 

f:id:toukoudo:20200712081324p:plain

Task Instanceが増えた状態のtask_instanceテーブル

 

しかし、前述の対応を取ると、

  1. Mark Failedすると、対象のTask Instanceのレコードが出来る
    (=Clear出来るようになる)
  2. ClearするとDAGがRunningになり、StatusがSuccessでもFailedでもないTask Instanceがスケジュール・実行される
    (=増えたTask Instanceが実行される)

となり、増えたTask Instanceが実行されます。

 

f:id:toukoudo:20200712081347p:plain

MarkFailed&Clear後のtask_instanceテーブル

 

 

 

今日聞いたPodcast: Materialize (Software Engineering Daily)

softwareengineeringdaily.com

概要

  • テーマ:Streaming SQLエンジンのMaterialize
  • ゲスト:開発元の創業者Arjun Narayan(元Cockroach)と、Frank McSherry(元Microsoft

 

materialize.io 

Materializeの説明

What is Materialize? とかArchitecture OverviewとかWhat’s inside Materialize?がわかりやすいです。

  • ストリーミングデータ(Kafka)、RDBの両方のデータにSQLを投げられる
  • (DBのデータはDebeziumでChange Data Capture可)
  • 普通のクエリも使えるが、materialized viewにすると継続的に更新し続けることができる(かつ早い)
  • PostgreSQL互換のSQLが使える(大変だったらしい)
  • Cloudサービスだけを提供

 

Streamingの話

Materializeの歴史

Microsoftのnaiadプロジェクトが源流

その後Microsoftがプロジェクトを解散。しばらく後に、Materializeが生まれた。

 

 

その他・感想

  • スクリプト見ると30ページあってスゴイ。聞くだけで理解出来なかったけど、そんだけ長ければ‥
  • 他のStreaming系(Apache Druid、Spark SQL、Beam SQL‥)との違い・使い分けが気になる
  • 事例的な物ってあるのだろうか
  • 人はなぜプロダクト名に一般名詞を付けるのか(検索しづらい)

 

 

 

Google Cloud in Action読んだ

 

 

learning.oreilly.com

  • 2018年に出たGoogle Cloud Platformの本です。
  • 著者の John J. GeewaxさんはGoogleのエンジニアです
  • サンプルプログラムはNodeJS(あんまり依存しないと思いますが)です

 

以下のGCPサービスが紹介されており、

  • DB・ストレージ系(GCS.BigTable,Datastore,CloudSQL,Spanner)
  • Compute系(GCE,GKE,GAE,Cloud Function)
  • 機械学習系(Cloud Vision, Cloud Natural Language, Cloud Speech, Cloud Translation, Cloud Machine Learning Engine)
  • ビッグデータ系(BigQuery, Pub/Sub, Dataflow)

それぞれのサービスに関して、

  • 概要
  • 特性(レイテンシ、スケール、耐久性)
  • 合う合わない(小規模なTODOアプリ、大規模SNS、証券取引)
  • 価格感

が説明されています。GCPのサービスの感じを掴むのにいい感じです。

 

個人的に勉強になったのは、Pub/Subの属性メッセージ データの使い分けの記載です。

メッセージデータはデコード(Base64。任意で暗号化)が必要、属性は不要なので、メッセージのルーティング(※)的な事をするためのデータは属性に入れるのが、想定してる使い分けらしいです。

※サブスクライバーが処理すべきメッセージか判定したり、データ内容によって処理内容を変更する

 

 

O'Reillyのサブスクリプション(Safari)登録してみた

すべての情報は2020/06時点のものです

 

Safariとは

www.oreilly.co.jp

O'Reillyが運営している、オンライン学習プラットフォームです。

 

何が見れんの

などが使えます。

 

(2020/6/17時点のコンテンツの状況。英語だと5万タイトル)

f:id:toukoudo:20200617211638p:plain

 

 

でもお高いんでしょ

www.oreilly.com

O'reilly直接では、月$49もしくは年$499です。

月1・2冊O'reillyの本読めば元とれるレベルです。

 

 

www.acm.org

ACM(Professinal Membership)に加入すると、Safariを使うことが出来ます。

年$99なので、年2・3冊読めば元取れるレベルです。

 

なお、ACMに入るには会員資格があります(ただし審査はない?):

Membership Qualifications
You must satisfy one of the qualifications below:

  1. Bachelor's Degree (in any subject area); or
  2. Equivalent Level of Education; or
  3. Two years full-time employment in the IT field.

 

登録

  1. Joinにアクセス

  2. Professinal Membershipを選択
  3. 必要情報を入力(名前・住所・メールアドレス・年齢)
  4. 支払い情報(PayPal可)を入力

閲覧

で閲覧出来ます。

 

いずれの方法でも、ACM経由で登録した場合は、ACMから発行されるメールアドレス(名前@acm.org)を入力する必要があります。

 

learning.oreilly.com

O'Reilly

O'Reilly

  • O'Reilly Media, Inc.
  • 教育
  • 無料

apps.apple.com

 

なお、iPadで閲覧した感じ、アプリにストレスは感じませんでした。

 

 

 

Apache Beam katasやってみる #2(課題編)

 

 

katasでは、下のような内容を行います。

  1. Hello World
  2. ParDo
  3. MapElements
  4. FlatMapElements
  5. GroupByKey
  6. CoGroupByKey
  7. Combine
  8. Flatten
  9. Partition
  10. Side input
  11. Side Output
  12. Branch
  13. Compositte Transform
  14. DoFnへの追加のパラメータ(Timestampなど)
  15. Filter
  16. Aggregation系(Count, Sum, Mean, Min, Max)
  17. WithKeys
  18. TextIO
  19. Window
  20. Trigger(Event time, early triggering, accumulation)
  21. WordCount

 

Beamの学習といえば、Programming Guide

beam.apache.org

が人気ですが、Katasはその多くをカバーしていることがわかります。

 

 

なお、

  • Coders
  • Schema
  • Metrics
  • Timer
  • State

あたりは、Katasに無いので、Programming Guideを読む必要があります。

(Coder以外は新しい機能なので、知らなくてもBeamのコード書けると思いますが)

 

 

 

Apache Beam katasやってみる #1 (操作編)

 

 

 

Apache Beam katasを始めると、下のような画面が表示されます。

  • 右側のペインに、kataの説明、ヒント、Beamドキュメントへのリンクが表示されます
  • 中央のペインに、kataのコードが表示されます
  • 左側のペインに、kataの一覧が表示されます

 

f:id:toukoudo:20200607114144p:plain

 

 

練習の流れとしては、

  1. 与えられた課題と、コードを確認
  2. 必要ならBeamのドキュメントを確認
  3. TODOの部分にコードを記載
  4. 右側のペインのcheckを実行
  5. 成功したらConguratulationsが出る
  6. テスト・コンパイル失敗した場合は、ツールウィンドウの"Run"(下図)で詳細を確認
  7. (わからなければ)check後、「Peek Solution」が右ペインに出るので、模範解答を除く

な感じです。

 

f:id:toukoudo:20200609063056p:plain