Azure HDInsight における Apache Hive と HiveQL

Apache Hive は、Hadoop 用のデータ ウェアハウス システムです。 Hive を使用すると、データの集計、クエリ、および分析を行うことができます。 Hive クエリは、SQL に似たクエリ言語である HiveQL で記述します。

Hive では、大規模な非構造化データに構造を投影することができます。 構造を定義したら、HiveQL を使用することで、Java や MapReduce の知識がなくてもそのデータを照会できます。

HDInsight には、特定のワークロード用に調整されたいくつかのクラスター タイプがあります。 Hive クエリには、次のクラスター タイプが最も一般的に使用されます。

Hive の使用方法

次の表に基づいて、HDInsight で Hive を使用する方法を参照してください。

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

* Linux は、バージョン 3.4 以上の HDInsight で使用できる唯一のオペレーティング システムです。 詳細については、Windows での HDInsight の提供終了に関する記事を参照してください。

Windows ベースの HDInsight クラスターを使用している場合は、ブラウザーからクエリ コンソールを使用するか、リモート デスクトップを使用して、Hive クエリを実行できます。

HiveQL 言語のリファレンス

HiveQL 言語リファレンスは、言語マニュアル (https://cwiki.apache.org/confluence/display/Hive/LanguageManual) から入手できます。

Hive とデータ構造

Hive は、構造化データおよび半構造化データの操作方法を理解します。 たとえば、フィールドが特定の文字で区切られたテキスト ファイルがあるとします。 次の HiveQL ステートメントは、スペースで区切られたデータからテーブルを作成します。

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/';

また、Hive では、複雑なまたは不規則な構造化データのためのカスタム シリアライザー/デシリアライザー (SerDe) もサポートされます。 詳細については、「HDInsight でのカスタム JSON SerDe の使用方法」というドキュメントを参照してください。

Hive でサポートされているファイル形式の詳細については、言語マニュアル (https://cwiki.apache.org/confluence/display/Hive/LanguageManual) を参照してください。

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

Hive で作成できるテーブルには、次の 2 種類があります。

  • 内部: データは Hive データ ウェアハウスに格納されます。 データ ウェアハウスは、クラスターの既定のストレージの /hive/warehouse/ に配置されます。

    内部テーブルは次の場合に使用します。

    • データが一時的である。
    • Hive でテーブルとデータのライフサイクルを管理したい。
  • 外部: データはデータ ウェアハウスの外部に格納されます。 データは、クラスターからアクセス可能な任意のストレージに格納できます。

    外部テーブルは次の場合に使用します。

    • Hive の外部でもデータが使用される。 たとえば、データ ファイルが別のプロセスによって更新される (ファイルがロックされない)。
    • テーブルを削除した後もデータを基になる場所に保持する必要がある。
    • 既定以外のストレージ アカウントなど、カスタムの場所が必要である。
    • データの形式、場所などが Hive 以外のプログラムによって管理される。

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

ユーザー定義関数 (UDF)

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

サンプル データ

HDInsight の Hive には、hivesampletable という名前の内部テーブルがあらかじめ読み込まれています。 HDInsight には、Hive で使用できるサンプル データ セットも用意されています。 これらのデータ セットは、/example/data および /HdiSamples ディレクトリに格納されています。 これらのディレクトリは、クラスターの既定のストレージ内に存在します。

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: データの格納先 (example/data ディレクトリ) と、データがテキストとして格納されていることを Hive に伝えます。 データは 1 つのファイルに格納することも、ディレクトリ内の複数のファイルに分散することもできます。

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

  • INPUT__FILE__NAME LIKE '%.log' - Hive は、ディレクトリ内のすべてのファイルにスキーマの適用を試みます。 このケースでは、ディレクトリにスキーマに一致しないファイルが含まれています。 結果にガベージ データが含まれないように、このステートメントを使用して、.log で終わるファイルのデータのみを返す必要があることを Hive に指示します。

注意

基になるデータが外部ソースによって更新されると考えられる場合は、外部テーブルを使用する必要があります。 たとえば、データの自動アップロード処理や 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) 形式でデータを格納します。 ORC は、Hive データを格納するための高度に最適化された効率的な形式です。

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

注意

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

Hive クエリ パフォーマンスの向上

Apache Tez

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

注意

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

set hive.execution.engine=tez;

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

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

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

Low Latency Analytical Processing (LLAP)

LLAP (Live Long and Process と呼ばれることもあります) は、クエリのメモリ内キャッシュを使用可能にする Hive 2.0 の新機能です。 LLAP により、Hive クエリは特定のケースで Hive 1.x と比べて最大 26 倍高速化されます。

HDInsight は、インタラクティブ Hive クラスター タイプの LLAP を提供します。 詳細については、インタラクティブ Hive の使用に関するドキュメントを参照してください。

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 を操作するその他の方法について調べることもできます。