Azure で簡単に Hadoop クラスタが作成できる HDInsight 。Hadoop は Hive の Hive QLを用いてデータを取得する方法が主要なやり方の1つだと思います。
このHive QLを投げるには管理ポータルのクエリエディタを用いる方法がありますが、それではプログラムから呼び出せません。PowerShellを使う方法もありますが、今回はREST APIでHive QLを呼び出し、結果を取得する方法をご紹介します。
・ URL
(GET)https://{クラスタ名}.azurehdinsight.net/templeton/v1/status
Hive QLの発行はPOSTメソッドです。URLは次のようになります。
(POST)https://{クラスタ名}.azurehdinsight.net/templeton/v1/hive?user.name={httpusername}
{httpusername}にはHDInsightクラスタを作成した時に指定したユーザー名です。
Requestヘッダーには認証情報と、Content-Typeを念のため指定しておきます。
Request Header
Authorization: Basic {Base64エンコードしたID:PW}
Content-Type: application/x-www-form-urlencoded
Request Body
execute={クエリ}&statusdir=wasb:///{任意のディレクトリ}/{任意のディレクトリ}
statusdirにはファイルシステムとしてBlobStorageを使用した場合のパスを書いておきました。
コンテナ名はもとより、アカウント名等の情報は不要です。上記の書き方でいきなりコンテナ配下を指定できます。
指定したディレクトリが存在しなかった場合、自動的に作成されます。
パラメータはJson形式では投げられませんので、Content-Typeにapplication/Jsonは使えません。
やってみればわかりますが、クエリパラメータのexecuteが必須だぞ、とエラーになります。
出力先のディレクトリには、次の2つのファイルが出力されます。(実際にはもう一つ出力されますが無視)
- stdoutファイル・・・クエリの結果
- stderrファイル・・・エラー情報
Hive QL を書くときには、Urlエンコードに気をつけてください。スペースは+になります。
例:select+*+from+hivesampletable
(hivesampletable は、クラスタ作成時に格納されているサンプルテーブルです)
そして戻り値は、クエリの結果ではなくてjobIdがJsonで戻ってきます。クエリの結果ではありません。
jobIdを元に、クエリの終了を待機してから結果の取得をしなければなりません。
(GET)https://{クラスタ名}/templeton/v1/jobs/jobid?user.name={httpusername}