HiveのmetastoreにPostgreSQLを使う
とりあえず試しにやってみただけメモ。
よくわからずやってるので、無駄なものとかあるかも。
手順
- PostgreSQLを入れて、よしなに設定する。
- Hiveについてくるscripts/metastore/upgrade/hive-schema-x.x.x.postgres.sqlを流す。
- hive/lib にPostgreSQLのJDBCドライバの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 を変更したらエラーは出ないようになったけど、色々と不安だらけだ・・・