HiveでMySQLを使ったLocal Metastoreの設定方法

情報はあるけど一応めもっとく

Cloudera版のHive 0.7.1をインストールするとデフォルトではEmbeded Metastoreになっている。

この状態だとHiveのメタデータの管理がDerbyという組み込みDBを使っているので、単一プロセスからしか接続できない。

なので複数のプロセスから扱おうとすると以下のようなエラーが出る。

hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database '/var/lib/hive/metastore/metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database '/var/lib/hive/metastore/metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

そこで組み込みDBではなくMySQL(PostgreSQLでもいいけど)を使って複数のプロセスから扱えるようにします。これがLocal Metastoreです。

元ネタはこの辺

基本的にはClouderaの記事を参考にしました。

MySQLJDBCドライバの設定。

$ curl -L 'http://www.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.15.tar.gz/from/http://mysql.he.net/' | tar xz
$ sudo cp mysql-connector-java-5.1.15/mysql-connector-java-5.1.15-bin.jar /usr/lib/hive/lib/

これを忘れると

hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalInternalException: Error creating transactional connection factory

とか言われる。

MySQLのインストール

# yum install mysql-server

MySQLの設定

# mysql -u root -p
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.7.0.mysql.sql;
mysql> CREATE USER hiveuser@localhost IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON metastore.* TO hiveuser@localhost;
mysql> FLUSH PRIVILEGES;

/etc/hive/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</value>
</property>
 
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>
 
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser</value>
</property>
 
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>password</value>
</property>
 
<property>
  <name>datanucleus.autoCreateSchema</name>
  <value>false</value>
</property>
 
<property>
  <name>datanucleus.fixedDatastore</name>
  <value>true</value>
</property>

</configuration>

いじょ