データサイエンティスト検定 リテラシーレベル 無料問題 6 / 10 ・ 分野3: データエンジニアリング
Spark で巨大なログから ERROR を含む行を filter した RDD を作る処理を書いて実行したところ、数百ギガバイトのログなのに一瞬で終わった。この理由として正しい説明はどれか。
- filter は、ドライバープログラムの手元にある先頭の一部の行に適用され、ほかの行は処理の対象にならないから
- filter は処理を記録しておき、count や collect などのアクションが結果を求めた時点で計算されるから
- filter の結果は前回の実行時にクラスタのメモリへ保存されており、その保存済みの結果を読み出しただけだから
- filter は、各ノードへ処理を配る際に使う命令なので、実際に行を絞り込む処理は ERROR の行ごとに非同期で終わるから
正解と解説を見る
正解: B
正解の理由
Spark の RDD プログラミングガイドは「Spark のすべての transformation は遅延評価(lazy)である」と述べる。結果をすぐに計算せず、元のデータセットに適用した処理を覚えておき、アクションが結果をドライバープログラムに返す必要があるときに初めて計算する。この設計により、たとえば map した巨大なデータセットを返さず、reduce の結果だけを返す、といった効率のよい実行ができる。そのため filter だけを書いて実行しても、計算は動かず一瞬で終わる。
違う選択肢
「filter は、ドライバープログラムの手元にある先頭の一部の行に適用され、ほかの行は処理の対象にならないから」… transformation は RDD 全体への処理として記録される。先頭の一部に限って実行するのではなく、実行を後ろへ回しているのである。アクションが来れば全体が処理される。
「filter の結果は前回の実行時にクラスタのメモリへ保存されており、その保存済みの結果を読み出しただけだから」… 保存するには persist や cache を明示的に呼ぶ必要がある。呼ばずに速かった理由は、保存ではなく計算がまだ行われていないことである。
「filter は、各ノードへ処理を配る際に使う命令なので、実際に行を絞り込む処理は ERROR の行ごとに非同期で終わるから」… 絞り込みの実行はアクションの時点で行われる。非同期に先行して終わっているわけではない。実際に動かすと、そこから時間がかかる。
押さえどころ
transformation(map・filter など)は処理を記録するだけで、アクション(count・collect・reduce など)で初めて動く。実行が速すぎるときは、まだ計算されていないことを疑う。