投稿日: Jul 11, 2022

Apache Spark 用 Amazon EMR ランタイムは、パフォーマンスに最適化された Apache Spark 用ランタイム環境であり、Amazon EMR クラスター 5.28 以降において利用可能、かつデフォルトで有効化されています。Spark 用 Amazon EMR ランタイムは、最大 3 倍高速なうえ、オープンソースの Spark と 100% の API 互換性があります。

本日発表する Result Fragment Caching は、Apache Spark 用 Amazon EMR ランタイムで利用可能な新機能であり、データの静的サブセットを対象としたクエリを高速化することが可能です。TPC-H のベンチマークを用いた AWS の社内テストでは、Result Fragment Caching を使用したとき、ローリング関数と増分ウィンドウ関数を使用しているクエリにおいてクエリパフォーマンスが一貫して最大 15.6 倍高速になりました。

お客様は、時間が経過しても変化しないデータを Amazon S3 に保存していることがよくあります。しかし、このようなデータセットに対してクエリを繰り返し実行すると、そのたびに結果を再計算する必要が生じます。例えば、e コマースの注文データを考えてみてください。これには、30 日以内に配達や返品が行われた注文に関する情報が含まれています。あるユーザーが、特定の商品に関する年間の注文傾向を日次単位で比較したいと考えています。すべての注文データは、過去 30 日間のデータを除き、ほとんど変更されることはありません。しかし、過去 1 年間の毎日の注文データを集計するクエリでは、クエリを実行するたびに、その年の 1 日ごとに結果を再計算する必要があります。Result Fragment Caching では、結果のフラグメント (Spark のクエリプランのサブツリーから得られた結果の各部分) を自動的にキャッシュして、以降のクエリ実行時にその結果を再利用することで、この問題に対処できます。Result Fragment Caching を使用すれば、キャッシュされたデータをフラグメントとして最大限に再利用できるようになります。つまり、結果の各部分を後続のクエリで再利用できます。キャッシュからの結果を返すためにはクエリが完全に一致していなければならない Result Set Caching とは対照的だと言えます。結果のフラグメントは、お客様が指定した S3 バケットに保存して、複数のクラスターをまたいで再利用できます。これにより、クエリを高速化できます。特に、結果が入力データセットよりも非常に小さい場合に有効です。Result Fragment Caching を使用することで、過去 1 年間の注文を集計するクエリを繰り返し実行しても、過去 30 日間の変更されたデータを計算するだけで済みます。その年におけるそれ以前の日付については、集計された結果がキャッシュから簡単に得られるため、クエリパフォーマンスが大幅に向上します。現在の日付に対してのみ挿入される、ほとんど変更されることのないデータ (IOT イベント用のデータや、クリックストリームデータなど) に対するクエリの場合は、この高速化がより顕著になります。万一、データが変更された場合でも、Result Fragment Caching はキャッシュされたデータを自動的に検出して無効化することにより、データの正確性を確保します。

Result Fragment Caching は、Apache Spark の Amazon EMR ランタイムが利用可能なすべてのリージョンで利用できます。

Result Fragment Caching の使用を開始するには、こちらのドキュメントを参照してください。