以前、Apache Hive の環境構築についてこのブログで書いた。
上記では 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 経由で扱えるようにする方法について書いた。
- 作者: Edward Capriolo,Dean Wampler,Jason Rutherglen,佐藤直生,嶋内翔,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/15
- メディア: 大型本
- この商品を含むブログ (3件) を見る