Prestoについての個人的まとめ その1

 

いわゆるビッグデータを解析するときに使うツール(DWH)といえばどんなものがあるだろうか?

私見ではあるが以下のものが使われるのが一般的ではないだろうか。

 

  • BigQuery
  • RedShift
  • Hive
  • Presto

 

今回は上記の中からPrestoについての特徴について個人的なメモを記したい。

Prestoとは

prestodb.io

そもそもPrestoとは何か。

詳細については公式のドキュメントに譲るとして、ざっくりした説明としてはFacebookが開発したHiveよりも高速にクエリを実行してくれるクエリエンジンの事である。ここで注意して頂きたいのは、所謂DWHとは違ってPresto自体はデータを保持しておらず、データを処理する分散クエリエンジンであるという点である。

そのためデータはS3なりCassandraなり別の場所に保存しておく必要がある。逆に言えば、データ自体をPrestoで管理する必要はない。

かわりに後述のConnectorを利用してデータを保存している対象に接続する必要がある。コネクターさえあればどんなデータソースにもクエリを投げることは可能だ。

Prestoの特徴

一般的にDWHはデータの持ち方(列指向)のデータの持ち方をすることでIO処理を減らし、高速化する。対してPrestoは前述の通り、データ自体を保持していない。つまり、一般的なDWHのようなデータの持ち方での処理の高速化はできない。

代わりに中間処理をメモリに保持することで処理の高速化を実現している。

そのためクエリレスポンスがHiveと比較するとかなり良い。

またそのためインタラクティブなデータ分析などに向いている。

(より正確に言うと、Hiveがインタラクティブな処理に向いていないため、インタラクティブな処理を実行するためのクエリエンジンとしてPrestoが開発された。)

逆に言ってしまえばメモリを大量に消費するようなクエリをPrestoで実行すると、メモリ不足により処理が失敗してしまう。歴史的にはHiveを代替するためにPrestoがあるというよりもHiveの苦手な領域を補うためにPrestoが存在すると考えるほうが正しく、両者は補完関係にあると考えるのが良いのではないかと思われる。

 

Prestoのアーキテクチャ

サーバーのタイプとしては以下の2種類が存在する。

  • Coordinator(コーディネーター)
  • Worker(ワーカー)

Coordinatorについての説明は以下のとおりである。

The Presto coordinator is the server that is responsible for parsing statements, planning queries, and managing Presto worker nodes. It is the “brain” of a Presto installation and is also the node to which a client connects to submit statements for execution. Every Presto installation must have a Presto coordinator alongside one or more Presto workers. For development or testing purposes, a single instance of Presto can be configured to perform both roles.

The coordinator keeps track of the activity on each worker and coordinates the execution of a query. The coordinator creates a logical model of a query involving a series of stages which is then translated into a series of connected tasks running on a cluster of Presto workers.

Coordinators communicate with workers and clients using a REST API.

(拙訳)

Prestoのコーディネーターはクエリのパース、実行計画の作成、およびワーカーノードの管理の役割を担う。コーディネーターはPrestoのインストール際の頭脳と呼ぶべきものであり、また同時にクエリを実行したいClientが接続をするノードでもある。1または2台のワーカーノードともにPresoコーディネーターが必ずインストールされる。テストまたは開発用の用途であれば、一つのPrestoインスタンスが両方の役割(コーディネーターとワーカー)を担わせるように設定することが可能だ。

コーディネーターは、各ワーカーの状況をトラックし、またクエリの実行を制御する。コーディネーターは一連のステージを含んだクエリの論理モデルを作成する。またその論理モデルは、ワーカーのクラスター上で実行される一連のタスクにさらに分解される。

コーディネーターはREST APIを通じてワーカーサーバーと通信を行う。

 

ざっくりと言えば、コーディネーターはワーカーのマネージャーのような存在である。

Worker

A Presto worker is a server in a Presto installation which is responsible for executing tasks and processing data. Worker nodes fetch data from connectors and exchange intermediate data with each other. The coordinator is responsible for fetching results from the workers and returning the final results to the client.

When a Presto worker process starts up, it advertises itself to the discovery server in the coordinator, which makes it available to the Presto coordinator for task execution.

Workers communicate with other workers and Presto coordinators using a REST API.

 (拙訳)

Prestoのワーカーはタスクの実行とデータ処理の役割を担っている。ワーカーノードはデータをコネクターから取得し、中間データをワーカー同士で交換している。コーディネーターはワーカーから結果を取得し、クライアントに返す役割を担っている。

Prestoのワーカープロセスが起動すると、自分自身をコーディネーターのディスカバリーサーバーにアドバタイズして、Prestoワーカーからタスク実行の通信が受け取れるようにしている。

ワーカーは自身以外のワーカーやコーディネーターとREST API経由で通信をしている。

 ワーカーは実際のデータ処理部分を担っている。

 

まとめ

  • PrestoはDWHではなくクエリエンジン
  • ネクターを使って、データソースに接続する
  • インメモリ処理のためHiveに比べてレスポンスが早い
  • コーディネーターがクエリのパース、実行計画の作成ワーカーノードの管理を行う
  • ワーカーがタスクの実行とデータ処理を行う。