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 모듈을 만드는 게 나을 수도.. 

Posted by 김용환 '김용환'

댓글을 달아 주세요