Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目。

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。

Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。
HBase的查询工具有很多,如:Hive、Tez、Impala、Spark SQL、Phoenix等。
Phoenix通过以下方式使我们可以少写代码,并且性能比我们自己写代码更好:

  1. 将SQL编译成原生的HBase scans。
  2. 确定scan关键字的最佳开始和结束
  3. 让scan并行执行
  4. ...
  • 下载
    cd /home/hadoop/apps/ 
    wget http://mirrors.hust.edu.cn/apache/phoenix/apache-phoenix-5.0.0-HBase-2.0/bin/apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
  • 解压
    tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
  • 重命名
    mv apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz  phoenix-5.0.0-HBase-2.0
  • 拷贝hbase和hadoop配置文件到phoenix
    cp /home/hadoop/apps/hbase/hbase-2.0.4/conf/hbase-site.xml   /home/hadoop/apps/hadoop/hadoop-2.7.7/etc/hadoop/{core-site.xml,hdfs-site.xml}  /home/hadoop/apps/phoenix-5.0.0-HBase-2.0/bin/
  • 拷贝phoenix到其他节点
    cd /home/hadoop/apps/phoenix-5.0.0-HBase-2.0
    scp -r phoenix-5.0.0-HBase-2.0/ hd2:$PWD
    scp -r phoenix-5.0.0-HBase-2.0/ hd3:$PWD
  • 拷贝phoenix的jar包到hbase中
    scp phoenix-5.0.0-HBase-2.0-server.jar phoenix-core-5.0.0-HBase-2.0.jar hd1:/home/hadoop/apps/hbase/hbase-2.0.4/lib/
    scp phoenix-5.0.0-HBase-2.0-server.jar phoenix-core-5.0.0-HBase-2.0.jar hd2:/home/hadoop/apps/hbase/hbase-2.0.4/lib/
    scp phoenix-5.0.0-HBase-2.0-server.jar phoenix-core-5.0.0-HBase-2.0.jar hd3:/home/hadoop/apps/hbase/hbase-2.0.4/lib/
  • 先重启hbase
    stop-hbase.sh
    start-hbase.sh
  • 再启动phoenix
bin/sqlline.py hd1:2181

Phoenix的安装与使用

  • 首次启动会在hbase中自动生成6张表,在phoenix中也可以看到
    SYSTEM.CATALOG
    SYSTEM.FUNCTION
    SYSTEM.LOG
    SYSTEM.MUTEX
    SYSTEM.SEQUENCE
    SYSTEM.STATS

Phoenix的安装与使用

  • phoenix常用命令
  • 查看所有表

    !tables      

    Phoenix的安装与使用

  • 创建schema

    create schema test;
  • 创建表(建完表后hbase中也会自动创建对应的表)
    #创建完的表名和字段名都会自动转成大写,如需小写,需在建表时给表名和字段名前后加双引号。如下:
     create table test.t_test(
       id INTEGER NOT NULL PRIMARY KEY,
       name VARCHAR,
       age INTEGER
);
  • 插入/更新数据

            upsert into test.t_test (id,name,age) values(1,'zhangsan',23);
            upsert into test.t_test (id,name,age) values(2,'lisi',35);
            upsert into test.t_test (id,name,age) values(3,'tianqi',66);
  • 查询插入的数据
     select * from test.t_test;

Phoenix的安装与使用

  • 添加索引字段
    create index idx_name on test.t_test(name);

    如果添加索引报错:

    Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every region server. tableName=T_TEST (state=42Y88,code=1029)
    java.sql.SQLException: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every region server. tableName=T_TEST
    at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:494)
    at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:150)
    at org.apache.phoenix.schema.MetaDataClient.createIndex(MetaDataClient.java:1524)
    at org.apache.phoenix.compile.CreateIndexCompiler$1.execute(CreateIndexCompiler.java:85)
    at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:408)
    at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
    at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
    at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:389)
    at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
    at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
    at sqlline.Commands.execute(Commands.java:822)
    at sqlline.Commands.sql(Commands.java:732)
    at sqlline.SqlLine.dispatch(SqlLine.java:813)
    at sqlline.SqlLine.begin(SqlLine.java:686)
    at sqlline.SqlLine.start(SqlLine.java:398)
    at sqlline.SqlLine.main(SqlLine.java:291)

解决方法: 在hbase-site.xml 中配置中加入,重启服务

<property> 
  <name>hbase.regionserver.wal.codec</name> 
  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value> 
</property>

再次创建索引即可。

  • 查看索引 : !indexes test.t_test;
    Phoenix的安装与使用

  • 删除数据
  delete from test.t_test where id =1;
  • 删除表

    drop table test.t_test;
  • 删除schema
    drop schema test;

以上在phoenix中的DDL和DML操作在hbase对应的表中也会同时触发,即操作通过phoenix来操作hbase。

  • 退出

    !quit
  • 更多操作
http://phoenix.apache.org/language/index.html