CUBE SUGAR CONTAINER

技術系のこと書きます。

Apache Hive を JDBC 経由で操作する

以前、Apache Hive の環境構築についてこのブログで書いた。

blog.amedama.jp

上記では Hive を操作するのに、同梱されたシェルを使っていた。 今回は JDBC (Java Database Connectivity) を使って操作する例を示す。

環境については先ほど紹介したエントリで構築されていることが前提になっている。 具体的には、次の環境変数が設定されているところがポイント。

$ echo $HADOOP_CONF_DIR
/home/vagrant/hadoop-2.8.0/etc/hadoop
$ echo $HIVE_HOME
/home/vagrant/apache-hive-1.2.2-bin

HiveServer2 を起動する

ぶっちゃけ JDBC 経由で Hive を操作するのに必要なのは HiveServer2 を起動することだけ。

$ $HIVE_HOME/bin/hiveserver2

あるいは hive コマンドに --service オプションで hiveserver2 を指定しても起動できる。

$ $HIVE_HOME/bin/hive --service hiveserver2

これで TCP:10000 で JDBC 用のポートを Listen し始める。

$ sudo netstat -tlnp | grep 10000
tcp        0      0 0.0.0.0:10000           0.0.0.0:*               LISTEN      22315/java

beeline で動作を確認する

HiveServer2 が起動できたら、まずは Hive に同梱されている beeline というシェルを使って接続してみよう。

次のようにして接続する。

$ $HIVE_HOME/bin/beeline -u jdbc:hive2://master:10000 -n vagrant

すると、次のようにインタラクティブシェルが起動する。

0: jdbc:hive2://master:10000>

あとは、ここに Hive で実行したい SQL を入力していくだけ。

> SHOW DATABASES;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
+----------------+--+
1 row selected (1.439 seconds)

次のような感じで普通に使える。

> CREATE TABLE users (name STRING);
No rows affected (0.372 seconds)
> SHOW TABLES;
+-----------+--+
| tab_name  |
+-----------+--+
| users     |
+-----------+--+
1 row selected (0.053 seconds)
> INSERT INTO users VALUES ("Alice");
...(snip)...
No rows affected (19.367 seconds)
> SELECT * FROM users;
+-------------+--+
| users.name  |
+-------------+--+
| Alice       |
+-------------+--+
1 row selected (0.192 seconds)
> DROP TABLE users;
No rows affected (1.088 seconds)

Apache Spark から使ってみる

試しに Apache Spark からも接続してみよう。

まずはバイナリをダウンロードしてきて展開する。

$ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz
$ tar xf spark-2.1.1-bin-hadoop2.7.tgz

環境変数 SPARK_HOME を設定しておく。

$ cat << 'EOF' >> ~/.bashrc
export SPARK_HOME=~/spark-2.1.1-bin-hadoop2.7
EOF
$ source ~/.bashrc

Apache Spark のディレクトリ内には Hive に JDBC で接続するための jar ファイルがある。 なので、特に新しい jar ファイルを用意しなくても接続できる。

$ find $SPARK_HOME/jars | grep hive-jdbc
/home/vagrant/spark-2.1.1-bin-hadoop2.7/jars/hive-jdbc-1.2.1.spark2.jar

クラスタマネージャに YARN を指定して Spark シェルを起動しよう。

$ $SPARK_HOME/bin/spark-shell --master yarn

Hive 用の JDBC ドライバをロードする。

scala> Class.forName("org.apache.hive.jdbc.HiveDriver");
res0: Class[_] = class org.apache.hive.jdbc.HiveDriver

SQL のコネクションを取得するための DriverManager をインポートする。

scala> import java.sql.DriverManager
import java.sql.DriverManager

先ほど beeline で使ったのと同じ URL を指定してコネクションを取得する。

scala> val connection = DriverManager.getConnection("jdbc:hive2://master:10000", "vagrant", "");
connection: java.sql.Connection = org.apache.hive.jdbc.HiveConnection@1a4564a2

そしてコネクションからステートメントを得る。

scala> val statement = connection.createStatement();
statement: java.sql.Statement = org.apache.hive.jdbc.HiveStatement@7a085d02

あとは、ここで SQL を実行すれば良い。 結果は ResultSet として得られる。

scala> val resultSet = statement.executeQuery("SHOW DATABASES");
resultSet: java.sql.ResultSet = org.apache.hive.jdbc.HiveQueryResultSet@3100b5cf

あとは ResultSet から結果を取り出す。

scala> resultSet.next()
res1: Boolean = true
scala> resultSet.getString("DATABASE_NAME")
res2: String = default

おまけ (SparkSQL)

とはいえ Apache Spark は SparkSQL があるので上記のように JDBC 経由で Hive を使わなくても SQL が実行できるっぽい。

まずは SparkSession をインポートしておく。

scala> import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession

その上で Hive サポートを有効にした SparkSession を取得する。

scala> val sparkSession = SparkSession.builder.master("yarn").appName("SparkSession with Hive support").enableHiveSupport().getOrCreate()
17/06/22 20:59:35 WARN sql.SparkSession$Builder: Using an existing SparkSession; some configuration may not take effect.
sparkSession: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@55ba4bff

あとは得られたセッション経由で SQL を実行するだけ。

scala> val df = sparkSession.sql("SHOW DATABASES")
df: org.apache.spark.sql.DataFrame = [databaseName: string]

結果が DataFrame で返ってくるから扱いやすい。

scala> df.show()
+------------+
|databaseName|
+------------+
|     default|
+------------+

まとめ

今回は HiveServer2 を起動することで Apache Hive を JDBC 経由で扱えるようにする方法について書いた。

プログラミング Hive

プログラミング Hive

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