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

第19回 Impalaの設計と実装[3]

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

はじめに

今回は,ImpalaにおけるI/Oの高速化技法について説明します。

前回説明したように,Impalaの実行エンジンは可能な限りメモリ上で処理をすることでアドホッククエリのレイテンシを下げ,スループットを向上させる,という設計方針で開発されています。

しかし,データはストレージ(二次記憶装置)に格納されているため,当然,ストレージへのI/Oを回避することはできません。また,Impalaは実行時に十分なメモリを確保するべく,データをメモリ上に保持(キャッシュ)しないため,クエリを実行するたびにデータをストレージから読み出すことを前提として設計されています※1)⁠

今回は,このようなユースケースを考慮しつつ,高速・高効率なアドホッククエリを実行するためのI/O処理方式とデータレイアウトについて解説します。

※1)
HDFSキャッシュの機能を使うことで,メモリ上によく使うデータなどを配置することは可能です。

Short-Circuit Local ReadsによるI/Oの高効率化

Short-Circuit Local Readsは,HDFS経由のI/Oを高効率化する機能です。これはImpala独自のものではなく,HDFSの機能であり,Apache HBase(以後HBase)などでも使用されています。

通常,HDFSに対してI/Oを発行する場合においては,HDFSのクライアント(たとえばimpalad)がDataNodeを経由してI/O処理を行いますが,Short-Circuit Local Readsを用いる場合においては,DataNodeをバイパスし,HDFSクライアントのプロセスが直接HDFSブロックを読み出します※2)⁠この機能により,Impalaにおいて繰り返し実行されるI/O処理のフットプリントを削減することができるため,パフォーマンスの向上が見込めます。

なお,当該機能は,以前はOS上のファイルパスを受け渡すことにより実現されていましたが,セキュリティの観点から,現在はファイルディスクリプタを受け渡すことにより実現されています

※2)
IImpalaはHDFSブロックの位置情報をキャッシュしているため,Impala外からテーブルのデータファイルを変更された場合など情報が古い場合はShort-Circuit Local Readsを実行できず,HDFSのRemote Readsを実行することになります。ブロックの情報が古い場合は,Invalidate metadataコマンドを実行することで更新できます。

IO ManagerによるI/Oの並列化と先読み

次に,Impaladの内部でI/O処理を管理するIO Managerについて説明します。IO Managerの特徴は大きく下記の2つです。

  1. I/O処理の先読み
  2. ディスクごとの専用のスレッドを用いたI/O処理

I/O処理の先読み

クエリ処理においては,通常,当該処理に必要なレコードが必要になったときに初めてそのレコードの取得要求をディスクドライブなどに発行し,レコードの取得完了を待って,当該レコードを用いてCPU処理を行うという同期的な動作を繰り返して処理を進めていきます。しかしながら,このような方法では,CPUはI/Oの取得完了を待つ必要があり,また,二次記憶装置においてもCPUの入出力命令を待つ必要があるため,必ずしも効率的にCPUや二次記憶装置の性能を引き出すことができない場合があります。

ImpalaのIO Managerにおいては,I/Oの先読みを行うことにより,当該問題の解決を図ります。先読みにおいては,クエリ処理に必要なデータの入出力発行命令を当該データが実際に必要となる前に発行しておきます。事前に読み出したデータはメモリ上のバッファに格納され,CPUは当該バッファ上にあるデータを用いて処理を行います。

また,IO Managerはバッファにデータを格納した後,該当データを使用するCPUの処理を待たずに並行して実行されているほかのクエリなどの次のI/Oの処理を開始することが可能です。

図1 IO ManagerとCPUの関係

図1 IO ManagerとCPUの関係

ディスクごとの専用のスレッドを用いたI/O処理

Impalaにおいては,ディスクドライブごとに専用のI/Oスレッドを用いて,I/O処理を行います。impalad(IO Manager)が受けつけるクエリおよびクエリのI/O要求は複数が平行に実施されることも想定されており,さまざまなI/O要求に対して継続してレイテンシを抑えた対応を行うため,IO Managerは各ドライブごとのI/Oを精緻にスケジューリングしています。

図2 IO ManagerによるI/O処理

図2 IO ManagerによるI/O処理

著者プロフィール

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

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


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

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

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

コメント

コメントの記入