NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

HDInsight の Hive を REST API で使う

Azure で簡単に Hadoop クラスタが作成できる HDInsight 。Hadoop は Hive の Hive QLを用いてデータを取得する方法が主要なやり方の1つだと思います。
このHive QLを投げるには管理ポータルのクエリエディタを用いる方法がありますが、それではプログラムから呼び出せません。PowerShellを使う方法もありますが、今回はREST APIでHive QLを呼び出し、結果を取得する方法をご紹介します。

といっても、それほど面倒な訳ではありません。
 
Hadoop には WebHCat (以前はTempletonと呼ばれていました)と呼ばれるREST API がそもそもあるので、そちらを使えば良いだけです。
本家のページはこちらです。 https://cwiki.apache.org/confluence/display/Hive/WebHCat
HDInsight のディストリビュータであるHortonworks のページはこちらです。http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-Win-1.1/ds_Templeton/index.html

・ URL

RET APIのURLは
https://{クラスタ名}.azurehdinsight.net/templeton/v1/resource
 
となります。httpsのみサポートされます。「resource」の部分がやりたいことに応じて変わります。
例えば、状態を取得する場合は

(GET)https://{クラスタ名}.azurehdinsight.net/templeton/v1/status
 
となります。
 
・ 認証
Basic認証がかかっています。クラスを作った時のhttp user nameとパスワードをコロン:でつなげて、Base64エンコードした結果を次のようにヘッダーに入れてください。
 
Authorization: Basic bnN1ZXNha2gerEnNSMTMwMDk2QA==
 
・ クエリの発行

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

Reqestボディには、クエリとクエリの結果を格納する先を指定しておきます。

Request Body
execute={クエリ}&statusdir=wasb:///{任意のディレクトリ}/{任意のディレクトリ}

statusdirにはファイルシステムとしてBlobStorageを使用した場合のパスを書いておきました。
コンテナ名はもとより、アカウント名等の情報は不要です。上記の書き方でいきなりコンテナ配下を指定できます。
指定したディレクトリが存在しなかった場合、自動的に作成されます。

パラメータはJson形式では投げられませんので、Content-Typeにapplication/Jsonは使えません。
やってみればわかりますが、クエリパラメータのexecuteが必須だぞ、とエラーになります。

※statusdirパラメータのwasb:///~に結果が出力されます。
出力先のディレクトリには、次の2つのファイルが出力されます。(実際にはもう一つ出力されますが無視)
  1. stdoutファイル・・・クエリの結果
  2. stderrファイル・・・エラー情報

Hive QL を書くときには、Urlエンコードに気をつけてください。スペースは+になります。

例:select+*+from+hivesampletable
(hivesampletable は、クラスタ作成時に格納されているサンプルテーブルです)

そして戻り値は、クエリの結果ではなくてjobIdがJsonで戻ってきます。クエリの結果ではありません。
jobIdを元に、クエリの終了を待機してから結果の取得をしなければなりません。

・ジョブのステータス確認
ジョブを確認するには次のURLを叩きます。

(GET)https://{クラスタ名}/templeton/v1/jobs/jobid?user.name={httpusername}
 
status が SUCEEDED になれば、正常終了しています。