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)
状態
- Airflow Variableにも基づき、Airflowのタスクを動的に作成していた
(Apache Airflow: Create dynamic DAG – Big Data & ETLのようにタスク外の部分でループしている感じ) - DAG Runが実行・修了
- Airflow Variableを修正し、DAGにタスクインスタンスが追加される
(Airflow Variablesの変更によって追加されたTaskはstatusが空欄)
通常はclearでTask Instanceを再実行する事ができますが、今回の場合は対象のTask Instanceをclearしても実行されません。
対応
- 対象のTask Instanceを「Mark Failed」にする
- 対象のTask Instanceをclearする
- DAGがRunningになり、Task Instanceが実行される
増えたTask Instanceが複数ある時、どれか一つで1・2を実行すると、追加されたTask Instanceは全て実行されます。
原因
- AirlfowはDAG Run・Task InstanceをDBのレコードとして持っている
- clearを実行すると、Airflowは、Task Instanceのレコードを探しステータスを変える
- DAGが変化した時、過去のDAG Runに対応するTask Instanceのレコードは追加されない(下図)
(画面からは追加されたように見えますが、見えているだけ)
ので、DAGが変化してTask Instanceが増えた時、増えたTask Instanceは単純にはClear出来ないです。
しかし、前述の対応を取ると、
- Mark Failedすると、対象のTask Instanceのレコードが出来る
(=Clear出来るようになる) - ClearするとDAGがRunningになり、StatusがSuccessでもFailedでもないTask Instanceがスケジュール・実行される
(=増えたTask Instanceが実行される)
となり、増えたTask Instanceが実行されます。
今日聞いたPodcast: Materialize (Software Engineering Daily)
概要
Materializeの説明
What is Materialize? とかArchitecture OverviewとかWhat’s inside Materialize?がわかりやすいです。
- ストリーミングデータ(Kafka)、RDBの両方のデータにSQLを投げられる
- (DBのデータはDebeziumでChange Data Capture可)
- 普通のクエリも使えるが、materialized viewにすると継続的に更新し続けることができる(かつ早い)
- PostgreSQL互換のSQLが使える(大変だったらしい)
- Cloudサービスだけを提供
Streamingの話
- Event timeとProcessing Timeの違い(Beamでよくでるやつ)
- ラムダアーキテクチャの話
- 色々プラットフォームが出てフラグメンテーション化(Storm, Spark, Heron, Apex, Google Beam‥)
Materializeの歴史
Microsoftのnaiadプロジェクトが源流
その後Microsoftがプロジェクトを解散。しばらく後に、Materializeが生まれた。
その他・感想
- スクリプト見ると30ページあってスゴイ。聞くだけで理解出来なかったけど、そんだけ長ければ‥
- 他のStreaming系(Apache Druid、Spark SQL、Beam SQL‥)との違い・使い分けが気になる
- 事例的な物ってあるのだろうか
- 人はなぜプロダクト名に一般名詞を付けるのか(検索しづらい)
Google Cloud in Action読んだ
- 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とは
O'Reillyが運営している、オンライン学習プラットフォームです。
何が見れんの
などが使えます。
- O'reilly以外の本は、例えば、Efffective Java(ピアソン)、Scrum Book(Pragmatic Bookshelf)などが読めます
- 基本英語の情報のみで、O'Reillyの本であっても、水野さんのWeb API: The Good Partsや、渋川さんのReal World HTTPは読めません
(2020/6/17時点のコンテンツの状況。英語だと5万タイトル)
でもお高いんでしょ
O'reilly直接では、月$49もしくは年$499です。
月1・2冊O'reillyの本読めば元とれるレベルです。
ACM(Professinal Membership)に加入すると、Safariを使うことが出来ます。
年$99なので、年2・3冊読めば元取れるレベルです。
なお、ACMに入るには会員資格があります(ただし審査はない?):
Membership Qualifications
You must satisfy one of the qualifications below:
- Bachelor's Degree (in any subject area); or
- Equivalent Level of Education; or
- Two years full-time employment in the IT field.
登録
閲覧
で閲覧出来ます。
いずれの方法でも、ACM経由で登録した場合は、ACMから発行されるメールアドレス(名前@acm.org)を入力する必要があります。
なお、iPadで閲覧した感じ、アプリにストレスは感じませんでした。
Apache Beam katasやってみる #2(課題編)
katasでは、下のような内容を行います。
- Hello World
- ParDo
- MapElements
- FlatMapElements
- GroupByKey
- CoGroupByKey
- Combine
- Flatten
- Partition
- Side input
- Side Output
- Branch
- Compositte Transform
- DoFnへの追加のパラメータ(Timestampなど)
- Filter
- Aggregation系(Count, Sum, Mean, Min, Max)
- WithKeys
- TextIO
- Window
- Trigger(Event time, early triggering, accumulation)
- WordCount
Beamの学習といえば、Programming Guide
が人気ですが、Katasはその多くをカバーしていることがわかります。
なお、
- Coders
- Schema
- Metrics
- Timer
- State
あたりは、Katasに無いので、Programming Guideを読む必要があります。
(Coder以外は新しい機能なので、知らなくてもBeamのコード書けると思いますが)
Apache Beam katasやってみる #1 (操作編)
Apache Beam katasを始めると、下のような画面が表示されます。
- 右側のペインに、kataの説明、ヒント、Beamドキュメントへのリンクが表示されます
- 中央のペインに、kataのコードが表示されます
- 左側のペインに、kataの一覧が表示されます
練習の流れとしては、
- 与えられた課題と、コードを確認
- 必要ならBeamのドキュメントを確認
- TODOの部分にコードを記載
- 右側のペインのcheckを実行
- 成功したらConguratulationsが出る
- テスト・コンパイル失敗した場合は、ツールウィンドウの"Run"(下図)で詳細を確認
- (わからなければ)check後、「Peek Solution」が右ペインに出るので、模範解答を除く
な感じです。