HDInsight 上の Apache Hadoop で REST を使用して Apache Hive クエリを実行する
WebHCat REST API を使用して Azure HDInsight クラスター上の Apache Hadoop で Apache Hive クエリを実行する方法について説明します。
前提条件
HDInsight の Apache Hadoop クラスター。 Linux での HDInsight の概要に関するページを参照してください。
REST クライアント。 このドキュメントでは、Windows PowerShell の Invoke-WebRequest と Bash の Curl を使用します。
Bash を使用する場合は、コマンド ライン JSON プロセッサである jq も必要になります。 「https://stedolan.github.io/jq/」を参照してください。
REST API のベース URI
HDInsight の REST API のベース URI (Uniform Resource Identifier) は、https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME
です。CLUSTERNAME
は実際のクラスターの名前です。 URI のクラスター名では、大文字と小文字が区別されます。 URI (CLUSTERNAME.azurehdinsight.net
) の FQDN (完全修飾ドメイン名) 部分のクラスター名では大文字と小文字が区別されませんが、URI の他の部分で出現するときは大文字と小文字が区別されます。
認証
cURL、または WebHCat を用いたその他 REST 通信を使用する場合は、HDInsight クラスター管理者のユーザー名とパスワードを指定して要求を認証する必要があります。 REST API のセキュリティは、 基本認証を通じて保護されています。 資格情報をサーバーに安全に送信するには、必ずセキュア HTTP (HTTPS) を使用して要求を行う必要があります。
セットアップ (資格情報の保存)
各例で再入力しなくて済むように、資格情報を保存します。 クラスター名は別の手順で保存します。
A. Bash
PASSWORD
を実際のパスワードに置き換えて、次のスクリプトを編集します。 その後、コマンドを入力します。
export PASSWORD='PASSWORD'
B. PowerShell 以下のコードを実行し、ポップアップ ウィンドウで資格情報を入力します。
$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"
大文字と小文字が正しく区別されたクラスター名を確認する
クラスターの作成方法によっては、クラスター名の実際の大文字小文字の区別が予想と異なる場合があります。 ここの手順では、実際の大文字小文字の区別を示し、後のすべての例のために、それを変数に格納します。
次のスクリプトを編集して、CLUSTERNAME
を実際のクラスター名に置き換えます。 その後、コマンドを入力します。 (FQDN のクラスター名は大文字と小文字が区別されません。)
export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
-Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;
# Show cluster name
$clusterName
Hive クエリを実行する
HDInsight クラスターに接続できることを確認するには、次のいずれかのコマンドを使用します。
curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" ` -Credential $creds ` -UseBasicParsing $resp.Content
次のような応答を受け取ります。
{"status":"ok","version":"v1"}
このコマンドで使用されるパラメーターの意味は次のとおりです。
-u
- 要求の認証に使用するユーザー名とパスワード。-G
- この要求が GET 操作であることを示します。
URL の最初の部分
https://$CLUSTERNAME.azurehdinsight.net/templeton/v1
は、すべての要求で同じです。 パス/status
は、要求がサーバー用の WebHCat (別名: Templeton) の状態を返すことを示します。 次のコマンドを使用して、Hive のバージョンを要求することもできます。curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" ` -Credential $creds ` -UseBasicParsing $resp.Content
この要求では、次のような応答が返されます。
{"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
次のコマンドを使用して、 log4jLogs という名前のテーブルを作成します。
JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="DROP+TABLE+log4jLogs;CREATE+EXTERNAL+TABLE+log4jLogs(t1+string,t2+string,t3+string,t4+string,t5+string,t6+string,t7+string)+ROW+FORMAT+DELIMITED+FIELDS+TERMINATED+BY+' '+STORED+AS+TEXTFILE+LOCATION+'/example/data/';SELECT+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id) echo $JOB_ID
$reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"} $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" ` -Credential $creds ` -Body $reqParams ` -Method POST ` -UseBasicParsing $jobID = (ConvertFrom-Json $resp.Content).id $jobID
この要求は、REST API に要求の一部としてデータを送信する、POST メソッドを使用します。 要求では次のデータ値が送信されます。
user.name
- コマンドを実行するユーザー。execute
- 実行する HiveQL ステートメント。statusdir
- このジョブの状態が書き込まれるディレクトリ。
これらのステートメントは次のアクションを実行します。
DROP TABLE
- テーブルが既に存在する場合、そのテーブルは削除されます。CREATE EXTERNAL TABLE
- 新しい "外部" テーブルを Hive に作成します。 外部テーブルは Hive にテーブル定義のみを格納します。 データは元の場所に残されます。注意
基になるデータが外部ソースによって更新されると考えられる場合は、外部テーブルを使用する必要があります。 たとえば、データの自動アップロード処理や別の MapReduce 操作の場合です。
外部テーブルを削除しても、データは削除されません。テーブル定義のみが削除されます。
ROW FORMAT
- データがどのように書式設定されるか。 各ログのフィールドは、スペースで区切られています。STORED AS TEXTFILE LOCATION
- データが格納されている場所 (example/data ディレクトリ) と、それがテキストとして格納されていること。SELECT
-SELECT
列の値が [ERROR] であるすべての行の数を指定します。 この値を含む行が 3 行あるため、このステートメントでは値 3 が返されます。注意
Curl を使用したとき、HiveQL ステートメントのスペースが
+
に置き換わることに注意してください。 スペースを含む引用符で囲まれた値 (区切り記号など) は+
に置き換わりません。このコマンドは、ジョブのステータスの確認に使用できるジョブ ID を返します。
ジョブのステータスを確認するには、次のコマンドを使用します。
curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
$reqParams=@{"user.name"="admin"} $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" ` -Credential $creds ` -Body $reqParams ` -UseBasicParsing # ConvertFrom-JSON can't handle duplicate names with different case # So change one to prevent the error $fixDup=$resp.Content.Replace("jobID","job_ID") (ConvertFrom-Json $fixDup).status.state
ジョブが完了している場合、ステータスは SUCCEEDED です。
ジョブのステータスが SUCCEEDED に変わったら、Azure BLOB ストレージからジョブの結果を取得できます。 クエリで渡される
statusdir
パラメーターには、出力ファイルの場所が含まれます。この場合は、/example/rest
です。 このアドレスは、クラスターの既定ストレージにexample/curl
ディレクトリの出力を格納します。これらのファイルを一覧表示およびダウンロードするには Azure CLIを使用します。 詳細については、Azure Storage での Azure CLI の使用に関するページを参照してください。
次のステップ
HDInsight での Hadoop のその他の使用方法に関する情報
このドキュメントで使用されている REST API の詳細については、「WebHCat リファレンス」に関するドキュメントをご覧ください。