CUBE SUGAR CONTAINER

技術系のこと書きます。

Apache Hive を HiveServer2 経由で操作する

Apache Hive を操作する方法としては、以前から hive というコマンドラインツールが提供されている。 ただ、この方法だと hive コマンドがインストールされたホストでしか Apache Hive を操作できない。 また、Hadoop エコシステムを形成する別のソフトウェアと連携させるときにも共通プロトコルがないと都合が悪い。 そのため、今では HiveServer2 というサービスを起動して JDBC 経由で操作する方法が用意されている。 今回は、そのやり方について書く。

使った環境は次の通り。

$ cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
$ uname -r
3.10.0-693.11.1.el7.x86_64
$ hive --version
Hive 2.3.2
Git git://stakiar-MBP.local/Users/stakiar/Desktop/scratch-space/apache-hive -r 857a9fd8ad725a53bd95c1b2d6612f9b1155f44d
Compiled by stakiar on Thu Nov 9 09:11:39 PST 2017
From source with checksum dc38920061a4eb32c4d15ebd5429ac8a
$ hadoop version
Hadoop 2.8.3
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b3fe56402d908019d99af1f1f4fc65cb1d1436a2
Compiled by jdu on 2017-12-05T03:43Z
Compiled with protoc 2.5.0
From source with checksum 9ff4856d824e983fa510d3f843e3f19d
This command was run using /home/vagrant/hadoop-2.8.3/share/hadoop/common/hadoop-common-2.8.3.jar

メタストアに使う MariaDB をセットアップする

Apache Hive はテーブルのスキーマ定義などメタデータを RDBMS に保存する。 今回は、その保存先として MariaDB を使うことにした。

まずは MariaDB をインストールして起動する。

$ sudo yum -y install mariadb-server
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

続いてログイン用のアカウントを設定する。 ここでは root ユーザを使っているけど、本来はちゃんと Hive 専用のアクセス制御されたユーザを作るのが望ましい。

$ mysqladmin password rootpassword -u root

一旦、上記のアカウントで MariaDB にログインできることを確かめておこう。

$ mysql -uroot -prootpassword
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

後は MariaDB を操作するための Java のドライバをインストールしておこう。 今回は yum でインストールできるものを使った。

$ sudo yum -y install mysql-connector-java
$ ln -s /usr/share/java/mysql-connector-java.jar $HIVE_HOME/lib

Hive を設定する

続いて Apache Hive の設定ファイル (hive-site.xml) を編集する。 先ほどセットアップした MariaDB をメタストアとして使う設定と HiveServer2 の認証情報を設定している。

$ cat << 'EOF' > $HIVE_HOME/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>rootpassword</value>
  </property>
  <property>
    <name>hive.server2.authentication</name>
    <value>NONE</value>
  </property>
  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>
</configuration>
EOF

HiveServer2 は外部のサービスと連携するため、認証の仕組みも用意されている。 LDAP との連携などもできるようになっているが、ここではそういった認証の仕組みを用いない (NONE) ことを指定している。

メタストアを初期化する

設定を投入したら、まずはメタストアを初期化する。 これで Apache Hive がメタデータを管理するテーブルなどが MariaDB に用意される。

$ schematool -dbType mysql -initSchema 2>/dev/null
Metastore connection URL:    jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true
Metastore Connection Driver :  com.mysql.jdbc.Driver
Metastore connection User:   root
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed
$ schematool -dbType mysql -info 2>/dev/null
Metastore connection URL:    jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true
Metastore Connection Driver :  com.mysql.jdbc.Driver
Metastore connection User:   root
Hive distribution version:   2.3.0
Metastore schema version:    2.3.0
schemaTool completed

メタストアサービスを起動する

続いてはメタストアのサービスを起動する。

$ hive --service metastore

メタストアは独立したホストで管理することも想定されているため、このようにサービスとして分離されている。 可用性の面からは、むしろ独立したホストとして用意することがおすすめされているそうだ。

デフォルトではメタストアのサービスが TCP の 9083 ポートでサービスが立ち上がる。

$ ss -tlnp | grep :9083
LISTEN     0      50           *:9083                     *:*                   users:(("java",pid=25826,fd=468))

HiveServer2 のサービスを起動する

続いて HiveServer2 のサービスを起動する。

$ hive --service hiveserver2

デフォルトでは TCP の 10000 ポートでサービスが立ち上がる。

$ ss -tlnp | grep :10000
LISTEN     0      50           *:10000                    *:*                   users:(("java",pid=26338,fd=475))

Beeline で Apache Hive を操作する

これで Apache Hive を HiveServer2 から操作する準備が整った。

HiveServer2 経由で Apavhe Hive を操作するには Beeline という新しいクライアントが用意されている。 次のようにして JDBC 経由で接続しよう。 URI の後ろに続くのは接続に使うアカウントの情報で、認証に NONE を指定したときはセットアップしたホストのものを使うらしい。

$ beeline -u jdbc:hive2://localhost:10000 vagrant vagrant
...
0: jdbc:hive2://localhost:10000>

上記は beeline コマンドを実行するタイミングで接続先を指定しているけど、次のように起動した後に接続することもできる。

$ beeline
...
beeline> !connect jdbc:hive2://localhost:10000

Beeline を使ってみる

試しに適当なデータを入れてみよう。

まずはテーブルを定義する。

0: jdbc:hive2://localhost:10000> CREATE TABLE users (
. . . . . . . . . . . . . . . .>   name STRING,
. . . . . . . . . . . . . . . .>   age INT
. . . . . . . . . . . . . . . .> );
No rows affected (1.01 seconds)

テーブルができた。

0: jdbc:hive2://localhost:10000> SHOW TABLES;
+-----------+
| tab_name  |
+-----------+
| users     |
+-----------+
1 row selected (0.663 seconds)

とはいえ Apache Hive はデータの読み取り時にスキーマを適用するシステムになっている。 そのため、実際にレコードを投入してみないと上手くいっているかは分からない。

0: jdbc:hive2://localhost:10000> INSERT INTO TABLE users VALUES ("Alice", 20);
...
No rows affected (31.243 seconds)

投入したレコードを確認してみる。

0: jdbc:hive2://localhost:10000> SELECT * FROM users;
+-------------+------------+
| users.name  | users.age  |
+-------------+------------+
| Alice       | 20         |
+-------------+------------+
1 row selected (0.514 seconds)

ちゃんとデータの投入も上手くいったようだ。

めでたしめでたし。

プログラミング Hive

プログラミング Hive

  • 作者: Edward Capriolo,Dean Wampler,Jason Rutherglen,佐藤直生,嶋内翔,Sky株式会社玉川竜司
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/06/15
  • メディア: 大型本
  • この商品を含むブログ (3件) を見る

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ