Apache Phoenix 드라이버를 사용할 때 유의할 사항이 있다.
play2의 db에서는 jdbc url에 매개변수(또는 configuration)을 추가할 수 없다. 즉 DriverManager.getConnection("..", props)에서 props에 관련 설정을 추가해야 한다.
아래와 같은 방식은 사용할 수 없다.
db {
default.driver = org.apache.phoenix.jdbc.PhoenixDriver
default.url = "jdbc:phoenix:hbase-md15b1-031.dakao.io:8765/kemi;phoenix.schema.isNamespaceMappingEnable=true;phoenix.functions.allowUserDefinedFunctions=true"
default.logSql = true
default.username = ""
default.password = ""
}
문서를 잘 보면. 덜 개발되었다..
참고 https://phoenix.apache.org
Use JDBC to get a connection to an HBase cluster like this:
Connection conn = DriverManager.getConnection("jdbc:phoenix:server1,server2:3333",props);
where props are optional properties which may include Phoenix and HBase configuration properties, and the connection string which is composed of:
jdbc:phoenix [ :<zookeeper quorum> [ :<port number> [ :<root node> [ :<principal> [ :<keytab file> ] ] ] ] ]
아래와 같이 사용해야 한다.
Properties props = new Properties();
props.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
props.setProperty("phoenix.functions.allowUserDefinedFunctions", "true");
connection = DriverManager.getConnection("jdbc:phoenix:...", props);
또한 sbt 또한 문제가 있다. sbt에서 apache phoenix 드라이버를 사용하기 위해 lib, guava 이슈를 해결해야 한다. 얼추 해결되더라도 추후 runtime 이슈가 생길 수 있다.
사례 1
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.phoenix.query.ConfigurationFactory$ConfigurationFactoryImpl$1.call(ConfigurationFactory.java:49)
at org.apache.phoenix.query.ConfigurationFactory$ConfigurationFactoryImpl$1.call(ConfigurationFactory.java:46)
at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:76)
at org.apache.phoenix.util.PhoenixContextExecutor.callWithoutPropagation(PhoenixContextExecutor.java:91)
at org.apache.phoenix.query.ConfigurationFactory$ConfigurationFactoryImpl.getConfiguration(ConfigurationFactory.java:46)
at org.apache.phoenix.jdbc.PhoenixDriver.initializeConnectionCache(PhoenixDriver.java:151)
at org.apache.phoenix.jdbc.PhoenixDriver.<init>(PhoenixDriver.java:142)
resolvers += "Cloudera Repository" at "https://repository.cloudera.com/artifactory/cloudera-repos/"
libraryDependencies ++= Seq(
"org.apache.hbase" % "hbase" % "1.2.6",
"org.apache.hbase" % "hbase-common" % "1.2.6",
"org.apache.hbase" % "hbase-client" % "1.2.6",
"org.apache.hbase" % "hbase-server" % "1.2.6",
"org.apache.phoenix" % "phoenix-core" % "4.11.0-HBase-1.2",
..)
사례 2
org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator
libraryDependencies ++= Seq(
"com.google.guava" % "guava" % "13.0.1" force(),
"org.apache.hbase" % "hbase" % "1.2.6",
"org.apache.hbase" % "hbase-common" % "1.2.6",
"org.apache.hbase" % "hbase-client" % "1.2.6",
"org.apache.hbase" % "hbase-server" % "1.2.6",
"org.apache.phoenix" % "phoenix-core" % "4.11.0-HBase-1.2")
결론은 apache phoenix를 연동하기 위해 play2-sbt를 사용하는 것은 조금 귀찮을 수 있다..
scala를 쓰려면 무거운 play2보다는 경량 프레임워크를 사용하고 내가 db 모듈을 만드는 게 나을 수도..