halookで始めるHadoop/HBaseトラブルシューティング

第10回 同じ処理でも実行時間の異なるHiveQLの書き方

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

今回は,halookでHiveがどのように実行されるかを見ていきます。なお,前回の連載までと異なり,今回は,halookをCDH3ではなくCDH4に適用した結果を記載しています。

Hiveとは?

Hiveは,HDFS上のデータをHiveQLと呼ばれるSQLライクなクエリ言語で処理できるようにしたもので,CDHにも含まれています。HiveQLで記述した命令が,自動でMapReduceに変換されるため,ユーザ自身がMapReduceジョブプログラムを記述する必要がなく,データ解析が簡便に行えます。

Hiveを使うためには,まずデータを,Hiveテーブルとして保存する必要があります。カンマ区切りや,タブ区切りで保存されたデータに対して,カラム名や型などのテーブル定義を示すことによって,Hiveテーブルを作成できます。HiveQLの構文はSQLと若干異なるところがあるものの,多くのSQL構文をサポートしているため,テーブルを作ってしまえば,RDBMSと同様の感覚で操作することができます。

また,Hiveの実行には,同じくCDHに含まれている,Hueを使うのが便利です。Hueは,Hadoop用のWeb UIで,HDFSのファイル操作など,ブラウザ上で様々な処理を実行することができます。Hueを使うと,HDFS上へのデータのアップロード,Hiveテーブルの作成,HiveQLの実行,実行結果や実行履歴の確認まで,すべてブラウザ上で行うことができます。

図1 HiveQLを実行する,Hueのクエリエディタの画面

図1 HiveQLを実行する,Hueのクエリエディタの画面

HiveQLの実行例

ためしにHiveQLを実行してみましょう。

SELECT * FROM member m JOIN item i ON m.id = i.member_id

上記は,memberテーブルとitemテーブルを,memberテーブルのidカラムとitemテーブルのmember_idカラムでJOINする例です。これが,内部で自動的にMapReduceジョブに変換されます。

実行後,halookで変換されたMapReduceジョブを視覚化したところ以下のようになりました。

図2 JOIN実行時のMapReduceジョブ

図2 JOIN実行時のMapReduceジョブ

図中の緑のラインが,時系列で見た際のMap処理の実行期間を表し,青のラインがReduce処理を表します。これにより,HiveQLが2つのMap処理と1つのReduce処理に変換して実行されたことと,Map/Reduce処理がserver0,server1,server2の3台で分散して実行されていることがわかります。また,2つのMap処理の実行時間には2倍程度の開きがあることがわかります。なお,一般的に,Mapの数やReduceの数は,データ量や,テーブルに設定されたパーティションの有無などで変わります。

次に,先ほどのクエリを少し変えて実行してみます。

SELECT
    m.id, m.name, i.item
FROM
    member m JOIN item i
ON
    m.id = i.member_id
ORDER BY
    m.id

大きな違いは,最後にORDER BY句を入れたことです。このORDER BY句の影響で,実行されるMapReduce Jobが2つに増えました。

図3 ORDER BY句を加えたJOIN実行時のMapReduceジョブ Stage-1

図3 ORDER BY句を加えたJOIN実行時のMapReduceジョブ Stage-1

図4 ORDER BY句を加えたJOIN実行時のMapReduceジョブ Stage-2

図4 ORDER BY句を加えたJOIN実行時のMapReduceジョブ Stage-2

このように,MapReduceジョブ1回で実行できない内容のクエリの場合,Stage-1,Stage-2,Stage-3・という形で,複数のMapReduceジョブが順番に実行されます。

著者プロフィール

落合雄介(おちあいゆうすけ)

Acroquest Technology株式会社 オブジェクトフレームワークディヴィジョン エンジニアリングクリエーター

http://www.acroquest.co.jp/

コメント

コメントの記入