Databricks Runtime 7.0 での利用が可能に
によって Matei Zaharia, Reynold Xin(レイノルド・シン), Xiao Li, Wenchen Fan 、 Yin Huai による投稿
Apache SparkTM 3.0.0 が Databricks Runtime 7.0 で利用できるようになりました。Spark 3.0.0 はオープンソースコミュニティでの多くのコントリビュートが結実したものです。3,400 以上のパッチが含まれ、Python API および ANSI SQL の機能拡充に加え、開発や調査が行いやすくなるような工夫が施されています。オープンソースプロジェクトとして 10 年目を迎え、多くの参加者の意見と多様なユースケースに応え続けてきた結果が反映されています。
Apache Spark 3.0 の主な新機能:

Apache Spark 3.0.0の導入に際しては、大きなコード変更は不要です。詳細については、移行ガイドを参照してください。
Spark 開発のこれまでの 10 年間
Spark は、カリフォルニア大学バークレー校の研究ラボ AMPlab でのデータ集約型コンピューティングに関する研究から生まれました。AMPlab の研究者は当初、大手インターネット企業との共同研究を通じてデータと AI の問題に取り組んでいましたが、それらの問題が、増え続けるデータ量に対応しようとするあらゆる企業において、いずれは共通の課題となることに気づきました。そこで、これらのワークロードのための新たなエンジンと、ビッグデータを利用しやすくするための API の開発に着手したのです。
コミュニティでの開発を通じて Spark はさまざまな分野で活用されるようになりました。ストリーミングや Python と SQL に関する新しい機能が追加され、今ではそれらが Spark の主要なユースケースになっています。そして、この継続的な取り組みを通じて、Spark はデータ処理、データサイエンス、機械学習、データ分析ワークロードにおける事実上の標準となるに至りました。Apache Spark 3.0 は、こうした方向性に沿って開発され、広く使用されている Python と SQL の両言語のサポートを大幅に改善し、全般的なパフォーマンスと運用性の最適化を図っています。
Spark SQL エンジンの改善
Spark SQL は多くの Spark アプリケーションを支えるエンジンです。たとえば、Databricks では、Spark API 呼び出しの 90% 以上で、DataFrame、Dataset、SQL の各 API と SQL オプティマイザによって最適化されたライブラリを使用しています。つまり、Python や Scala で開発を行う場合であっても、作業の大半に Spark SQL エンジンが関わっていることになります。Spark 3.0 でコントリビュートされたパッチの 46%は、SQL のパフォーマンスと ANSI との互換性に関するもので、下の図に示すように、Apache Spark 3.0 は Spark 2.4 に比べ、合計実行時間が約半分にまで改善されてい ます。次に、Spark SQL エンジンの 4 つの新機能について説明します。

Spark SQL エンジンには、4 つの新機能が導入されています。新しい適応型クエリ実行(AQE: Adaptive Query Execution)フレームワークでは、より効率的な実行計画を生成することでパフォーマンスの向上とチューニングの簡略化を行います。正確な統計情報の不足やコスト推定の誤りにより最初の計画が十分に最適化されていない場合でも有効です。Spark では、ストレージとコンピューティングが分離されており、データの到着が予測できないことから、従来のシステムに比べて実行時の適応性が重要になります。そこで、Apache Spark 3.0 では適応型の最適化機能が新たに 3 つ導入されました。
3TB のTPC-DS ベンチマークでは、AQEが機能していない場合と比べて AQEが機能しているSpark のパフォーマンスは 2 つのクエリで 1.5 倍高速になり、別の 37 のクエリでも 1.1 倍に向上することが確認されています。


動的パーティションプルーニングは、オプティマイザがコンパイル時にパーティションのスキップが可能か判別できない場合に適用されます。ただし、スタースキーマにおいては、1 つないし複数のファクトテーブ ルが複数のディメンションテーブルを参照する形になることから、通常はスキップの可否が判別できません。そこで、動的パーティションプルーニングにより、ディメンションテーブルのフィルタ結果からスキップ可能なパーティションを特定し、結合時にファクトテーブルから読み込むパーティションに対してプルーニングを行えるようにしました。TPC-DS ベンチマークでは、102 件のクエリのうち 60 件で 2 倍から18 倍へと大きく速度が向上しています。
ANSI SQL に準拠することで、ワークロードを他の SQL エンジンから Spark SQL に移行しやすくしました。Spark 3.0 では、ANSI SQL に合わせて先発グレゴリオ歴に切り替えています。また、ANSI SQL の予約キーワードを識別子として使用することをユーザーが禁止できるようにしました。さらに、算術演算実行時のオーバーフローチェックや、定義済みスキーマでテーブルにデータを挿入する場合のコンパイル時型適用も導入しています。新たにこれらの検証機能を用意したことで、データの品質が改善されています。
結合ヒント:コンパイラの改善は継続的に行われていますが、どのような場合においても常に最適な決定が行われる確証はありません。結合時のアルゴリズムは、統計と経験則に基づいて設計されています。コンパイラにおいて最適な決定が行われない場合、ユーザーは結合ヒントを使用してオプティマイザの計画選定に関与することができます。Spark 3.0 では、従来の結合ヒントに加え、SHUFFLE_MERGE、SHUFFLE_HASH、SHUFFLE_REPLICATE_NL の 3 つの結合ヒントを新たに追加しました。
Python API の強化:PySpark と Koalas
Python は Spark で最もよく使用される言語であり、Apache Spark 3.0 の開発においても重点項目に挙げられていました。Databricks の Notebook コマンドの 68% は Python で記述されており、Apache Spark の Python API である PySpark は、PyPI(Python Package Index)で毎月 500 万回以上ダウンロードされています。

多くの Python開発者がデータの構造化と分析に pandas API を使用していますが、pandas API はシングルノードでの処理しか行えません。そこで、Databricks では、pandas API を Apache Spark 上に実装した Koalas の開発も行っています。データサイエンティストが分散環境でビッグデータを扱う際の生産性の向上を目的としたものです。Koalas では、プロットサポートなどのために PySpark で多くの関数を作成することなく、クラスタ全体を対象として効率的な処理が行えます。
1 年以上の開発を経て、Koalas は pandas API の 80% 程度をカバーするに至りました。2 週間に 1 回の頻度で更新が続けられており、PyPI での毎月のダウンロード件数も急激に増加して 85 万件に達しています。Koalas は、シングルノードで動作する pandas API のコードを容易に移行できる API です。一方、同様に多くのユーザーから支持を集めている Python APIとして、PySpark があります。

Apache Spark 3.0 では、次の複数の項目で PySpark API を拡充しています。
Python のサポートの改善と Spark のユーザビリティ向上は、今後も最優先の開発項目です。
Hydrogen プロジェクトにおけるストリーミング機能と拡張性の改善
Spark 3.0 では、Hydrogen プロジェクトにおける主要コンポーネントが完了し、ストリーミングと拡張性を改善する新機能が導入されています。

Apache Spark 3.0 の最新情報をさらに詳しく
Spark 3.0 は、オープンソースコミュニティにおいて 3,400 件以上の Jira チケットが解決されたメジャーリリースです。個 人だけでなく、データブリックス、Google、Microsoft、Intel、IBM、Alibaba、Facebook、Nvidia、Netflix、Adobe などの企業も加えた 440 以上のコントリビュータが開発に貢献しました。このブログ記事では、Spark 3.0 における Python、API、ANSI SQL 準拠、ストリーミング、パーティション・プルーニングなどについて説明しましたが、他にも紹介できていない多くの機能があります。詳細については、リリースノートをご覧ください。データソース、エコシステム、モニタリングなどの Spark の他の改善事項をご覧ください。

Apache Spark 3.0 を使ってみる
Databricks Runtime 7.0 で Apache Spark 3.0 をお試しいただけます。無料トライアルアカウントを取得してください。すぐに使用を開始できます。クラスタを起動させる際に、バージョン 7.0 を選択するだけで Spark 3.0 が使用できます。

機能とリリースの詳細についてはこちらをご覧ください。
ブログを購読して、最新の投稿を受信トレイにお届けします。