zoukankan      html  css  js  c++  java
  • HBase

    1.概述

      在《Hadoop-Drill深度剖析》一文当中,给大家介绍了Drill的相关内容,就实时查询来说,Drill基本能够满足要求,同时还可以做一个简单业务上的聚合,如果在使用Hive做一些简单的业务统计(不涉及多维度,比如CUBE,ROLLUP之类的函数),只是用一些基本的聚合函数或是JOIN ON之类的,Drill基本满足要求,而且响应速度可比OLTP。今天给大家剖析的是另外一种工具,由于目前Drill官方不支持对表的插入,更新操作。所以,在操作HBase的时候,若遇到这些需求,Drill就有点力不从心。那么,Phoenix可以满足以上需求。它更接近与标准的SQL。

    2.Architecture

      在Phoenix中SQL Query Plan的执行,基本上是通过构建一系列的HBase Scan来完成。为了尽可能减少数据的传输,在Region Server使用Coprocessor来尽可能的执行Aggregate相关的工作,基本实现的思路是使用RegionObserver在PostScannerOpen Hook中将RegionScanner替换成支持Aggregation工作的定制化的Scanner,具体的Aggregate操作通过Custom的Scan属性传递给RegionScanner。然与基于MapReduce的框架执行Plan的思想比较,基本上就是通过Coprocessor,使用RegionServer自身来在各个节点上执行Aggregation。另外,通过各种定制的Filter在HBase的RegionScanner Scan过程中,尽早的将不相关的数据过滤掉。采用JDBC接口和应用程序交互。

    3.Grammar

      本篇博客所对应的软件版本号,如下所示:

    • HBase:0.98
    • Phoenix:4.6-HBase-0.98

      这里需要注意的是,Phoenix的版本是和HBase版本相匹配的,可以在Phoenix的官网选择对应的HBase版本。就本篇博客截止,官方所支持的语法如下图所示:

    3.How to use

      如何将Phoenix嵌入到现有业务当中,其实,Phoenix只是一个中间件(或是一个HBase的SQL插件),它的使用较为简单,首先,我们准备好对应的安装包,下载地址如下所示:

      然后,将Phoenix目录下的phoenix-*.jar拷贝到HBase的lib目录,这里面是将所有的插件均拷贝到HBase了,若是只使用个别插件,大家可按需选择即可。然后重启HBase集群即可。

    3.1 Shell Client

      这里,我们可以验证Phoenix是否可用,可以通过终端来验证,在Phoenix的bin目录当中有一个sqlline.py脚本,可以通过该脚本来操作HBase中的表,命令如下所示:

    ./sqlline.py zk01,zk02,zk03:2181

      通过英文感叹号可以获取帮助命令,如下图所示:

      然后,我们可以做一些测试来,验证起可用性。如下图所示:

      脚本如下所示:

    create table test3 (mykey integer not null primary key, mycolumn varchar);
    upsert into test3 values (1,'Hello');
    upsert into test3 values (2,'World2');
    upsert into test3 values (3,'World3');
    upsert into test3 values (4,'World4');
    upsert into test3 values (5,'World5');
    select * from test3;
    

    3.2 JDBC

      另外,Phoenix也支持JDBC去访问,这里笔者给大家写了一个示例代码,如下所示:

    package cn.smrtloli.phoenix.demo;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * @Date Dec 14, 2015
     *
     * @Author dengjie
     *
     * @Note TODO
     */
    public class PhoenixDemo {
    	private static String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
    
    	public static void main(String[] args) throws SQLException {
    		try {
    			Class.forName(driver);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		Statement stmt = null;
    		ResultSet rset = null;
    
    		Connection con = DriverManager.getConnection("jdbc:phoenix:zk01,zk02,zk03:2181");
    		stmt = con.createStatement();
    		String sql = "select * from test3";
    		rset = stmt.executeQuery(sql);
    		while (rset.next()) {
    			System.out.println(rset.getString("mycolumn"));
    		}
    		stmt.close();
    		con.close();
    	}
    }
    

      另外,在pom.xml中添加如下依赖JAR文件,内容如下所示:

    <dependency>
        <groupId>org.apache.phoenix</groupId>
        <artifactId>phoenix-core</artifactId>
        <version>4.6.0-HBase-0.98</version>
    </dependency>

      运行结果,如下所示:

    4.总结

      就使用的结果来看,虽然满足了一些CRUD的操作,然其在HBase的基础上完成,过于依赖HBase,对其他存储介质的支持有限。总体来说,对于HBase中已有数据,做标准的SQL操作来说,是足够了。另外,时延要求较高的业务,还是用HBase的API来完成,Phoenix虽说速度、性能较快,毕竟不能严格意义上达到OLTP。

    5.结束语

      这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/smartloli/p/5047527.html
Copyright © 2011-2022 走看看