Presto Concepts¶
概要¶
Prestoを理解するには、まずPrestoドキュメント全体で使用されている用語と概念を理解する必要があります。
エンドユーザーにとっては、ステートメントとクエリは理解しやすいですが、効率的なクエリを実行するためにPrestoを最大限に活用するには、ステージやスプリットなどの概念に精通している必要があります。Presto管理者またはPrestoコントリビューターとしては、Prestoのステージがタスクにどのようにマッピングされ、タスクにデータ処理を行う一連のドライバが含まれているかを理解する必要があります。
このセクションでは、Presto全体で参照されるコア概念の明確な定義を提供し、これらのセクションは最も一般的なものから最も具体的なものへと並べられています。
サーバーの種類¶
Prestoサーバーには、リソースマネージャー、コーディネーター、ワーカーの3種類があります。次のセクションでは、それらの違いについて説明します。
リソースマネージャー¶
Prestoリソースマネージャーは、すべてのコーディネーターとワーカーからデータを収集し、クラスタのグローバルビューを構築するサーバーです。分散型コーディネーターを持つPrestoインストールには、リソースマネージャーが必要です。クラスタは複数のリソースマネージャーをサポートしており、それぞれがプライマリとして機能します。
コーディネーターとワーカーは、Thrift APIを使用してリソースマネージャーと通信します。
コーディネーター¶
Prestoコーディネーターは、ステートメントの解析、クエリの計画、およびPrestoワーカーノードの管理を担当するサーバーです。Prestoインストールの「頭脳」であり、クライアントが実行のためにステートメントを送信するために接続するノードでもあります。すべてのPrestoインストールには、1つ以上のPrestoワーカーとともにPrestoコーディネーターが必要です。開発またはテストの目的では、Prestoの単一インスタンスを構成して、両方の役割を実行するようにすることができます。
コーディネーターは各ワーカーの活動を監視し、クエリの execution を調整します。コーディネーターは、一連のステージを含むクエリの論理モデルを作成し、それをPrestoワーカーのクラスタ上で実行される一連の接続されたタスクに変換します。
コーディネーターは、REST APIを使用してワーカーとクライアントと通信します。
ワーカー¶
Prestoワーカーは、Prestoインストール内のサーバーであり、タスクの実行とデータの処理を担当します。ワーカーノードはコネクターからデータを取得し、相互に中間データを交換します。コーディネーターは、ワーカーから結果を取得し、最終結果をクライアントに返す役割を担います。
Prestoワーカープロセスが起動すると、コーディネーターのディスカバリサーバーに自身をアドバタイズし、タスクの実行のためにPrestoコーディネーターで使用可能になります。
ワーカーは、REST APIを使用して他のワーカーとPrestoコーディネーターと通信します。
データソース¶
このドキュメント全体で、コネクター、カタログ、スキーマ、テーブルなどの用語を読みます。これらの基本的な概念は、特定のデータソースのPrestoモデルを網羅しており、次のセクションで説明されています。
コネクター¶
コネクターは、HiveやリレーショナルデータベースなどのデータソースにPrestoを適合させます。コネクターは、データベースのドライバと同じように考えることができます。これは、標準APIを使用してリソースとPrestoが対話できるようにするPrestoのSPIの実装です。
Prestoには、JMX用のコネクター、組み込みシステムテーブルへのアクセスを提供するSystemコネクター、Hiveコネクター、およびTPC-Hベンチマークデータを提供するように設計されたTPCHコネクターなど、いくつかの組み込みコネクターが含まれています。多くのサードパーティ開発者がコネクターを提供しており、Prestoはさまざまなデータソースのデータにアクセスできます。
すべてのカタログは、特定のコネクターに関連付けられています。カタログ設定ファイルを確認すると、各ファイルには、カタログマネージャーが特定のカタログのコネクターを作成するために使用する必須プロパティconnector.name
が含まれていることがわかります。同じコネクターを使用して、類似したデータベースの2つの異なるインスタンスにアクセスする複数のカタログを持つことができます。たとえば、2つのHiveクラスタがある場合、Hiveコネクターを使用する2つのカタログを単一のPrestoクラスタに構成して、両方のHiveクラスタのデータにクエリを実行できます(同じSQLクエリ内でも可能)。
カタログ¶
Prestoカタログにはスキーマが含まれ、コネクターを介してデータソースを参照します。たとえば、JMXカタログを構成して、JMXコネクターを介してJMX情報へのアクセスを提供できます。PrestoでSQLステートメントを実行するときは、1つ以上のカタログに対して実行します。他のカタログの例としては、Hiveデータソースに接続するためのHiveカタログなどがあります。
Prestoでテーブルを参照する場合、完全修飾テーブル名は常にカタログにルート付けされます。たとえば、hive.test_data.test
という完全修飾テーブル名は、hive
カタログのtest_data
スキーマ内のtest
テーブルを参照します。
カタログは、Presto設定ディレクトリに格納されているプロパティファイルで定義されます。
スキーマ¶
スキーマは、テーブルを整理する方法です。カタログとスキーマを組み合わせることで、クエリできるテーブルのセットが定義されます。PrestoでHiveやMySQLなどのリレーショナルデータベースにアクセスする場合、スキーマはターゲットデータベースと同じ概念に変換されます。その他のコネクターの種類では、基盤となるデータソースにとって意味のある方法で、テーブルをスキーマに整理することを選択する場合があります。
テーブル¶
テーブルは、名前付き列と型に整理された順序付けられていない行のセットです。これは、任意のリレーショナルデータベースと同じです。ソースデータからテーブルへのマッピングは、コネクターによって定義されます。
クエリ実行モデル¶
PrestoはSQLステートメントを実行し、これらのステートメントを、コーディネーターとワーカーの分散クラスタ全体で実行されるクエリに変換します。
ステートメント¶
PrestoはANSI互換のSQLステートメントを実行します。Prestoドキュメントでステートメントを参照する場合は、句、式、述語で構成されるANSI SQL標準で定義されているステートメントを参照しています。
一部の読者は、このセクションでステートメントとクエリの概念を個別にリストしている理由に興味があるかもしれません。これは、Prestoではステートメントが単にSQLステートメントのテキスト表現を参照しているためです。ステートメントが実行されると、Prestoはクエリとクエリプランを作成し、その後、一連のPrestoワーカーに分散されます。
クエリ¶
Prestoがステートメントを解析すると、ステートメントをクエリに変換し、分散クエリプランを作成します。これは、Prestoワーカーで実行される一連の相互接続されたステージとして実現されます。Prestoでクエリの情報を取得すると、ステートメントへの応答として結果セットの作成に関与するすべてのコンポーネントのスナップショットが取得されます。
ステートメントとクエリの違いは単純です。ステートメントはPrestoに渡されるSQLテキストと考えることができ、クエリは、そのステートメントを実行するためにインスタンス化された構成とコンポーネントを参照します。クエリには、ステージ、タスク、スプリット、コネクター、その他のコンポーネントとデータソースが含まれており、これらが連携して結果を生成します。
ステージ¶
Prestoがクエリを実行するときは、実行をステージの階層に分割することによって実行します。たとえば、PrestoがHiveに格納されている10億行のデータを集計する必要がある場合、複数の他のステージの出力を集計するルートステージを作成することによって実行します。これらはすべて、分散クエリプランのさまざまなセクションを実装するように設計されています。
クエリの構成要素となるステージの階層構造はツリーに似ています。すべてのクエリにはルートステージがあり、他のステージからの出力を集約する役割を担います。ステージは、コーディネーターが分散クエリプランをモデル化するために使用するものであり、ステージ自体はPrestoワーカー上で実行されるわけではありません。
タスク¶
前セクションで述べたように、ステージは分散クエリプランの特定のセクションをモデル化しますが、ステージ自体はPrestoワーカー上で実行されません。ステージがどのように実行されるかを理解するには、ステージがPrestoワーカーのネットワークに分散された一連のタスクとして実装されていることを理解する必要があります。
タスクはPrestoアーキテクチャにおける「作業馬」です。分散クエリプランは一連のステージに分解され、次にタスクに変換され、それによってスプリットが処理されます。Prestoタスクには入力と出力があり、一連のタスクによってステージを並列に実行できるのと同様に、タスクは一連のドライバーと並列に実行されます。
スプリット¶
タスクは、より大きなデータセットの一部であるスプリットを操作します。分散クエリプランの最下位レベルにあるステージは、コネクタからスプリットを介してデータを取得し、分散クエリプランの上位レベルにある中間ステージは他のステージからデータを取得します。
Prestoがクエリをスケジュールすると、コーディネーターはコネクタに対して、テーブルで使用可能なすべてのスプリットのリストを照会します。コーディネーターは、どのマシンでどのタスクが実行され、どのスプリットがどのタスクによって処理されているかを追跡します。
ドライバー¶
タスクには、1つ以上の並列ドライバーが含まれています。ドライバーはデータに作用し、演算子を組み合わせて出力を生成します。その出力はタスクによって集約され、別のステージの別のタスクに配信されます。ドライバーは演算子インスタンスのシーケンスです。ドライバーをメモリ内の物理的な演算子のセットと考えることができます。これはPrestoアーキテクチャにおける最低レベルの並列処理です。ドライバーは1つの入力と1つの出力を持っています。
演算子¶
演算子はデータの消費、変換、生成を行います。たとえば、テーブルスキャンはコネクタからデータを取得し、他の演算子が消費できるデータを生成し、フィルタ演算子はデータを使用して、入力データに述語を適用することによりサブセットを生成します。
交換¶
交換は、クエリの異なるステージ間でPrestoノード間でデータ転送を行います。タスクはデータを出力バッファに書き込み、交換クライアントを使用して他のタスクからデータを読み取ります。