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)
ちゃんとデータの投入も上手くいったようだ。
めでたしめでたし。
- 作者: Edward Capriolo,Dean Wampler,Jason Rutherglen,佐藤直生,嶋内翔,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/15
- メディア: 大型本
- この商品を含むブログ (3件) を見る
- 作者: 加嵜長門,田宮直人,丸山弘詩
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/03/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る