Photonは、DatabricksがApache Sparkの実行レイヤーをC++でゼロから再実装したネイティブベクトル化エンジンです。 従来のJVMベースのSpark実行エンジンと互換性を保ちつつ、CPU命令レベルの最適化(SIMD、列指向バッチ処理)により 特にSQLクエリ・DataFrame操作・Delta Lake I/Oで大幅な高速化を実現します。
本記事では、Photonの対応・非対応ワークロード、JVMへの自動フォールバック挙動、有効化方法、 Classic/Photon/Serverlessのコスト比較を整理します。
従来のSparkはJVM上でJavaバイトコードとして実行されます。Photonはこの実行レイヤーをC++で置き換え、以下の最適化を行います。
これらの最適化により、Photonは特にCPU律速のワークロード(大量のJOIN、集約、ソート、フィルタリング)で 従来のSparkエンジンに対して2〜8倍程度の高速化を実現する場合があります。
Photonは以下のワークロードで高速化効果を発揮します。Spark SQLおよびDataFrame APIの多くの操作がPhoton対象です。
| ワークロード | Photon対応 | 備考 |
|---|---|---|
| Spark SQL(SELECT/JOIN/WHERE/GROUP BY) | 対応 | 最も高速化効果が大きい領域 |
| DataFrame API(filter/groupBy/join/agg) | 対応 | SQLと同等の最適化が適用 |
| Delta Lake読み取り(Scan) | 対応 | Parquetデコードの高速化 |
| Delta Lake書き込み(INSERT/MERGE/UPDATE/DELETE) | 対応 | 書き込みパスもPhotonで処理 |
| Parquetファイル読み書き | 対応 | ネイティブParquetリーダー |
| JOIN(Hash Join / Sort Merge Join) | 対応 | 大規模JOINで顕著な効果 |
| 集約(SUM/COUNT/AVG/MIN/MAX) | 対応 | ベクトル化により高速 |
| ソート(ORDER BY) | 対応 | 大規模データのソートに効果的 |
| ウィンドウ関数 | 対応 | ROW_NUMBER, RANK等 |
| Structured Streaming(マイクロバッチ) | 対応 | バッチ処理部分がPhotonで高速化 |
以下のワークロードはPhotonで実行されず、自動的にJVMベースのSparkエンジンにフォールバックします。 Photonが有効な環境でも、これらの処理はクラシックSparkとして動作します。
| ワークロード | Photon対応 | 理由・備考 |
|---|---|---|
| RDD API | 非対応 | 低レベルAPIはPhotonの最適化対象外 |
| Python UDF(通常のUDF) | 非対応 | Pythonプロセスで実行されるためC++エンジン外 |
| Scala/Java UDF | 非対応 | JVMで実行されるカスタムコードはPhoton対象外 |
| Pandas UDF(Arrow最適化UDF) | 非対応 | Pythonプロセスでの実行 |
| Structured Streaming 状態処理(mapGroupsWithState等) | 非対応 | カスタム状態管理はJVM側で処理 |
| MLlib / SparkML | 非対応 | ML特化の処理パスはPhoton外 |
| GraphX | 非対応 | グラフ処理はJVM実行 |
| CSV/JSONファイルの読み取り(一部) | 部分対応 | ParquetやDeltaほどの効果はない |
Photonが有効なクラスタで非対応のオペレーションを実行した場合、エラーにはなりません。 該当オペレーションだけが自動的にJVMベースのSparkエンジンにフォールバックし、残りのPhoton対応オペレーションはPhotonで実行されます。
# 例:Photon対応クラスタでUDFを含むクエリを実行
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
# このUDFはJVMフォールバックで実行される
@udf(returnType=StringType())
def custom_transform(value):
return value.upper() + "_PROCESSED"
# filterとgroupByはPhotonで実行、UDF部分のみJVMで実行
result = (
spark.read.format("delta").load("/mnt/silver/orders")
.filter("amount > 100") # Photon
.withColumn("label", custom_transform("region")) # JVM fallback
.groupBy("label").sum("amount") # Photon
)
result.display()クエリ実行計画をSpark UIで確認すると、Photonで実行されたオペレータには「Photon」プレフィックス(PhotonScan、PhotonHashAggregateなど)が表示されます。 プレフィックスがないオペレータはJVMフォールバックしていると判断できます。
Photonは以下のいずれかの方法で有効化できます。クラスタ作成時に設定するのが最も一般的です。
// Cluster Policy でPhotonを強制する例
{
"runtime_engine": {
"type": "fixed",
"value": "PHOTON"
},
"spark_version": {
"type": "regex",
"pattern": "15\\.4\\.x-photon-scala.*",
"defaultValue": "15.4.x-photon-scala2.12"
}
}Serverless SQL Warehouseでは、Photonがデフォルトで有効です。追加設定なしにPhotonの高速化が適用されます。
Photonの導入判断にはDBU単価と処理時間の両方を考慮する必要があります。 以下は各コンピュートオプションのコスト特性の概要です(実際の単価はクラウドプロバイダやリージョンにより異なります)。
| コンピュートタイプ | DBU単価 | 処理速度 | 総コスト傾向 | 適したユースケース |
|---|---|---|---|---|
| Classic Runtime(JVM) | 基準 | 基準 | 処理時間が長いと高額化 | UDF多用、RDD処理、ML |
| Photon Runtime | Classicより高い | 2〜8倍高速(対応ワークロード) | 高速化で総DBU削減の可能性 | SQL/DataFrame中心のETL、大規模JOIN・集約 |
| Serverless SQL Warehouse | 最も高い | Photon + 即時起動 | 待機コストゼロ + 高単価 | BIクエリ、ダッシュボード、アドホック分析 |
Photonの費用対効果を見るには、同一ワークロードをClassicとPhotonで実行し、実行時間とDBU消費量を比較するのが確実です。 JOIN・集約・ソートが中心のETLジョブでは、Photonの単価上昇を処理時間短縮が上回ることが一般的です。
Data Engineer Associate
問題 1
Photon対応のDatabricks Runtimeを使用しているクラスタで、PythonのカスタムUDFを含むSpark SQLクエリを実行した。この場合の動作として正しいものはどれか。
正解: C
Photonは非対応オペレーション(カスタムUDF含む)を検出すると、そのオペレーションだけをJVMベースのSparkエンジンにフォールバックします。クエリ全体がエラーになることはなく、Photon対応の他のオペレーション(filter、groupBy、JOINなど)はPhotonで実行されます。
PhotonはカスタムUDFを高速化できますか?
いいえ、PhotonはC++で実装されたベクトル化エンジンであり、PythonやScalaで書かれたカスタムUDFはPhotonでは実行されません。UDFの処理は自動的にJVMベースのSparkエンジンにフォールバックします。UDFをPhotonの恩恵に変えたい場合は、可能な限りSpark SQLの組み込み関数やDataFrame APIに書き換えることを推奨します。
Photonを有効にするとコストは増えますか?
Photon対応のDBR(Databricks Runtime)を使うと、1 DBUあたりの単価がClassicより高くなります。ただしPhotonによりクエリ実行時間が大幅に短縮されると、総DBU消費量が減り結果的にコスト削減になるケースが多いです。特にJOIN・集約・ソートが多いワークロードでは、Photonの単価上昇を性能向上が上回ることが一般的です。
Photonが効かないクエリをどう見分けますか?
Spark UIのクエリ実行計画で、各オペレータに「Photon」プレフィックスが付いているかで確認できます。PhotonScan、PhotonGroupingAggなどが表示されればPhotonで実行されています。プレフィックスがないオペレータはJVMフォールバックしています。また、spark.databricks.photon.allDataSources.enabledなどの設定でPhoton適用範囲を制御できます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...