HiveのmetastoreにPostgreSQLを使う

とりあえず試しにやってみただけメモ。
よくわからずやってるので、無駄なものとかあるかも。


手順

  • PostgreSQLを入れて、よしなに設定する。
  • Hiveについてくるscripts/metastore/upgrade/hive-schema-x.x.x.postgres.sqlを流す。
  • hive/lib にPostgreSQLJDBCドライバのjarファイルを入れる。
  • hive-site.xmlを修正する。
<property>
  <name>hive.metastore.local</name>
  <value>true</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:postgresql://xxx:5432/xxx</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>org.postgresql.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>xxx</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>xxx</value>
</property>

で、、、

なんとなく設定できたみたいなんだけど、hive上で「show tables;」とやるとエラーが出る。
create tableやselectなどは問題なし。

エラーはこんな感じ

 ERROR exec.FetchTask (SessionState.java:printError(365)) - FAILED: Error in metadata: MetaException(message:Got exception: javax.jdo.JDODataStoreException Error executing JDOQL query "SELECT "THIS"."TBL_NAME" AS NUCORDER0 FROM "TBLS" "THIS" LEFT OUTER JOIN "DBS" "THIS_DATABASE_NAME" ON "THIS"."DB_ID" = "THIS_DATABASE_NAME"."DB_ID" WHERE "THIS_DATABASE_NAME"."NAME" = ? AND (LOWER("THIS"."TBL_NAME") LIKE ? ESCAPE '\\' ) ORDER BY NUCORDER0 " : ERROR: エスケープシーケンスが無効です
  ヒント: エスケープ文字は空か1文字でなければなりません。.)
 org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Got exception: javax.jdo.JDODataStoreException Error executing JDOQL query "SELECT "THIS"."TBL_NAME" AS NUCORDER0 FROM "TBLS" "THIS" LEFT OUTER JOIN "DBS" "THIS_DATABASE_NAME" ON "THIS"."DB_ID" = "THIS_DATABASE_NAME"."DB_ID" WHERE "THIS_DATABASE_NAME"."NAME" = ? AND (LOWER("THIS"."TBL_NAME") LIKE ? ESCAPE '\\' ) ORDER BY NUCORDER0 " : ERROR: エスケープシーケンスが無効です
  ヒント: エスケープ文字は空か1文字でなければなりません。.)


原因は、PostgreSQL 9.1からstandard_conforming_stringsの設定がoffからonに変わったためのよう。
http://www.postgresql.org/docs/9.1/static/release-9-1.html


postgresql.conf を変更したらエラーは出ないようになったけど、色々と不安だらけだ・・・