HDInsight での Hive および HiveQL と Hadoop の使用

HDInsight での Hive の使用方法について説明します。 HDInsight で Hive を使用するさまざまな方法を次の表に示します。

方法 対話型 シェルの有無 バッチ 処理の有無 使用する クラスターのオペレーティング システム 使用元の クライアントのオペレーティング システム
Hive ビュー Linux 任意 (ブラウザー ベース)
Beeline コマンド Linux Linux、Unix、Mac OS X、または Windows
REST API   Linux または Windows Linux、Unix、Mac OS X、または Windows
クエリ コンソール (HDInsight 3.2 および 3.3)   Windows 任意 (ブラウザー ベース)
HDInsight Tools for Visual Studio   Linux または Windows Windows
Windows PowerShell   Linux または Windows Windows
リモート デスクトップ (HDInsight 3.2 および 3.3) Windows Windows
重要

Linux は、バージョン 3.4 以上の HDInsight で使用できる唯一のオペレーティング システムです。 詳細については、HDInsight 3.2 と 3.3 の廃止に関するページを参照してください。

Hive とは

Apache Hive は Hadoop のデータ ウェアハウス システムで、データを集約、照会、および分析することができます。 Hive では、大規模な非構造化データに構造を投影することができます。 構造を定義したら、Hive を使用することで、Java や MapReduce の知識がなくてもそのデータを照会できます。

Hive クエリは、SQL に似たクエリ言語である HiveQL で記述します。 Hive を使用することで、データを対話的に探索したり、再利用可能なバッチ処理ジョブを作成したりすることができます。

Hive は、フィールドが特定の文字で区切られるテキスト ファイルなどの構造化データや半構造化データを操作する方法を認識しています。 また、Hive では、複雑なまたは不規則な構造化データのためのカスタム シリアライザー/デシリアライザー (SerDe) もサポートされます。 詳細については、「HDInsight でのカスタム JSON SerDe の使用方法」というドキュメントを参照してください。

ユーザー定義関数 (UDF)

Hive は ユーザー定義関数 (UDF)で拡張することもできます。 UDF では、HiveQL で簡単にモデル化されない機能やロジックを実装することができます。 Hive での UDF の使用例については、以下のドキュメントを参照してください。

Hive の内部テーブルと外部テーブル

Hive の内部テーブルと外部テーブルについて知っておく必要のある事項がいくつかあります。

  • CREATE TABLE コマンドは内部テーブルを作成します。 データ ファイルは既定のコンテナーに配置する必要があります。

  • CREATE TABLE コマンドは、データ ファイルを、クラスターの既定のストレージにある /hive/warehouse/<TableName> ディレクトリに移動します。

  • CREATE EXTERNAL TABLE コマンドは外部テーブルを作成します。 データ ファイルは既定のコンテナーの外部に配置することもできます。

  • CREATE EXTERNAL TABLE コマンドはデータ ファイルを移動しません。

詳細については、「HDInsight: Hive Internal and External Tables Intro (HDInsight: Hive の内部テーブルと外部テーブルの概要)」を参照してください。

サンプル データ

HDInsight にはさまざまなサンプル データ セットが用意されていて、/example/data および /HdiSamples ディレクトリに格納されています。 これらのディレクトリは、クラスターの既定のストレージ内に存在します。 このドキュメントでは、/example/data/sample.log ファイルを使用します。 このファイルは、log4j ファイルです。 ファイル内の各ログは、タイプと重要度を表す [LOG LEVEL] フィールドを含むフィールド行で構成されています。以下に例を示します。

2012-02-03 20:26:41 SampleClass3 [ERROR] verbose detail for id 1527353937

前の例では、ログ レベルは ERROR です。

メモ

また、 Apache Log4j ログ ツールを使用して log4j ファイルを生成し、そのファイルを BLOB コンテナーにアップロードすることもできます。 手順については、「 データを HDInsight にアップロードする方法 」を参照してください。 HDInsight と共に Azure BLOB ストレージを使用する方法の詳細については、「 HDInsight での Azure BLOB ストレージの使用」を参照してください。

サンプル Hive クエリ

次の HiveQL ステートメントは、/example/data/sample.log ファイルに列を投影します。

set hive.execution.engine=tez;
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 '%.log' GROUP BY t4;

前の例では、HiveQL ステートメントは次のアクションを実行します。

  • set hive.execution.engine=tez;: Tez を使用するように実行エンジンを設定します。 MapReduce ではなく Tez を使用すると、クエリ パフォーマンスを向上させることができます。 Tez の詳細については、「 パフォーマンスを改善するための Apache Tez の使用方法 」セクションをご覧ください。

    メモ

    このステートメントは、Windows ベースの HDInsight クラスターの使用時にのみ必要です。 Linux ベースの HDInsight クラスターでは、Tez が既定の実行エンジンです。

  • DROP TABLE: テーブルが既に存在する場合は、それを削除します。

  • CREATE EXTERNAL TABLE: Hive に新しく 外部 テーブルを作成します。 外部テーブルは Hive にテーブル定義のみを格納します。 データは元の場所に、元の形式で残されます。

  • ROW FORMAT: Hive にデータの形式を示します。 ここでは、各ログのフィールドは、スペースで区切られています。

  • STORED AS TEXTFILE LOCATION: Hive に、データの格納先 (example/data ディレクトリ) と、データはテキストとして格納されていることを示します。 データは 1 つのファイルに格納することも、ディレクトリ内の複数のファイルに分散することもできます。

  • SELECT: t4 列の値が [ERROR] であるすべての行の数を指定します。 この値を含む行が 3 行あるため、このステートメントでは値 3 が返されます。

  • INPUT__FILE__NAME LIKE '%.log' - Hive に .log で終わるファイルのデータのみを返す必要があることを示します。 このステートメントにより、データを含む sample.log ファイルに検索が制限されます。

メモ

基になるデータが外部ソースによって更新されると考えられる場合は、外部テーブルを使用する必要があります。 たとえば、データの自動アップロード処理や MapReduce 操作の場合です。

外部テーブルを削除しても、データは削除されません。テーブル定義のみが削除されます。

外部テーブルではなく内部テーブルを作成するには、次の HiveQL を使用します。

set hive.execution.engine=tez;
CREATE TABLE IF NOT EXISTS errorLogs (t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string)
STORED AS ORC;
INSERT OVERWRITE TABLE errorLogs
SELECT t1, t2, t3, t4, t5, t6, t7 FROM log4jLogs WHERE t4 = '[ERROR]';

これらのステートメントは次のアクションを実行します。

  • CREATE TABLE IF NOT EXISTS: テーブルが存在しない場合は作成します。 EXTERNAL キーワードが使用されていないため、このステートメントによって内部テーブルが作成され、Hive データ ウェアハウスに格納されて、完全に Hive によって管理されます。

  • STORED AS ORC: Optimized Row Columnar (ORC) 形式でデータを格納します。 この形式は、Hive にデータを格納するための、非常に効率的で適切な形式です。

  • INSERT OVERWRITE ...SELECT: [ERROR] を含む log4jLogs テーブルの行を選択し、errorLogs テーブルにデータを挿入します。

メモ

外部テーブルとは異なり、内部デーブルを削除すると、基盤となるデータも削除されます。

パフォーマンスを改善するための Apache Tez の使用方法

Apache Tez は、Hive などの大量のデータを扱うアプリケーションを同じ規模で遥かに効率的に実行可能にするフレームワークです。 HDInsight の最新リリースでは、Hive は Tez 上での実行がサポートされます。 Linux ベースの HDInsight クラスターでは、Tez は既定で有効になっています。

メモ

Tez は Windows ベースの HDInsight クラスターに対して現在既定でオフになっているため、有効にする必要があります。 Tez を活用するために、Hive クエリに次の値を設定する必要があります。

set hive.execution.engine=tez;

Linux ベースの HDInsight クラスターでは、Tez が既定のエンジンです。

「Hive on Tez」設計ドキュメントには、実装の選択肢および構成の調整に関する詳細が記載されています。

Tez を使用して実行したジョブのデバッグを支援するために、HDInsight には、Tez ジョブの詳細を表示できる次の Web UI が用意されています。

HiveQL ジョブの実行方法

HDInsight では、さまざまな方法を使用して HiveQL ジョブを実行できます。 次の表を使用して、適切な方法を判別してから、該当するチュートリアルのリンクをクリックしてください。

方法 対話型 シェルの有無 バッチ 処理の有無 使用する クラスターのオペレーティング システム 使用元の クライアントのオペレーティング システム
Hive ビュー Linux 任意 (ブラウザー ベース)
Beeline コマンド Linux Linux、Unix、Mac OS X、または Windows
REST API   Linux または Windows Linux、Unix、Mac OS X、または Windows
クエリ コンソール (HDInsight 3.2 および 3.3)   Windows 任意 (ブラウザー ベース)
HDInsight Tools for Visual Studio   Linux または Windows Windows
Windows PowerShell   Linux または Windows Windows
リモート デスクトップ (HDInsight 3.2 および 3.3) Windows Windows
重要

Linux は、バージョン 3.4 以上の HDInsight で使用できる唯一のオペレーティング システムです。 詳細については、HDInsight 3.2 と 3.3 の廃止に関するページを参照してください。

Hive ジョブと SQL Server Integration Services

SQL Server Integration Services (SSIS) を利用して Hive ジョブを実行することもできます。 Azure Feature Pack for SSIS には、HDInsight の Hive ジョブと連動する次のコンポーネントがあります。

Azure Feature Pack for SSIS の詳細については、こちらを参照してください。

次のステップ

これで、Hive と、HDInsight での Hadoop との使用方法に関する説明は終わりです。次のリンクを使用して、Azure HDInsight を操作するその他の方法について調べることもできます。