安装

原理

二级索引

常见的二级索引方案有下面几种:

  1. MapReduce方案
  2. ITHBASE方案
  3. IHBASE方案
  4. Coprocessor方案
  5. ES+Hbase方案
  6. Phoenix二级索引方案

Phoenix

安装

  1. 下载并解压

根据HBase版本下载对应的Phoenix安装包,例如HBase2.2.4,下载对应的包apache-phoenix-5.0.0-HBase-2.0,放到一个目录下,这里跟hbase放到同一个目录/usr/local/hbase,然后解压

tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz

  1. 拷贝jar包及配置文件

将解压后的两个jar包拷贝到hbase的lib目录,然后将hbase的con目录下hbase-site.xml拷贝到Phoenix的bin目录

cp /usr/local/hbase/apache-phoenix-5.0.0-HBase-2.0-bin/phoenix-5.0.0-HBase-2.0-client.jar /usr/local/hbase/hbase-2.2.4/lib/phoenix-5.0.0-HBase-2.0-client.jar

cp /usr/local/hbase/apache-phoenix-5.0.0-HBase-2.0-bin/phoenix-core-5.0.0-HBase-2.0.jar //usr/local/hbase/hbase-2.2.4/lib/phoenix-core-5.0.0-HBase-2.0.jar

cp /usr/local/hbase/hbase-2.2.4/conf/hbase-site.xml /usr/local/hbase/apache-phoenix-5.0.0-HBase-2.0-bin/bin/hbase-site.xml
  1. 重启hbase,启动Phoenix

在这之前要保证hdfs、hbase、zk都是启动状态,如果没有启动则按照下面步骤启动

# 分别配置好hdfs、hbase、zk的环境变量,直接执行sh脚本启动
start-dfs.sh
start-hbase.sh
zkServer.sh start
stop-hbase.sh
# hbase-daemon.sh stop master
# hbase-daemon.sh stop regionserver

start-hbase.sh

cd /usr/local/hbase/apache-phoenix-5.0.0-HBase-2.0-bin
bin/sqlline.py vm0:2181
  1. 测试
# 查看表
!tables

# 创建表
create table user(
id varchar primary key,
info.name varchar,
info.password varchar
);

# 插入数据(upsert,不是insert)
upsert into user(id,name,password) values('001','admin','admin');
upsert into user(id,name,password) values('002','admin','admin');

# 查询数据
select * from user;

# 删除数据
delete from user where id='002';

在hbase中查看通过Phoenix创建的表

hbase shell
# Phoenix中创建的表在hbase中是大写的
scan "USER"
  1. java项目集成Phoenix
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>5.0.0-HBase-2.0</version>
</dependency>

还需要引入jar包phoenix-5.0.0-HBase-2.0-client.jar

private static void testSelect() {
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            connection = DriverManager.getConnection("jdbc:phoenix:vm0:2181","root","root");
            statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select * from USER ");
            while(resultSet.next()){
                String id = resultSet.getString("ID");
                System.out.println(id);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void testInsert(){
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            connection = DriverManager.getConnection("jdbc:phoenix:vm0:2181","root","root");
            statement = connection.createStatement();
            int b = statement.executeUpdate("upsert into user(id,name,password) values('006','admin','admin')");
            System.out.println(b);
            connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connection.close();
                statement.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

概念

数据迁移

HDFS<->Hbase

ETL

参考

TiDB 文档