詳細検索

Sparkにおける怠惰な評価について知っておくべきこと

アバター
著者: Chen Ziyu
6分で読めます

Sparkにおける怠惰な評価について知っておくべきこと
Englishから翻訳 • 原文を読む

「怠惰」という言葉には否定的な意味合いがあることに異論を唱える人はほとんどいません。私たちは通常、努力しない人を怠け者と表現します。しかし、すべての怠惰が望ましくないわけではなく、特にコンピュータサイエンスの世界では、怠惰を勤勉さよりも好むこともあります。その一例が怠惰な評価です。本日は、なぜ怠惰な評価がSparkの高いパフォーマンスに不可欠なのか、そしてSparkにおける怠惰評価の仕組みを詳しく見ていきます。

まずは怠惰評価の定義から始めましょう。ウィキペディアによると、怠惰評価とは、式の評価を必要になるまで遅らせる評価戦略のことです。つまり、式が怠惰に評価されると、その値は必要になるまで計算されません。なぜ私たちはその式に出会った瞬間、つまり熱心に評価できないのかと疑問に思うかもしれません。その理由は二つあります:

まず第一に、怠惰な評価はSparkの効率向上に役立ちます。Sparkは触媒オプティマイザーを使って、データ演算を実行する最も効率的な方法を自動的に探します。もしSpark内のすべての式を熱心に評価すると、触媒オプティマイザはすべての中間式の計算計画を個別に最適化します。したがって、触媒オプティマイザはグローバルに最適な実行計画を作成することはできません。逆に、怠惰評価戦略を採用し、すべての中間式の計算をスキップすれば、カタリストオプティマイザーは全体の操作チェーンを解析し、グローバルに最適な実行計画を生成するために必要な情報を得ることができます。

簡単な例としては、DataFrameに新しい列を追加して削除することが挙げられます。最終的な式を怠惰に評価すれば、Catalystオプティマイザーは全体の操作連鎖を解析できます。新しいカラムの追加と削除は操作なしと同等であるため、CatalystオプティマイザーはSparkにデータを抽出する際に初期DataFrameを変更しないよう指示し、全体のプロセスを非常に効率的にします。しかし、中間的な式も含めてすべての式を熱心に評価すると、Catalyst Optimizerは追加・削除操作を排除するのに十分な情報を持っておらず、全体の非効率性が生じます。

image1

次に、レイジー評価はデータを格納するために必要な総容量を削減します。Sparkがすべての中間式を熱心に評価していた場合、これらの式は一定のスペースを占有する必要があります。これに対し、レイジー評価は中間式の保存に使う一時的なストレージを減らすのに役立ちます。その結果、レイジー評価はSparkの全体的な空間利用率も向上します。

怠惰評価がSparkの全体的な効率向上の取り組みに不可欠であることが分かったところで、Sparkにおける怠惰評価の仕組みを見てみましょう。すべての式を熱心に評価し、それぞれに対応するデータを計算する代わりに、SparkはDataFrameを使ってデータを表現します。これらのDataFrameは本質的にDAG(有向非巡回グラフ)であり、すべてのデータソースに関する情報や、これらのDataFrameで記述されるデータを生成するために必要な修正が含まれています。ご覧の通り、DataFrameはSparkが怠惰評価を実現する上で不可欠です。

image2

DataFrameで表されるデータを変更するために、変換を適用できます。変換は、実際の修正を行うことなくDataFrameを修正する方法を指定します。SparkはDataFrameに対してアクションを呼び出すまで修正を実行しません。変換とは異なり、アクションは熱心に評価されます。変換はDataFrameで表現される実際のデータを抽出することを含みます。(変換やアクションについてはこのブログで詳しく読むことができます。)

別の例を見てみましょう。以下のフローチャートに示すように、まず3列のDataFrame(user_id、user_name、tenant_id)から始まります。最初の変換は、マスク付き_user_name列をDataFrameに追加することです。変換後、4つの列(user_id、user_name、masked_user_name、tenant_idの4列のDataFrameが完成します。次に、user_name列を削除する変換を行い、3列のDataFrame(user_id、masked_user_name、tenant_idとなります。最後に、dataFrameをtenant_idとtenant_nameの2列を含む別のDataFrameと結合します。これまでに多くの計算を行ったように見えるかもしれません。しかし実際には、DataFrameは遅延評価されるため、評価を一切行わずにDataFrame変換を行っただけです。評価は最終DataFrameでall()メソッドが呼ばれた後に始まり、これがプロセス全体の唯一のアクションです。

image3

まとめると、レイジー評価はSparkの時間と空間性能の最適化を促進し、SparkはDataFramesとTransformationsに依存してレイジー評価を実現しています。この記事がSparkとレイジー評価の理解を深める助けになれば幸いです。

さらなる参考文献:Catalyst Optimizer : The Power of Spark SQL Spark SQLのCatalyst Optimizer Directed Acyclic Graphsアクション、狭い変換、広範囲変換の詳細

Related Articles