お久しぶりです。すっかり更新をさぼっていましたので久々に投稿します。直近はSparkと扱うことになり、これに関して新しくインプットしていましたので、いろいろと書いていこうかなと思います。
Sparkとは

Sparkは、Apache Sparkとしても知られる高速で一般的なクラスター計算システムです。Sparkは、大規模なデータ処理、データ分析、機械学習などのタスクを効率的に実行するために設計されています。
Sparkは、分散データ処理を行うための抽象化レイヤーであり、大規模なデータセットを複数のコンピュータで処理することができます。Sparkは、データの並列処理を行うために、メモリ上でデータを保持することができるため、ディスクへのアクセスが必要な他のシステムよりも高速です。そのため、大規模なデータを扱うとなった場合にはSparkを扱われています。有名企業だとNetflixで用いられるようです。
Sparkは幅広い言語をサポートしており、Scala、Java、Python、Rなどのプログラミング言語で使用されます。また、データの転送や処理のためのさまざまなライブラリとツールを提供しており、Spark SQL(SQLクエリの実行)、Spark Streaming(リアルタイムデータ処理)、MLlib(機械学習)、GraphX(グラフ処理)などのコンポーネントがあります。こんな感じで、大規模なデータセットで分析するとなったら非常に役立つというわけです。
PySparkの場合、書き方はPythonとSQLを足し合わせたような形なのでいずれかを触ったことがあるなら把握するのにそこまで難しくないと思われますが、裏側の処理で僕が触ったことがある言語(PythonとSQL)とはない特徴的な部分があり、そこでちょっとつまずきました。
Lazy Evaluation
Lazy Evaluationとは「値が必要になるまで計算しないという計算方法」のことを指しています。Sparkの操作はTransformationとActionのいずれかに分けられるのですが、このActionsに該当する操作が行われるまで、実際の値を返してくれないという仕様となっています。このことを最初把握しておらず、データの可視化がうまくされないなぁ…と試行錯誤していました。(Actionsの代表的な操作はreduceやcountになります。)
全体的な流れとして、クエリが渡された段階でもすぐに計算を行わず、Catalystというフレームワークによって受け取ったクエリ(実行計画)から最適な計算となるように効率化がされている模様です。
なんでこんな処理があるんだろうか?と疑問に思っていたのですがこれは恐らく「大規模データを扱う」ために生み出した設計思想からきているのではないかと思っています。分散処理のおかげでPB級のデータも扱えるようになっていますから、無駄な計算は極力行わないようにする、という形になっているみたいですね。
おわりに
ちょっと短めですが、SparkとLazy Evaluationについて書いてみました。まだまだ勉強したてなので、また新しく学んだりつまずいたことがあったら書いていこうかなと思います。
参考リンク


コメント