Hive クイックスタート

MySQLBeginner
オンラインで実践に進む

はじめに

この実験では、Hive の設定と基本操作を扱います。SQL の基礎知識がある学習者を対象に、Hive のアーキテクチャ、基本的なデプロイ、使用方法を理解することを目的としています。

ドキュメント内のサンプルコードは、できるだけコピー&ペーストせず、自分で入力してください。そうすることで、コードにより慣れることができます。問題が発生した場合は、ドキュメントを注意深く確認するか、フォーラムで質問や情報交換を行ってください。

Hive の概要

このステップでは、Apache Hive が Hadoop に保存された大規模データセットを SQL インターフェースでクエリおよび分析する仕組みを学びます。ここでは、Hive のアーキテクチャと主な機能を確認します。

Hive のアーキテクチャ

  • コンポーネント:Hive には、テーブルとストレージを管理する HCatalog と、MapReduce タスクや Pig クエリを実行したり、REST API 経由で Hive のメタデータを操作したりする WebHCat が含まれます。
  • 機能
    • ETL、データ分析、レポート作成などのデータウェアハウス処理で SQL クエリを使用できます。
    • データは HDFS や HBase などのストレージシステムに保存され、クエリ処理は Tez、Spark、MapReduce などの計算エンジンで実行されます。
    • 手続き型言語と HPL-SQL をサポートし、Hive LLAP、YARN、Slider を利用したサブクエリ取得にも対応しています。

Hive の基本データ単位

  • データベース:名前空間を提供し、名前の競合を避けるとともにセキュリティを高めます。
  • テーブル:同じスキーマを持つ同種のデータ単位です。たとえば、page_views テーブルには timestamp、userid、page_url などの列があります。
  • パーティション:キーに基づいてデータを分割し、効率的なデータ取得を可能にします。
  • バケット:パーティション化されたデータをハッシュ関数の値に基づいてバケットに分割し、クエリ効率を高めます。

Hive のデータ型

Hive はオンライン・トランザクション処理(OLTP)ではなく、データウェアハウス処理を目的として設計されています。拡張性、性能、信頼性、フォールトトレランスを重視しています。さまざまな入力形式をサポートし、異なる形式のコネクタで拡張することもできます。ビッグデータ分析で Hive の機能を活用するには、Hive のアーキテクチャ、データ単位、データ型を理解することが重要です。

Hive のインストールとデプロイ

このステップでは、Hive のインストールとデプロイについて確認します。ディレクトリ構成、環境変数、メタストア、システムパラメータを扱います。

まず、後続の操作を実行するために hadoop ユーザーへ切り替えます。デスクトップ上の Xfce ターミナルをダブルクリックして開き、次のコマンドを入力してください。

su - hadoop

ヒントhadoop ユーザーのパスワードは 'hadoop' です。

次に、wget コマンドを使用して Hive の最新安定版をダウンロードします。ここでは Hive 2.3.3 を使用します。

sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz

ダウンロードしたインストールパッケージを展開します。ターミナルで次のコマンドを入力してください。

tar -zxvf apache-hive-2.3.3-bin.tar.gz

sudo 権限を使用して、展開したディレクトリを /opt ディレクトリへ移動します。sudo 権限を使用しない場合、/opt ディレクトリへ書き込めないことがあります。

sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3

ディレクトリを移動したら、Hive のディレクトリの所有者とグループを hadoop に変更します。ターミナルで次のコマンドを入力してください。

sudo chown -R hadoop:hadoop /opt/hive-2.3.3

ヒント:別のターミナルを開き、sudo 権限で上記の操作を実行することもできます。

labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...

環境変数の設定

このステップでは、Hive の環境変数を設定し、HIVE_HOME が Hive のインストールディレクトリを指すようにします。

まず、vim エディターで hadoop ユーザーの .bashrc ファイルを開きます。ターミナルで次のコマンドを入力してください。

vim /home/hadoop/.bashrc

ファイルの末尾に次の内容を追加します。PATH は、現在の実験環境の実際の状況に合わせて変更してください。$PATH は既存の内容を参照するために使用します。PATH 環境変数の末尾に :$HIVE_HOME/bin を直接追加します。

export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin

編集が完了したら、ファイルを保存してエディターを終了します。その後、source コマンドを使用して上記の環境変数を有効にします。

この実験環境では Hive をあらかじめインストール済みのため、**source による環境変数の有効化は必要ありません**。実際のインストールでは、状況に応じてこの手順を実行してください。

設定

このステップでは、あらかじめインストールされている Hive の設定を確認し、チェックに必要な設定ファイルを作成します。

メタストアの設定

Hive を正式に使用する前に、メタデータストアを設定する必要があります。デフォルトでは、Hive はメタ情報を組み込みの Derby データベースに保存します。ディスク上の保存場所は、Hive の設定ファイル conf/hive-default.xml にある設定項目 javax.jdo.option.ConnectionURL で決まります。デフォルトの保存場所は ./metastore_db です。

ただし、この実験ではメタデータの保存先として MySQL を使用します。そのため、Hive の設定ファイルを変更する必要があります。

vim エディターで、用意した設定ファイルを作成して開きます。

vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser1</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123qweQWE...</value>
</property>
</configuration>

上記の設定項目を編集したら、ファイルを保存してエディターを終了します。

MySQL データベースの作成

sudo mysql を実行して MySQL Server を起動し、hive_metastore データベースを作成します。

CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;

次に、MySQL JDBC ドライバーをダウンロードし、/opt/hive-2.3.3/lib ディレクトリへコピーします。

cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib

Hive システムパラメータの設定

メタストアの設定が完了したら、Hadoop の場所や内部設定ファイルのパスなどを指定するため、Hive 内部の設定項目を設定します。

まず、設定テンプレートをコピーして、設定を有効にします。

ターミナルで次のコマンドを入力してください。

cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh

次に、vim エディターで hive-env.sh ファイルを開きます。

vim /opt/hive-2.3.3/conf/hive-env.sh

48 行目で、HADOOP_HOME に Hadoop のインストールパスを設定します。

HADOOP_HOME=/home/hadoop/hadoop

上記の設定項目を編集したら、ファイルを保存してエディターを終了します。

メタストアの初期化

このステップでは、Hive のメタストアを初期化し、Hive が必要とする Hadoop サービスを起動します。

後で使用するデータは HDFS に保存されるため、あらかじめ HDFS を起動する必要があります。ターミナルで次のコマンドを入力して HDFS を起動してください。

start-dfs.sh
start-yarn.sh

jps を入力して、サービスの状態を確認します。

hadoop:~/ $ jps                                                      [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode

Hadoop を初めて使用する場合は、hdfs namenode -format で Hadoop のデータを削除して初期化する必要があります。

この実験では、あらかじめインストールされている Hive をデータベースを使用して初期化済みです。ダウンロードした Hive を初期化する場合は、次のコマンドを使用します。

/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed

ここで、ダウンロードしたばかりの Hive を初期化する場合は、~/.bashrcHIVE_HOME のパスを、インストールした Hive のパスへ変更して source を実行する必要があります。ただし、Hive の後続テストはすべてあらかじめインストールされている Hive を前提としているため、この操作は行わないことをお勧めします。

プロンプトに初期化完了のメッセージが表示されたら、hive コマンドで Hive のコマンドラインに入ります。ターミナルで次のコマンドを入力してください。

hive

ヒント:あらかじめインストールされている Hive のシェルで hive を直接入力すると、絶対パスを追加した状態で、今回設定した Hive シェルに入ります。

Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>

Hive の基本操作

このステップでは、Hive テーブルの基本操作を学びます。Hive のすべての文は、Language Manual でも確認できます。

テーブルの作成

まず、データを用意します。この実験で使用するデータは、主に NginX サーバーを模したログファイルです。Web サイトのページビューを分析するために使用できます。

ターミナルをもう一度開き、次のコマンドを入力してサンプルデータをダウンロードします。

su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv

次に、ファイルを HDFS へアップロードします。

hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view

データを用意したら、まずテーブルを作成します。上記のデータ用に page_view テーブルを作成するには、Hive のコマンドラインで次の文を入力します。

CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

この例では、テーブルの各列に適切な型を指定しています。列レベルとテーブルレベルの両方にコメントを付けることもできます。また、PARTITIONED BY 句は、データ列とは異なるパーティション列を定義します。パーティション列はデータ列と一緒には保存されません。このようにパーティション列を指定すると、各行の区切り文字には改行文字が使用されます。

データが上記の形式でない場合は、次の例のようにフィールド区切り文字を指定できます。

次の文は説明用であり、hive シェルには入力しないでください。

CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;

行の区切り文字は Hive ではなく Hadoop システムの区切り文字によって決まるため、行の区切り文字を手動で変更することはできません。

通常、列データが決まっているテーブルはバケットに保存します。これにより、データセットに対する効率的なサンプリングが可能になります。バケットがない場合、テーブルのランダムサンプリングを完了できても、データ全体をスキャンする処理で高い効率を実現できません。次の例では、userid 列を使用して page_view テーブルのバケットストレージを有効にします。

次の文は説明用であり、hive シェルには入力しないでください。

CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

上の例では、テーブルの userid 列をハッシュ関数によって 32 個のバケットに分散します。各バケット内のデータは viewTime の昇順に並べ替えられます。このデータ編成により、集約された列(ここでは userid 列)を効率的にサンプリングできます。また、ソート機能により、データ管理者はより適切なデータ構造を通じてクエリを効率的に評価できます。

次の文は説明用であり、hive シェルには入力しないでください。

CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

上の例では、テーブルの各行の形式をフィールド名と型で定義しています。これは、他のプログラミング言語における型定義とよく似ています。テーブル名と列名では大文字と小文字が区別されない点に注意してください。IP Address of the User と下記の COMMENT 文は、列レベルとテーブルレベルの両方にコメントを追加できることを示しています。また、PARTITIONED BY 句は、データ列とは異なるパーティション列を定義します。前述のとおり、パーティション列には実際のデータは保存されません。CLUSTERED BY 句では、どの列を使用して何個のバケットを作成するかを指定します。ROW FORMAT DELIMITED 句では、Hive テーブル内で行を保存する方法を指定します。区切り形式では、フィールドの終端記号、コレクション(配列またはマップ)内の項目の終端記号、マップキーの終端記号を指定します。ここで示す数値は ASCII エンコーディングです。STORED AS SEQUENCEFILE は、データを HDFS 上にバイナリ形式、具体的には Hadoop の SequenceFile 型で保存することを示します。ROW FORMAT 句と STORED AS 句の設定は、現在 Hive が使用しているデフォルト値です。そのため、冒頭でテーブルを作成した文では明示的に記述していません。

テーブルとパーティションの確認

ウェアハウス内に存在するテーブルを一覧表示するには、次の文を使用します。

SHOW TABLES;

テーブルが多い場合、上の文は大量の結果を返します。プレフィックスを指定して範囲を絞り込むことができます。たとえば、page をプレフィックスとするテーブルを一覧表示するには、次の文を使用します。

SHOW TABLES 'page.*';

この文の一致規則は正規表現の構文と同じで、ピリオド(.)はワイルドカードを表します。

テーブルのパーティションを一覧表示するには、次の文を使用します。パーティションテーブルでない場合、情報は返されません。

SHOW PARTITIONS page_view;

テーブルの列と列の型を一覧表示するには、DESCRIBE 文を使用します。

DESCRIBE page_view;

テーブルの列とその他すべてのプロパティを一覧表示するには、EXTENDED キーワードを追加します。大量の情報が出力されるため、通常はデバッグに使用します。

DESCRIBE EXTENDED page_view;

テーブルの変更

既存のテーブル名を変更するには、RENAME TO を付けた ALTER TABLE 文を使用します。新しい名前のテーブルがすでに存在する場合は、エラーが返されます。次の文は例示のみです。次のステップで page_view テーブルを使用するため、実行しないでください。

ALTER TABLE page_view RENAME TO new_page_view;

結果を確認します。

hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)

既存のテーブルの列名を変更することもできます。ただし、同じ列型を使用し、既存の各列にレコードを含める必要があります。

ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');

既存のテーブルに新しい列を追加することもできます。

ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');

スキーマを変更すると、たとえば列を追加した場合、テーブルの古いパーティションのスキーマは保持されます。これにより、古いパーティションがパーティションテーブルでなくなることを防ぎます。古いパーティションに対してこれらの列へアクセスするすべてのクエリは、暗黙的に NULL 値または指定されたデフォルト値を返します。

テーブルとパーティションの削除

Hive はデータウェアハウスとして設計されているため、データの破棄は常に慎重に扱う必要があります。そのため、テーブルを削除する操作は少し複雑です。テーブルに対して DROP コマンドを使用すると、そのテーブル上に作成されたインデックスも暗黙的に削除されます。

次の例ではテーブルを削除します。この実験では実行しないでください。

DROP TABLE new_page_view;

データのロードとクエリ

このステップでは、ステージングしたデータをパーティション化された Hive テーブルへロードし、結果をクエリします。

データのロード

Hive テーブルへデータをロードする方法はいくつかあります。HDFS 内の特定の場所を参照する外部テーブルを作成できます。この方法では、HDFS の put または copy コマンドでデータファイルを指定した場所へコピーし、その場所を参照するテーブルを作成します。このテーブルには、関連するすべての 行形式 情報が含まれます。

テーブルを作成した後、データを変換して別の Hive テーブルへ挿入できます。ここでは、最初に log_example.csv ファイルを HDFS へアップロードし、page_view として扱います。対応するパーティションの page_view テーブルへロードするには、次のコマンドを使用します。

まず、外部テーブルを作成して指定したファイルに関連付けます。

CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User',
                Country STRING COMMENT 'country of origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';

次に、データを最終的に保存する page_view テーブルを作成します。

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

この小規模な練習用データセットでは、分散 YARN ジョブは必要ありません。実験用 VM 内で挿入処理を確実に実行するため、この Hive セッションでは Hadoop のローカルジョブランナーを設定します。

SET mapreduce.framework.name=local;

最後に、外部テーブルから page_view テーブルへデータを挿入します。

FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';

ローカルジョブは数秒以内に完了し、条件に一致する行を page_view パーティションへロードします。

...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: ... HDFS Write: ... SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: ... seconds

簡単なクエリ

データを挿入した後、簡単なクエリを実行できます。これは一般的な SQL 文と同様です。Hive のコマンドラインインターフェースで次の文を入力してください。

SELECT * FROM page_view WHERE userid = 0 LIMIT 10;

返された情報は、クエリで取得されたレコードです。

hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...

サービスの停止

このステップでは、Hive を終了し、追加学習用のリソースを確認した後で Hadoop サービスを停止します。

使用を終えたら、quit コマンドで Hive のコマンドラインインターフェースを終了できます。

quit;

HDFS サービスを停止することも忘れないでください。ターミナルで次のコマンドを入力します。

stop-yarn.sh
stop-dfs.sh

まとめ

このセッションでは、Hive のアーキテクチャ、インストールとデプロイ、基本的な HQL 文について学びました。また、サンプルデータを使用したデータのインポートも学習しました。

主な内容は次のとおりです。

  • Hive のアーキテクチャ
  • Hive の基本データ単位
  • Hive のデプロイ方法
  • Hive HQL 言語

一般に、データウェアハウスソフトウェアとしての Hive の機能は、さらに詳しく学ぶ必要があります。技術資料を自主的に復習する習慣を身に付け、続くコースでも学習を続けてください。