Exchange Materialization

Prestoでは、メモリを大量に消費するクエリをサポートするためにExchange Materializationを使用できます。このメカニズムは、PrestoのMPPアーキテクチャランタイムにMapReduceスタイルの実行をもたらし、ディスクへのスピルと組み合わせて適用できます。

はじめに

他のMPPデータベースと同様に、PrestoはRPCシャッフルを利用して、結合と集計のための効率的で低遅延のクエリ実行を実現します。ただし、RPCシャッフルでは、クエリが完了するまですべてのプロデューサーとコンシューマーが同時に実行される必要もあります。

これを説明するために、集計クエリを考えます

SELECT custkey, SUM(totalprice)
FROM orders
GROUP BY custkey

次の図は、このクエリがPrestoのクラシックモードでどのように実行されるかを示しています。

../_images/rpc_shuffle_execution.png

Exchange Materializationを使用すると、中間シャッフルデータはディスクに書き込まれます(現在、常に一時的なHiveバケットテーブルです)。これにより、集計側で柔軟なスケジューリングポリシーが可能になります。集計データの一部のみを同時にメモリに保持する必要があるためです。この実行戦略は、Prestoでは「グループ化された実行」と呼ばれます。

../_images/materialized_shuffle_execution.png

Exchange Materialization の使用

Exchange Materializationは、次の3つのセッションプロパティを設定することで、クエリごとに有効にできます。 exchange_materialization_strategypartitioning_provider_catalog、および hash_partition_count

SET SESSION exchange_materialization_strategy='ALL';

-- Set partitioning_provider_catalog to the Hive connector catalog
SET SESSION partitioning_provider_catalog='hive';

-- We recommend setting hash_partition_count to be at least 5X-10X about the cluster size
-- when exchange materialization is enabled.
SET SESSION hash_partition_count = 4096;

ユーザーがExchange Materializationを簡単に使用できるように、管理者はセッションプロパティマネージャーを利用して、クライアントタグに基づいてセッションプロパティを自動的に設定できます。セッションプロパティマネージャーの例では、 high_mem_etl タグを持つクエリに対してExchange Materializationを自動的に有効にする方法を示しています。