HBase – Hadoop Database,一个NoSQL数据库,可存储大量非关系型数据,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC API而不是HBase客户端API来对HBase数据进行操作。
HBase,可以用shell进行操作,也可以用Java api进行操作。HBase虽然是一个数据库,但是它的查询语句对于熟悉了使用MySql、Oracle的人来说,十分的不友好。所以在开发过程中,会使用一些三方驱动,将不友好的HBase语句操作转化为我们熟悉的SQL语句。
Phoenix存在的几个特点&爬过的坑:
不支持直接设置连接超时, 所以这里使用线程池的方式来控制数据库连接超时。
phoenix默认不是auto commit模式,不会在关闭连接时做commit的,需要我们手动调用commit方法。
phoenix/hbase对表名大小写敏感,如果表名为小写字母,则需要加双引号如
select count(1) from "test"
,否则会被转换成大写字母,并且抛TableNotFoundException异常。
以下是工具类代码
public class PhoenixClient {
private final static Logger logger = LoggerFactory.getLogger(PhoenixClient.class);
private final static int CONN_TIMEOUT = 15;
private final static int BATCH_SIZE = 1000;
// 利用静态块的方式初始化Driver,防止加载不到
static {
try {
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
} catch (ClassNotFoundException e) {
logger.error("加载hbase的phoenix驱动失败", e);
}
}
/**
* 获取一个Hbase-Phoenix的连接
* @param host zookeeper的master-host
* @param port zookeeper的master-port
* @return
*/
public static Connection getConnection(String host, String port) {
String url = "jdbc:phoenix:" + host + ":" + port;
return getConnection(url);
}
/**
* 获取一个Hbase-Phoenix的连接jdbc的url类似为
* jdbc:phoenix:192.168.1.101:2181
* jdbc:phoenix:41.test1.com,42.test2.com,43.test3.com:2181
* @return
*/
public static Connection getConnection(final String url) {
Connection conn = null;
try {
// Phoenix不支持直接设置连接超时
// 所以这里使用线程池的方式来控制数据库连接超时
final ExecutorService exec = Executors.newFixedThreadPool(1);
Callable<Connection> call = new Callable<Connection>() {
public Connection call() throws Exception {
return DriverManager.getConnection(url);
}
};
Future<Connection> future = exec.submit(call);
// 如果在设定超时(以秒为单位)之内,还没得到 Connection 对象,则认为连接超时,不继续阻塞
conn = future.get(1000 * CONN_TIMEOUT, Ti