• 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.结束语

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

  • 相关阅读:
    windows使用zip包安装mysql8.0.12
    windows使用msi包安装mysql8.0.12
    查看mysql的bin-log日志
    修改zabbix的端口号
    mysql备份脚本并保留7天
    上海坤亿
    nginx面试题
    服务器导入导出数据
    轮询和长轮询
    Python 三种读文件方法read(), readline(), readlines()及去掉换行符
  • 原文地址:https://www.cnblogs.com/smartloli/p/5047527.html
Copyright © 2020-2023  润新知