Hadoopはどのように動くのか ─並列・分散システム技術から読み解くHadoop処理系の設計と実装

第17回 Impalaの設計と実装[1]

この記事を読むのに必要な時間:およそ 2.5 分

Impalaの構成要素

動作の説明に先立って,Impalaの構成要素およびImpalaに関連するコンポーネントについて説明します。Impalaは,ほかのHadoopのエコシステム同様,複数の要素から成り立っています。

Impala Daemon(impalad)

ImpalaにおけるSQL処理の中核を担うデーモンです。

後述のDataNodeが起動する各ノードで起動し,クエリを受け取った後にほかのimpaladと連携してクエリを実行し,クライアントに結果を返します。クライアントは,どのノード上のimpaladにアクセスすることも可能です。特に,クエリ実行時にクライアントと直接通信を行うimpaladは,クエリ実行全体を管理する役割を持ち,コーディネータと呼ばれます。

Catalog Server(catalogd)

Hadoopクラスタ上でImpalaが使用するメタデータを管理するデーモンであり,クラスタ上で1つだけ起動されます。

catalogdは,Hiveのカタログ管理デーモンであるMetastore(テーブル定義などのメタ情報)を元に動作し,Impalaが発行したDDLをMetastoreに保存する中継役を担います。また,Metastoreの情報とHDFSのメタデータをキャッシュし,問い合わせにおいて実行計画を作成する際のメタデータアクセスを高速化します。

StateStore

Hadoopクラスタ上でimpaladの状態を監視するデーモンであり,クラスタ上で1つだけ起動されます。

このデーモンが各impaladの状況を監視し連携することで,停止しているimpaladに処理を要求されないように調整します。また,catalogdの保持する情報を各impaladに配布する役割も担います。

下記の図1でオレンジ色の部分がImpalaのデーモンになります。

図1 Impalaの構成要素

図1 Impalaの構成要素

続けて,Impalaそのものではないものの強く関連しているコンポーネントについて紹介します。これらは上の図で青色の部分です。

Impala クライアント

クエリを発行するクライアントプログラムもImpalaにおける重要なコンポーネントの1つです。impala-shellというコマンドラインクライアントもありますが,JDBC/ODBCを使用してユーザーのアプリケーションからクエリを実行することも可能です。

HDFS NameNode(NN)

HDFSが管理するブロックのメタデータを管理するデーモンです。Impalaでのクエリ実行時のHDFSアクセスに必要な情報もNameNodeから提供されます。NameNodeについては本連載第11回のHDFSにおけるレプリケーション第14回のHDFS,YARN,MapReduceの実装の内容も参考にしてください。

HDFS DataNode(DN)

HDFSが管理するブロック自体を管理するデーモンです。Impaladは,HDFS上のファイルにアクセスするために,NameNodeから取得したメタデータを元に,DataNodeからデータを取得します。そのために,ImpaladはDataNodeと同じノードで起動する必要があります。DataNodeについても,NameNodeと同様,本連載第11回のHDFSにおけるレプリケーションや第14回のHDFS,YARN,MapReduceの実装で紹介されています。

Hive Metastore Server(HMS)

Hiveのメタデータを管理するデーモンです。前述のとおり,Impalaはテーブル定義の情報をHiveのMetastoreに保存します。

今回の連載では,おもにデータ処理を行うimpaladの動作に焦点を当てて見ていきます。

クエリ実行時の処理の流れ

上述のように,Impalaではクライアントからクラスタ上の任意のimpaladに接続してクエリを発行して結果を得ることができます。図2は,この処理の順序を単純化して示したものです。実際にクエリを受け取ったimpaladがコーディネータとなり,下記の流れでクエリを実行します。

  1. クライアントがコーディネータにSQLを送信
  2. コーディネータがSQLの実行計画を作成し,各impaladに処理内容(部分クエリ)を分配
  3. 各impaladはコーディネータから受けた部分クエリを実行。その際,必要に応じてHDFSからデータを取得
  4. 各impaladの実行結果をコーディネータが統合
  5. コーディネータからクライアントにクエリの結果を送信

図2 Impalaのクエリ実行時のイメージ

図2 Impalaのクエリ実行時のイメージ

次回からは,このクエリ処理の流れを前提として説明していきます。

おわりに

今回は,Impalaの開発に至る背景と,動作の概要を説明しました。次回は,ハッシュ結合の並列化方法やLLVMにおけるランタイムコード生成による高速化方法をはじめとする,Impalaにおけるクエリ実行時の並列化の仕組みについて説明します。

HiveとImpalaのレイテンシの違いをかんたんに体感するには

次回紹介するように,Impalaのクエリ処理は大容量のメモリを備えたクラスタでの稼動が推奨されますが,Hiveとのレイテンシの違いはClouderaの提供しているQuick StartVMを試すことでも実感できます。

さらにかんたんな方法としては,オープンソースのWeb UIツールであるHueのデモサイトのQuery EditorsからHiveとImpalaそれぞれを選択して,WebUI上でクエリを発行することもできます。Count関数を実行するだけのような単純な処理でもレイテンシの違いが体感できると思います。ぜひ一度試してみてください。

著者プロフィール

矢野智聡(やのともあき)

日本オラクル株式会社を経て,2014年よりCloudera株式会社所属。Impala,HiveなどのSQLに関連するエコシステムを中心としてHadoopクラスタのサポートに従事。


山田浩之(やまだひろゆき)

日本アイ・ビー・エム株式会社を経て,ヤフー株式会社にて分散型全文検索エンジンの研究開発に従事。2008年上期未踏IT人材発掘・育成事業において高性能分散型検索エンジンの開発によりスーパークリエータに認定。現在は東京大学生産技術研究所にて高性能並列データ処理系の研究開発に従事。博士(情報理工学)。

著書に『検索エンジン自作入門』。