Photonエンジン：Databricksレイクハウスプラットフォームにおける次世代クエリーエンジン

[Announcing Photon Public Preview: The Next Generation Query Engine on the Databricks Lakehouse Platform \- The Databricks Blog](https://databricks.com/blog/2021/06/17/announcing-photon-public-preview-the-next-generation-query-engine-on-the-databricks-lakehouse-platform.html)の翻訳です。

本日[Photonのパブリックプレビュー](https://docs.databricks.com/release-notes/product/2021/june.html#accelerate-sql-workloads-with-photon-public-preview)を発表できることを嬉しく思います。Photonは、劇的にクエリ性能を改善するためにC++で開発された、ネイティブのベクトライズドエンジンです。Photonのメリットを享受するに必要なことは、それをオンにするだけです。Photonは処理、リソースとシームレスに連携し、透過的にSQLやSparkのクエリーを高速化します。チューニングやユーザーの介入は必要ありません。

この新たなエンジンは、究極的には全てのワークロードを高速化するために設計されていますが、プレビュー期間中、ワークロードあたりのトータルコストを引き下げながらも、PhotonはSQLワークロードを高速化することにフォーカスしています。Photonを活用するためには二つの方法があります。

- [Databricks SQL](https://databricks.com/product/databricks-sql)のデフォルトクエリーエンジンとなっています。
- Databricksクラスターの高性能ラインタイムの一部として。なお、Photon対応ランタイムはPhoton非対応のランタイムと[異なる価格帯](https://databricks.com/product/aws-pricing/instance-types)となっています。

本記事では、Photonを開発するに至った背景を議論し、Photonの内部でどのような処理が行われているのか、Databricks SQLと従来型のDatabricksクラスターでどのようにクエリー実行をモニタリングするのかを説明します。

# Photonによる高速化

なぜ新たなクエリーエンジンを開発したのかと不思議に思うかもしれません。1000の言葉よりも一つの棒グラフが雄弁に語ります。データにストーリーを語らせましょう。
![](https://databricks.com/wp-content/uploads/2021/06/photon-pr-blog-img-1.png)
*図1:TPC-DS 1TBを用いたバージョン2.1以降の相対的速度比較*

TPC-DSベンチマーク(スケールファクターは1TB)を用いたパワーテストによるDatabricksランタイムパフォーマンスのチャートから分かるように、ここ数年間、性能は一定の割合で増加しています。しかし、Photonを導入することでクエリー性能が劇的に増加していることがわかります。PhotonはDatabricks Runtime 8.0の2倍高速です。これが我々がPhotonのポテンシャルに興奮している理由です。しかも、まだこれはスタートしたばかりなのです。Photonのロードマップには、さらに広いカバレッジとさらなる最適化が含まれています。

初期のPhotonプライベートプレビューを利用されたお客様は、以下のようなSQLワークロードにおいて2〜4倍の速度改善を体験されています。

- **SQLベースのジョブ** - SQL、Sparkデータフレームに対する大規模プロダクションジョブを高速化します。
- **IoTユースケース** - Sparkと従来型のDatabrikcsランタイムと比較して、Photonを活用することで時系列データの分析を高速化します。
- **データプライバシー、コンプライアンス** - Delta Lake、プロダクションジョブ、　Photonを活用することで、レコードを特定し削除するためにデータを複製することなしに、ペタバイト級のデータセットにクエリーを実行できます。
- **Delta/Parquetへのデータロード** - Photonのベクトル化されたI/Oによって、データエンジニアリングジョブの全体的なコストと実行時間を削減しつつ、Delta/Parquetへのデータロードを高速化します。

# Photonの動作原理

PhotonはC++で記述されていますが、Databricksランタイム、Sparkと直接統合されています。これは、Photonを利用するためにコードの変更の必要がないことを意味しています。Photonがプラグインされた際の「クエリーのライフサイクル」を簡単にウォークスルーさせてください。
![](https://databricks.com/wp-content/uploads/2021/06/photon-pr-blog-img-2.png)
*図2:Photonクエリーのライフサイクル*

クライアントがSparkのドライバーノードにクエリーを送信した際、パースされ、[Catalysオプティマイザー](https://databricks.com/glossary/catalyst-optimizer)が分析を行います。そして、Photonが使用されていない場合同様、実行計画、最適化を行います。一つ違うのは、Photonがある場合、ランタイムのエンジンは物理的な実行計画を行わず、どの部分をPhotonに実行させるのかを決定します。Photonの実行計画においては、軽微な修正、例えばソートマージジョインをハッシュジョインに変更するといったことが行われるかもしれませんが、ジョインの順番を含む実行計画の全体的な構成は変更されません。まだ、PhotonはSparkのすべての機能をサポートしていませんので、一つのクエリーのある部分がPhotonで実行され、他の部分はSparkで実行されます。このハイブリッド実行モデルは、ユーザーに対して完全に透明性のあるものとなっています。

クエリープランは、データの特定のパーティションに対して処理を行うワーカーノードのスレッドで分散実行される、タスクと呼ばれる原子的なユニットに分割されます。このレベルにおいてPhotonは作業を行います。これは、Sparkの全体のステージのcodegenを、ネイティブなエンジン実装で置き換えるものだと考えることができます。PhotonライブラリがJVMにロードされ、SparkとPhotonは[JNI](https://en.wikipedia.org/wiki/Java_Native_Interface)を通じてやりとりを行い、データのポインターをオフヒープメモリーに渡します。また、Photonは、混成実行計画におけるスピル(溢れ)調整のためにSparkのメモリーマネージャと統合されています。SparkとPhotonの両方は、オフヒープメモリーを使用し、メモリーのプレッシャーに対応するように設定されています。

パブリックプレビューリリースにおいては、Photonは全てではありませんが多くのデータタイプ、オペレーター子、エクスプレッションをサポートしています。詳細は[Photon overview](https://docs.databricks.com/runtime/photon.html)を参照してください。

# Photon実行の分析

現時点ではすべてのワークロード、オペレーターがサポートされていませんので、Photonを利用するのに適したワークロードをどう選択したらいいのか、実行計画でPhotonがどう利用されているのかを検知することに対して疑問に思うかもしれません。簡単にいうと、Photonの実行はボトムアップです。テーブルスキャンオペレーターから始まり、DAG(有向非巡回グラフ)へと移行し、サポートされていないオペレーションに達するまで続きます。この時点でオペレーションはPhotonの手を離れ、Photonなしで処理が行われます。

Databricks SQLのPhotonを利用している場合には、クエリーでPhotonがどのように使われているのかを容易に追跡できます。

1. サイドバーの**Query History**アイコンをクリックします。
1. 分析したいクエリーを含むラインを選択します。
1. クエリー詳細がポップアップしますので、**Execution Details**をクリックします。
1. 下部にある**Task Time in Photon**メトリックを参照します。

一般的には、Photonによるタスクの時間が大きいほど、Photonによる性能改善がされていることを意味します。
![](https://databricks.com/wp-content/uploads/2021/06/photon-pr-blog-img-3.jpg)
*図3:Databricks SQLにおけるクエリー履歴の詳細*

DatabricksクラスターのPhotonを使用している場合は、Spark UIでPhotonの動作を確認することができます。以下のスクリーンショットはクエリー詳細のDAGを示しています。DAGにおいて二箇所でPhotonを確認できます。まず、Photonオペレーターは、PhotonGroupingAggのようにPhotonの文字列から始まります。そして、非Photonのオペレーターとステージは青色であるのに対して、DAGのPhotonオペレーターとステージは桃色で表示されます。
![](https://databricks.com/wp-content/uploads/2021/06/photon-pr-blog-img-4-rev-103x300.png)
*図4:Spark UIにおけるクエリー詳細DAG*

# ニューヨークタクシーデータの例で始めてみる

上で議論した通り、Photonを利用するには二つの方法があります。

1. Databricks SQLエンドポイントにおいてはデフォルトでPhotonが有効化されています。[SQLエンドポイントを作成](https://docs.databricks.com/sql/admin/sql-endpoints.html)し、クエリーを実行し、上の方法でPhotonがどのくらい性能を改善するのかを確認できます。
1. (パブリックプレビューではAWSのみ)DatabricksクラスターでPhotonを利用するには、新規クラスターを作成する際に[Photonランタイムを選択](https://docs.databricks.com/clusters/configure.html#databricks-runtime)します。非Photonのランタイムと同じ[インスタンスタイプ](https://databricks.com/product/aws-pricing/instance-types)であっても、Photonを使用する際には異なる価格帯となります。Photon対応のインスタンスとDBU消費に関しては、[Databricks pricing page for AWS](https://databricks.com/product/aws-pricing/instance-types)を参照ください。

Photonが有効化されたSQLエンドポイント、クラスターを作成すれば、ノートブックやSQLエディターでDatabricksの[NYC Taxi dataset](https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page)に対してクエリーを実行することができます。[Databricks datasets](https://docs.databricks.com/data/databricks-datasets.html)にはロード済みのデータがあり、アクセスすることができます。

まず、以下のSQLスニペットで既存データを参照するテーブルを新規に作成します。

```sql:SQL
CREATE DATABASE IF NOT EXISTS photon_demo;
CREATE TABLE photon_demo.nyctaxi_yellowcab_table
USING DELTA
OPTIONS (
  path "/databricks-datasets/nyctaxi/tables/nyctaxi_yellow/" 
);
```

以下のクエリーを実行してPhotonのスピードを楽しんでください！

```sql:SQL
SELECT vendor_id,
  SUM(trip_distance) as SumTripDistance,
  AVG(trip_distance) as AvgTripDistance
FROM photon_demo.nyctaxi_yellowcab_table
WHERE passenger_count IN (1, 2, 4)
GROUP BY vendor_id
ORDER BY vendor_id;
```

上記のクエリーのレスポンスタイムを、Photonと従来型のDatabricksランタイムとで比較しました。2台のi3.2xlargeエグゼキューターとi3.2xlargeのドライバーから構成されるウォームアップ済みのAWSクラスターで計測しています。以下が結果となります。
![](https://databricks.com/wp-content/uploads/2021/06/photon-pr-blog-img-5.png)
*図5:NYCタクシーデータに対するクエリーにおけるPhoton対Databricksランタイム*

Photonについてさらに学びたいのでしたら、Data+AIサミットのセッション：[Radical speed for SQL Queries Photon Under the Hood](https://databricks.com/session_na21/radical-speed-for-sql-queries-on-databricks-photon-under-the-hood)をご覧になってください。ここまでお読みいただきありがとうございます。皆様からのフィードバックを楽しみにしています！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)