【入門】Apache Hive とは?メタストアや HiveServer を解説

Apache HiveApache Hive とは、分散ストレージHadoop など) のデータセットに対して、SQL クエリで「読み取り・書き込み・管理」するソフトウェアです。
スポンサーリンク

最初に

本記事は、以下のビッグデータ分析基盤シリーズの「ストリーム処理」編です。

対象者

スポンサーリンク

Apache Hive と Presto の違い

同じ SQL クエリエンジンの Presto と Hive の違いを比較します。

Apache HivePresto
中間結果ストレージに書き出しメモリに書き出し
動作遅い(ストレージに書き出すため)速い(メモリに書き出すため)
データ規模大規模(メモリに乗り切らないデータも)小・中規模(メモリに乗り切るデータ)
障害発生時ストレージに保存した中間データから再開最初からやり直し
スポンサーリンク

Apache Hive を構成する4つのサービス

Apache Hive は主に次の 4 つのサービスから構成されています。

  • MetaStore サービス
  • HiveServer サービス
  • HiveServer2 サービス
  • WebHCat サービス

Apache Hive と クライアント、Hadoopデータベースの関連は以下のようになっています。

サービス1. MetaStore サービス

メタストアとは、メタデータを管理するデータベースのことです。

MetaStore サービスは Apache Hive がメタストアからメタデータをロードしたりストアしたりするためのサービスです。下記のファイルを例に、具体的なメタデータを例示します。

  • Hadoop 上のファイルのデータ
  • 24957,Mr. Lemuel Schamberger MD,2014-01-17 06:50:01
    25471,Cornelius Schinner,2014-01-04 10:56:48
  • メタデータの例
    • 1番目のフィールドは ID
    • 2番目のフィールドは Name
    • 3番目のフィールドは Date
    • フィールドの区切り文字は ','
    • 行の区切り文字は '¥n'
  • Apache Hive のテーブル
    ID	Name	Date
    24957	Mr. Lemuel Schamberger MD	2014-01-17 06:50:01
    25471	Cornelius Schinner	2014-01-04 10:56:48

サービス2. HiveServer サービス

リモートクライアントからの受け取った SQL クエリを実行し結果を取得するサービスです。hive コマンドで Apache Hive にアクセスした場合は、このサービスが SQL クエリを実行します。

なお、Hive で利用可能な SQL 構文は、HiveQL と呼ばれ、CTAS (create table as select) が利用可能であったり、トランザクションが使えなかったりと若干の違いが見られる。

サービス3. HiveServer2 サービス

HiveServer の改良版であり、マルチクライアントの並列実行認証をサポートします。
後述する beeline コマンドや ODBC, JDBC で Apache Hive にアクセスした場合は、HiveServer2 サービスが SQL クエリを実行します。

JDBC については以下の記事で説明しています。

HiveServer2 についてもっと知りたい方は公式ドキュメントをどうぞ。

The current implementation, based on Thrift RPC, is an improved version of HiveServer and supports multi-client concurrency and authentication. It is designed to provide better support for open API clients like JDBC and ODBC.

https://cwiki.apache.org/confluence/display/Hive/Setting+up+HiveServer2

サービス4. WebHCat

リモートクライアントからの受け取った Rest API を実行し結果を取得するサービスです。curl コマンドなどを利用して Apache Hive を操作することが可能です。

詳細を知りたい方は下記のドキュメントをご覧ください。

WebHCat UsingWebHCat - Apache Hive - Apache Software Foundation

Apache Hive のインストール

ここからは Apache HadoopApache Hive を実際にインストールして、Apache Hive を触ってみます。

Apache Hadoop をインストール

まずは、以下の記事を参考に Apache Hadoop をインストールします。

Apache Hive をインストール

次に Apache Hive をインストールします。まずは下記のサイトより、Apache Hive の最新バージョンを確認します。

Index of /pub/apache/hive

Apache Hive を以下のコマンドでダウンロードします。(赤線箇所は上記サイトで確認したバージョンの URL を指定してください

  1. curl https://ftp.jaist.ac.jp/pub/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz -O
  2. tar zxfv apache-hive-3.1.2-bin.tar.gz
  3. hadoop fs -mkdir -p /user/hive/warehouse
    hadoop fs -chmod g+w /user/hive/warehouse
    hadoop fs -mkdir -p /tmp
    hadoop fs -chmod g+w /tmp
  4. echo "export PATH=$PATH:/home/`whoami`/apache-hive-3.1.2-bin/bin/" >> ~/.bash_profile
    source ~/.bash_profile
  5. ls apache-hive-3.1.2-bin/lib/guava-*
    ls hadoop-3.3.0/share/hadoop/hdfs/lib/guava-*
    1. 上記のコマンドで確認できる guava のバージョンが一致していない場合、以降の操作で次のエラーが発生します。

      Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
    2. そのため、HadoopHive の guava のバージョンが一致していない場合は、Hive の guava を Hadoop の guava に置き換えてください。

      rm apache-hive-3.1.2-bin/lib/guava-*
      cp hadoop-3.3.0/share/hadoop/hdfs/lib/guava-* apache-hive-3.1.2-bin/lib/
  6. Hive を初期化します。

    メタストアとして MariaDB を利用する場合

    sudo yum -y install mariadb-server
    sudo systemctl start mariadb
    mysqladmin password test -u root
    mysql -u root -ptest
    exit
    vim apache-hive-3.1.2-bin/conf/hive-site.xml
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
      <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>test</value>
      </property>
    </configuration>
    sudo yum -y install mysql-connector-java
    sudo ln -s /usr/share/java/mysql-connector-java.jar apache-hive-3.1.2-bin/lib/
    schematool -dbType mysql -initSchema --verbose

    メタストアとして derby を利用する場合(手順が簡単)

    schematool -dbType derby -initSchema --verbose

Apache Hive の使い方

データの事前準備

以降の Apache Hive の操作では、以下のテストデータを使用するものとします。

vim test.csv
24957,Mr. Lemuel Schamberger MD,2014-01-17 06:50:01
25471,Cornelius Schinner,2014-01-04 10:56:48
29089,Dr. Buford Schmitt IV,2014-01-17 09:09:54
26653,Kaya Hartmann,2014-01-12 00:54:56
23678,Dr. Sheila Balistreri,2013-12-28 04:15:09
22632,Cyrus Hackett,2014-01-22 20:34:43
24794,Cielo Wolf,2014-01-10 01:00:27
27733,Kaycee Lindgren,2014-01-25 18:26:25
29774,Cathrine Harvey,2014-01-17 11:30:28
24616,Lola Marvin,2014-01-12 11:18:54
22805,Elisha Crooks,2014-01-26 08:52:18
21365,Cleve Pagac,2014-01-22 05:06:21
21744,Eldon Champlin DDS,2014-01-11 08:02:30
25471,Cornelius Schinner,2014-01-04 10:56:48
23680,Dr. Sheila Balistreri,2013-12-28 04:25:09
22632,Cyrus Hackett,2014-01-22 20:34:43

hive コマンドの使い方

hive コマンドを実行して SQL クエリで先程作成した test.csv ファイルを操作してみます。

  1. CREATE DATABASE test LOCATION '/tmp/hive/';
    show databases;
    default //最初から存在するデータベースです。
    test //作成したデータベースが確認できます
  2. CREATE TABLE test.test_table(
             id int,
             name varchar(20),
             dates timestamp
             )
             ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n';

    ファイルをテーブルに変換するためのメタデータは次のように定義します。

    • 1番目のフィールドは ID
    • 2番目のフィールドは名前
    • 3番目のフィールドは時間
    • フィールドの区切り文字は ','
    • 行の区切り文字は '¥n'
    use test;
    show tables;
    test_table
  3. LOAD DATA LOCAL INPATH './test.csv' INTO TABLE test_table;
  4. select * from test_table;
    24957	Mr. Lemuel Schamberg	2014-01-17 06:50:01
    25471	Cornelius Schinner	2014-01-04 10:56:48
    29089	Dr. Buford Schmitt I	2014-01-17 09:09:54
    26653	Kaya Hartmann	2014-01-12 00:54:56
    23678	Dr. Sheila Balistrer	2013-12-28 04:15:09
    22632	Cyrus Hackett	2014-01-22 20:34:43
    24794	Cielo Wolf	2014-01-10 01:00:27
    27733	Kaycee Lindgren	2014-01-25 18:26:25
    29774	Cathrine Harvey	2014-01-17 11:30:28
    24616	Lola Marvin	2014-01-12 11:18:54
    22805	Elisha Crooks	2014-01-26 08:52:18
    21365	Cleve Pagac	2014-01-22 05:06:21
    21744	Eldon Champlin DDS	2014-01-11 08:02:30
    25471	Cornelius Schinner	2014-01-04 10:56:48
    23680	Dr. Sheila Balistrer	2013-12-28 04:25:09
    22632	Cyrus Hackett	2014-01-22 20:34:43
  5. exit;

上記により、hive コマンドで SQL クエリを利用して test.csv ファイルのデータを操作可能であることを確認できました。

beeline コマンドの使い方

beeline コマンドを実行して SQL クエリで test.csv ファイルを操作してみます。

  1. beeline -u "jdbc:hive2:///test hive"

    赤線箇所はユーザー名です。パスワードを聞かれますが、何も入力せずに Enter で OK です。
    上記でアクセス出来ない場合は以下のコマンドも試してみてください。

    beeline
    !connect jdbc:hive2://localhost:10000/test hive

    test データベースがない場合は、なお、本記事の hive コマンドの節をご覧ください

  2. select * from test_table;
    +----------------+-----------------------+------------------------+
        | test_table.id  |    test_table.name    |    test_table.time     |
        +----------------+-----------------------+------------------------+
        | 24957          | Mr. Lemuel Schamberg  | 2014-01-17 06:50:01.0  |
        | 25471          | Cornelius Schinner    | 2014-01-04 10:56:48.0  |
        | 29089          | Dr. Buford Schmitt I  | 2014-01-17 09:09:54.0  |
        | 26653          | Kaya Hartmann         | 2014-01-12 00:54:56.0  |
        | 23678          | Dr. Sheila Balistrer  | 2013-12-28 04:15:09.0  |
        | 22632          | Cyrus Hackett         | 2014-01-22 20:34:43.0  |
        | 24794          | Cielo Wolf            | 2014-01-10 01:00:27.0  |
        | 27733          | Kaycee Lindgren       | 2014-01-25 18:26:25.0  |
        | 29774          | Cathrine Harvey       | 2014-01-17 11:30:28.0  |
        | 24616          | Lola Marvin           | 2014-01-12 11:18:54.0  |
        | 22805          | Elisha Crooks         | 2014-01-26 08:52:18.0  |
        | 21365          | Cleve Pagac           | 2014-01-22 05:06:21.0  |
        | 21744          | Eldon Champlin DDS    | 2014-01-11 08:02:30.0  |
        | 25471          | Cornelius Schinner    | 2014-01-04 10:56:48.0  |
        | 23680          | Dr. Sheila Balistrer  | 2013-12-28 04:25:09.0  |
        | 22632          | Cyrus Hackett         | 2014-01-22 20:34:43.0  |
        +----------------+-----------------------+------------------------+

Apache Hive メタストアを確認(MariaDB を利用している場合)

Apache Hive により、メタストアにどのようなデータが作成されたのか確認します。

  1. mysql -u root -ptest
  2. use metastore;

    メタストアとして利用しているデータベース名を指定してください。

  3. select * from COLUMNS_V2;
    +-------+---------+--------------+-------------+-------------+
    | CD_ID | COMMENT | COLUMN_NAME  | TYPE_NAME   | INTEGER_IDX |
    +-------+---------+--------------+-------------+-------------+
    |     1 | NULL    | id           | int         |           0 |
    |     1 | NULL    | name         | varchar(20) |           1 |
    |     1 | NULL    | time         | timestamp   |           2 |
    +-------+---------+--------------+-------------+-------------+
  4. select TBL_ID, TBL_NAME from TBLS;
    +--------+------------+
    | TBL_ID | TBL_NAME   |
    +--------+------------+
    |      1 | test_table |
    +--------+------------+
  5. select * from SERDE_PARAMS ;
    +----------+----------------------+-------------+
    | SERDE_ID | PARAM_KEY            | PARAM_VALUE |
    +----------+----------------------+-------------+
    |        1 | field.delim          | ,           |
    |        1 | line.delim           | 
               |
    |        1 | serialization.format | ,           |
    +----------+----------------------+-------------+

関連記事

ビッグデータ分析基盤入門シリーズは以下です。


参考にした記事

公式ドキュメント

Apache Hive

以下のサイトに参考にさせていただきました。