HiveServerを使用してPHPからHiveQLを実行する
Hadoopを触る機会があり手探りで構築しているのですが PHP から HiveQLを実行させたいとgoogle先生に伺うと HiveServerを使用してPythonやPerlからHiveQLを実行する の記事があったので、こちらを参考に試してみました。 今回はHadoopのインストールから行います。
まずはHadoopのインストールからです。初めはソースからインストールしていたのですが実際運用となるとやはりパッケージ管理したほうが無難です。そこでClouderaのHadoopディストリビューションパッケージCDH3をインストールします。
環境
- CentOS 6.3 64bit
- Hadoop CDH3u5
- PHP 5.3.16
Javaのダウンロード & インストール
HadoopはJavaソフトウェアの為、Javaのインストールが必要となります。以下のコマンドでJavaのバージョンが低い、またはそもそもインストールされていない場合はインストールする必要があります。 CDH3が推奨しているバージョンは Oracle JDK 1.6, update 8 以上です。
1
|
|
Java SE Downloads から Java SE 6 Update xx の JDK を選択します。
自身の環境に沿ったファイルをダウンロードします。ボクの場合は、jdk-6uxx-linux-x64-rpm.binをダウンロードします。 ダウンロードしたファイルはSCP等で転送しましょう。
インストール
実行権限を与えて、インストールを行います。
1 2 |
|
環境変数の設定
インストールが完了したら環境変数の設定を行います。どのユーザにおいてもその設定が反映するよう /etc/bashrc に以下を追加します。
1 2 3 4 |
|
設定を反映させ、正しく設定されているか確認します。
1 2 3 |
|
Hadoop のインストール
擬似分散モードでのHadoopインストールになります。
リポジトリの登録
CDH3+Installation を参考に環境に沿った方法でインストールしてください。
ボクの場合は、リポジトリを追加してyum でインストールします。
1
|
|
CDH3にもバージョンがあり、CDH3u5 から WebHDFSがサポートされたようです。 なるべく新しいもの使いたいよねということで CDH3u5 をインストールします。その為に先ほどダウンロードしたリポジトリの修正を行います。
1 2 3 4 5 6 7 |
|
インストール
修正したら Hadoop のインストールです。時間がかかるので適当に待ちましょう。
1 2 |
|
サービスの起動 & 確認
1 2 |
|
以下が表示されていることを確認します。
- secondarynamenode
- datanode
- namenode
- jobtracker
- tasktracker
MapReduceの動作確認
実際に円周率を計算するサンプルを動作させてみます。
1 2 3 4 5 |
|
ちゃんと動作していることが確認できましたね。Hadoopには HDFS(Hadoop分散ファイルシステム)を操作するコマンドがあるのですが、長ったらしいのでエイリアスを設定しておきます。
エイリアスの設定
1 2 3 4 5 6 7 8 9 |
|
Hiveの設定
Hive Metastoreの設定
Hive の Metastoreは組み込みのApache Derbyにメタデータを格納するように構成されるている為、単一のユーザーが一度にMetastoreにアクセスすることしかできません。新規ユーザー向けのセットアップを簡単にする為には、代わりにMySQLデータベースを使用するように強く奨励しています。
とマニュアルに記載してあるので、その通りにします。
MySQL JDBC Connector のダウンロード
MySQL JDBC Connectorのバージョンは現在の最新のものを利用してます。
1 2 3 |
|
metastoreデータベースの作成
mysqlにログインしDBを作成します。DB名、ユーザー名、パスワードは適時置き換えて下さい。
1 2 3 4 5 6 7 |
|
Hiveの設定
MySQLのMetaStore用のDBを作成したら、Hiveの設定ファイルの編集を行います。 ホスト名、DB名、ユーザー名、パスワードは先程作成した情報に合わせて下さい。
1
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
設定が完了したらHadoopを再起動します。
PHPから HiveQLを実行する
HiveServerはThriftプロトコルで接続することができます。PHPの場合は、Hiveパッケージの中に生成済みのライブラリが既に存在するのでこちらを利用します。しかしそのまま利用しようとすると色々不具合があるのでそれを修正していきます。
ライブラリの修正
まずは自身のワークスペースにライブラリをコピーします。
1
|
|
ディレクトリ構造の変更
packagesディレクトリの hive_metastore, hive_service, queryplan, serde が何故か入れ子になっている為、以下の構成に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
とりあえずはデータベース一覧を出力するだけの簡単なスクリプトを作成して実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
実行すると以下のエラーが出力されます。GLOBALはPHPの予約語と重複しているのでこれをコメントアウトします。
1
|
|
1 2 3 4 5 6 |
|
再度実行するとまたエラーが発生します。
1
|
|
エラーからソケットタイムアウトをしていることがわかります。 TSocketクラスの関数でタイムアウトが設定できる & デフォルトの設定だと短すぎる為、これを先程作成したスクリプトに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
タイムアウトの設定を10分に設定しました。そこまで複雑なHQLを実行することもないのでとりあえず良しとします。 実際に運用する場合は、タイムアウト設定もconfig等で変更できるようにします。
実行結果
1 2 3 4 5 6 |
|
案外さっくりいけますね。実際に集計スクリプトを実装する場合は、ThriftHiveClientインスタンスを返却するようなクラスをひとつかましてあげればうまくいくかな。
参考
- HiveServerを使用してPythonやPerlからHiveQLを実行する
- Java Development Kit Installation
- CDH3 Installation
- Configuring the Hive Metastore