Cloud Dataflow と Stackdriver Debugger によるデータ変換のデバッグ
2016年5月10日火曜日
早速、--filterPattern=Flourish,stomach を指定してパイプラインを実行したところ、出力が生成されないことに気づきました。そこで Dataflow UI を見てみたところ、フィルタに合致した単語は存在しない旨、アグリゲータは報告していました。
ParDo(FilterText) には入力があったのに、出力がなくなっていたことから(カスタム カウンタで各ステップの入力数を見ればわかります)、私はフィルタリングを実行する条件文が分岐する箇所(unmatchedWords がインクリメントされるところ)でスナップショットを取得することにしました。
ステップ 1 :デバッガのもとでパイプラインを実行
やるべきことは、--enableCloudDebugger オプションを指定し、Cloud Dataflow サービス上でパイプラインを実行することだけでした。実行すると、次のようなメッセージが表示されます。
To debug your job, visit Google Cloud Debugger at: https://console.cloud.google.com/debug?project=<...>&dbgee=<...> |
表示されたリンクをクリックするか、https://console.developers.google.com/debug で私のプロジェクトを選択すれば、Debugger UI にたどり着けます。なお、複数のパイプラインを実行している場合は、メニューからパイプラインを選択しなければならないことがあります。デフォルトでは最新のパイプラインが選択されます。
ステップ 2 : ソースコードにアクセスする
Debugger UI でコードを参照できるようにするためには、Debugger UI がソースコードにアクセスできなければなりません。アクセスできれば、ファイル名と行番号を入力しなくても、行をクリックするだけでスナップショットを取得できます。
Source Code Options には、ローカル ファイルシステムのディレクトリや Cloud Source Repository など、さまざまなオプションがあります。
話を単純にするために(そして、ソースコードをどこにもアップロードしていないので)、私は “View source code from local files” を選び、パイプライン ソースコードを格納しているディレクトリを指定しました。
ステップ 3 : スナップショットを取得する
スナップショットは、右側のテキスト ボックスに位置を入力して Enter キーを押すか、ソースコードの行番号をクリックすれば取得できます。すでに UI でソースコードを表示できるようにしてあるので、私は DebuggingWordCount.java ファイルに移動し、148 行目のスナップショットを要求しました。
フィルタを通過しなければおかしいと思われる単語のときにどうなるかを知りたかったので、それを次の式を使って条件にしました。
"Flourish".equals(((com.google.cloud.dataflow.sdk.values.KV) c.element()).getKey()) |
条件がプライベート フィールドにアクセスできていることに注目してください。しかし、ジェネリクス(たとえば KV を返す element() )を使うときは、明示的なキャストが必要になります。
注意 : 通常、すべての条件評価は CPU 時間の 0.01 未満に制限されています。この条件はすべての要素で評価され、要素に対する実際の処理が比較的単純な場合は(破棄)、スナップショットはデバッガによってキャンセルされてしまいます。
したがって、この条件をデバッガに評価させるためには、
--maxConditionCost
=0.6
を指定しなければなりませんでした。このパラメータは Dataflow ジョブをサブミットするときに指定します。ステップ 4 : スナップショットがキャプチャされるのを待つ
スナップショットを設定すると、Stackdriver Debugger サービスは実行中のすべての Dataflow ワーカーと通信します。いずれかのワーカーがスナップショットをオンにした行を実行しようとすると、スナップショットがキャプチャされます。
ステップ 5 : スナップショットを使用し、間違いの箇所を突き止める
どの値が処理されているのかを知りたければ、
ProcessContext
( c と呼ばれているもの)を展開し、context を掘り下げます。探しているのは要素ですが、それは context において WindowedValue として格納されています。あちこちをつついてみて、this$0 を展開したところ、使われているフィルタがわかりました。
私が指定した filterPattern (Flourish,stomach) が正規表現として使われていたことが原因だと判明しました。そこで、フィルタパターンを Flourish|stomach に変更して再実行すると、すべてが正しく動作しているように見えます。
たったこれだけ !
今回は、Stackdriver Debugger を使って Dataflow パイプラインのスナップショットを要求する方法を説明しました。少数のワーカーのもとで実行される比較的単純な例を使用しましたが、仮に数 GB のデータに対して500 個のワーカーを実行していた場合でも同様の手順で問題ないはずです。これは、クラウド規模の ETL ジョブで はごく普通のシナリオです。
- Posted by Ben Chambers, Software Engineer
0 件のコメント :
コメントを投稿