Impalaの概要
Impalaはリアルタイムクエリツールです。主な目的は、SQL-on-Hadoop操作を高速かつ効率的にすることです。これにより、HadoopでのビッグデータSQLクエリのパフォーマンスが向上します。Impalaは、ビッグデータクエリツールの補足です。Impalaは、HiveなどのMapReduceで構築されたバッチ処理フレームワークを置き換えません。
Impalaは、HDFS、HBase、またはAmazon Object Storage Service(S3)に保存されているデータを直接読み取ります。Hiveと同じストレージプラットフォームを使用するだけでなく、impalaはHiveと同じメタデータ、SQL構文(Hive SQL)、ODBCドライバー、およびユーザーインターフェイス(HUEのImpalaクエリUI)も使用します。
MapReduceおよびその他のフレームワーク(sparkなど)に基づくHiveは、抽出、変換、ロード(ETL)を伴うジョブなど、長時間実行されるバッチジョブに適しています。Impalaはインタラクティブなクエリに適しています。
遅延を回避するために、ImpalaはMapReduceをバイパスし、専用の分散クエリエンジンを介してデータに直接アクセスします。これは、商用分散RDBMSのクエリエンジンとよく似ています。この結果は、クエリの種類と構成に応じて、ハイブよりも桁違いに速いパフォーマンスです。
ImpalaがApach Hadoopでどのように機能するか
ImpalaがHadoopエコシステムにどのように適合するか
Impalaは、Hadoopエコシステムの多くの使い慣れたコンポーネントを利用しています。Impalaは他のHadoopコンポーネントと(コンシューマーおよびプロデューサーとして)データを交換できるため、ETLおよびELTパイプラインに柔軟に配置できます。
ImpalaとHiveの連携
Impalaの主な目的は、SQL-on-Hadoop操作を高速かつ効率的にすることです。実際のアプリケーションでは、多くのHadoopユーザーの既存のHiveデータを使用して、長時間実行されるバッチ指向のSQLクエリを実行します。
Impalaは、HiveによってMySQLまたはPostgreSQLに格納されているメタデータ情報を使用し、独自のメタデータ情報の一部を同じデータベースに格納できます。すべての列がImpalaでサポートされているデータ型、ファイル形式、およびファイル形式を使用している限り、このMySQLまたはPostgreSQLはメタストアと呼ばれます。コーデックを圧縮すると、ImpalaはHiveによって定義またはロードされたテーブルにアクセスできます。
Impalaのメタデータとメタストアの概要
上記のように、Impalaはメタストアと呼ばれるデータベースにテーブルメタデータ情報を保持し、HDFS内のブロックの物理的な場所など、いくつかの下位レベルのメタデータ情報も保存します。
大量のデータまたは複数のパーティションを持つテーブルの場合、テーブルのすべてのメタデータの取得には非常に時間がかかり、場合によっては数分かかることがあります。したがって、各Impalaノードは、同じテーブルに対する今後のクエリのためにこれらのメタデータをすべてキャッシュします。
テーブルのメタデータまたはテーブル内のデータが更新されている場合、クラスター内の他のすべてのImpaladプロセスは最新のメタデータを受信し、古いキャッシュメタデータを置き換えてから、テーブルにクエリを実行する必要があります。Impala 1.2以降では、メタデータの更新は自動的に行われ、カタログプロセスを通じて調整されます。
Hiveを介してテーブルに加えられた変更、またはHDFS内のファイルへの手動の変更については、REFRESHステートメント(新しいデータファイルが既存のテーブルに追加された場合)またはINVALIDATAステートメント(まったく新しいテーブルの場合)を使用する必要があります。テーブルを削除した後、HDFSリバランス操作を実行するか、データファイルを削除します)。INVALIDATE METADATAを実行すると、メタストアによって追跡されるすべてのテーブルのメタデータが取得されます。Impalaの外部のプログラム(Hiveなど)によって特定のテーブルのみが変更されていることがわかっている場合は、影響を受ける各テーブルに対してREFRESH table_nameを実行して、これらのテーブルの最新のメタデータのみを取得できます。
ImpalaがHDFSを使用する方法
Impalaは、主要なデータストレージメディアとして分散ファイルシステムHDFSを使用します。Impalaは、HDFSが提供する冗長性に依存して、単一ノードでのハードウェアまたはネットワークの停止を防止します。Impalaテーブルデータは、おなじみのHDFSファイル形式と圧縮コーデックを使用して、HDFS内のデータファイルとして物理的に表現されます。データファイルが新しいテーブルのディレクトリに表示されると、Impalaはファイル名に関係なくすべてのデータファイルを読み取ります。名前がImpalaによって制御されるファイルに新しいデータが追加されます。
ImpalaはDataNodeと同じノードにデプロイできるため、Impalaはローカルファイルを直接読み取ることができ、ネットワーク転送で消費されるリソースを大幅に削減できます。
ImpalaがHBaseを使用する方法
HBaseは、ImpalaのデータストレージメディアHDFSの代替として機能します。これは、SQLサポートが組み込まれていないHDFS上に構築されたデータベースストレージシステムです。多くのHadoopユーザーはすでにそれを構成しており、大きな(通常はスパースな)データセットをそこに格納しています。Impalaでテーブルを定義し、それらをHBaseの同等のテーブルにマッピングすることで、Impalaを介してHBaseテーブルのコンテンツをクエリでき、ImpalaテーブルやHBaseテーブルを含む結合クエリを実行することもできます。
Impalaはどのようにクエリを完了しますか
- ODBCまたはJDBCクライアントなどの標準化されたSQLインターフェースを提供することにより、ユーザーはSQLの一部をImpalaに送信します。これはクラスター内の任意のImpaladに送信でき、このImpaladがこのクエリステートメントのコーディネーターになります。
- ImpalaはSQLの一部を解析して分析し、最高の実行効率を得るためにImpalaインスタンスが実行する必要のあるタスクを決定します。
- HDFSやHBaseなどのストレージサービスは、ローカルのImpalaインスタンスにデータを提供します。
- 各Impalaインスタンスはデータを元のコーディネーターに返し、結果をクライアントに返します。
インパラの建築
クライアント:Hueを含む、ODBCクライアント、JDBCクライアント、およびImpalaシェルは、Impalaと対話できます。
Hive Metastore:ImpalaはHiveのメタデータ情報を使用でき、Hiveのメタデータを通じて、Hiveのデータベースとこれらのデータベースの構造を取得できます。テーブル構造を作成、削除、変更し、Impala SQLを介してテーブルにデータをロードすると、関連するメタデータが変更され、すべてのimpalaノードに自動的にブロードキャストされます。
Impala:ImpalaはDataNodeで実行され、クエリステートメントを調整および実行します。各Impalaインスタンスは、Impalaクライアントからのクエリを受信、計画、調整できます。クエリ作業はImpalaノードに分散され、これらのノードはこれらのクエリステートメントを並列に実行するワーカーとして機能します。
HBaseおよびHDFS:照会されるデータを格納するために使用されます。
Impalaコンポーネント
インパラド
Impalaは、分散型の超並列処理(MPP)データベースエンジンです。Impalaには、クラスター内の特定のホストに分散されたコアのImpaladプロセスが1つだけあります。
インパラドはインパラのデーモンであり、インパラの中核コンポーネントとして、次の重要な機能を持っています。
- データファイルの読み取りと書き込み。
- impalaシェルコマンド、Hue、JDBCまたはODBCから送信されたクエリを受け入れます。
- クエリを並列化し、クラスター間で作業を分散します。
- 中間クエリ結果を中央コーディネーターに送信します。
インパラドは、次の方法で展開できます。
- hdfsとimpalaが同じクラスターにある場合、impaladとDataNodeは同じマシンにデプロイされます。
- Impalaはコンピューティングクラスタに個別にデプロイされ、HDFS、S3、ADLなどからリモートでデータを読み取ります。
ImpaladはStateStoreと継続的に通信して、どのデーモンが正常で、新しいタスクを受け入れることができるかを確認します。また、Impalaクラスター内のデーモンがデータベースまたはテーブルを作成、変更、または削除するか、Impalaを介してINSERTまたはLOAD DATAステートメントを実行する限り、カタログ化されたプロセス(Impala 1.2で導入)からブロードキャストメッセージを受け取ります。Catalogedはメタデータ情報をREFRESHまたはINVALIDATEします。Impala 1.2以前は、メタデータはImpalaデーモン間で調整されていました。
ステートストア
StateStoreコンポーネントは、クラスター内のすべてのImpalaデーモンの実行ステータスをチェックし、その結果を継続的に各デーモンに渡すために使用されます。
ハードウェア障害、ネットワークエラー、ソフトウェアの問題、またはその他の理由でimpaladが失敗した場合、StateStoreは他のすべてのImpaladプロセスに通知し、その後のクエリで、アクセスできないImpaladプロセスへの要求を回避できます。
カタログ
カタログコンポーネントは、メタデータの変更をクラスター内のインパラドプロセスに送信するために使用され、catalogdと呼ばれるデーモンによって表されます。このサービスは1台のマシンでのみ開始する必要があります。リクエストはStateStoreプロセスを介して渡されるため、カタログとStateStoreは同じマシンで実行する必要があります。
--load_catalog_in_background
オプションは、テーブルのメタデータがロードされるタイミングを制御できます。
- に設定する
false
と、テーブルが最初に参照されたときにテーブルのメタデータが読み込まれます。つまり、最初の実行が遅くなる可能性があります。Impala 2.2以降、デフォルト--load_catalog_in_background
値はfalse
です。 - に設定する
true
と、クエリにメタデータが必要ない場合でも、カタログサービスはテーブルのメタデータをロードしようとします。したがって、メタデータを必要とする最初のクエリを実行すると、メタデータは既に読み込まれている可能性があります。ただし、次の理由により、オプションをに設定しないことをお勧めしますtrue
。- バックグラウンドの読み込みは、クエリのメタデータの読み込みを妨げる可能性があります。たとえば、起動時またはメタデータの無効化後に、クエリに必要なメタデータがロードされていないか、削除されている可能性があります。その期間はメタデータの量に依存し、ランダムにクエリの実行時間が長くなる可能性があり、診断が困難です。
- Impalaは、決して使用できないテーブルのメタデータをロードする場合があり、それによってカタログサイズが増加し、それによってカタログサービスとImpaladのメモリ使用量が増加する場合があります。