Phoenix和HBase都是Apache的顶级项目。
HBase用于数据存储以及快速查询,不适合数据分析
HBase是列式存储数据库,它的列是动态的列,号称一张表能存储百亿行,百万列
HBase数据存储格式都是字符串
HBase是通过rowkey、column(特定cf)、timestamp 来确定一个列的值
HBase的put操作相当于upsert操作
Phoenxi是具有OLTP和OLAP的功能的SQL框架组件
Phoenxi数据存储是HBase,通过它可以解决HBase客户端难操作、HBase无法创建二级索引的问题
Phoenix可以对接Spark、Hive、Pig, Flume, and Map Reduce,生产上主要是对接Spark
Phoenix的OLTP功能在生产上不用,大数据分析事务功能是个鸡肋也必然是个坑,任务失败,需解决问题并重跑。
为了契合生产上的CDH-5.12.0,故选择Hbase-1.2.0-CDH5.12.0,注意CDH的1.2.0是Cloudera上的,它在开源基础上做了一些BUG修复以及功能添加,可能兼容了更高的一些版本的新功能。
部署详细过程可参考官网
[hadoop@hadoop001 ~]$ cd ~/soft/
[hadoop@hadoop001 soft]$ tar -zxvf hbase-1.2.0-cdh5.12.0.tar.gz -C ~/app/
[hadoop@hadoop001 soft]$ cd ~/app/hbase-1.2.0-cdh5.12.0/
#添加JAVA_HOME
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ vim conf/hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_45
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ mkdir -p /home/hadoop/app/hbase-1.2.0-cdh5.12.0/hbasedata
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ mkdir -p /home/hadoop/app/hbase-1.2.0-cdh5.12.0/zkdata
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ vim conf/hbase-site.xml
hbase.rootdir
file:///home/hadoop/app/hbase-1.2.0-cdh5.12.0/hbasedata
hbase.zookeeper.property.dataDir
/home/hadoop/app/hbase-1.2.0-cdh5.12.0/zkdata
hbase.unsafe.stream.capability.enforce
false
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ vim ~/.bash_profile
export HBASE_HOME=/home/hadoop/app/hbase-1.2.0-cdh5.12.0
export PATH=$HBASE_HOME/bin:$PATH
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ source ~/.bash_profile
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ which start-hbase.sh
~/app/hbase-1.2.0-cdh5.12.0/bin/start-hbase.sh
HMaster访问页面:http://192.168.175.135:60010
#启动,启动成功JPS会出现一额HMaster的进程
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ bin/start-hbase.sh
#关闭HBase服务
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ bin/stop-hbase.sh
若是CDH环境,先找到HMaster的机器,然后找到切换大hbase用户,若无法切换用户,则在passwd文件修改用户目录以及执行脚本。切换hbase用户后,which hbase可查看hbase命令的软连接指向,通过alternatives --config xxx查询该命令的真正指向,若没问题,则可直接hbase shell。当然若该节点有gateway权限则可直接hbase shell运行。
命令+回车键,就去显示命令帮助以及案列
#进入HBase shell命令行窗口
[hadoop@hadoop001 hbase-1.2.0-cdh5.12.0]$ bin/hbase shell
#HTable的增删该查
hbase(main):001:0> create 'test', 'cf'
hbase(main):002:0> list 'test'
hbase(main):003:0> describe 'test'
hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
hbase(main):005:0> put 'test', 'row1', 'cf:a', 'value1'
hbase(main):006:0> put 'test', 'row1', 'cf:a', 'value1'
hbase(main):006:0> get 'test', 'row1'
hbase(main):008:0> disable 'test'
hbase(main):011:0> drop 'test'
#退出HBase shell命令行窗口
hbase(main):016:0> quit
HBase读写是直接请求region server节点,而HMaster主要有表的DDL操作、以及region的分割和合并。
由于Cloudear没有Phoenix组件,过我们选择Apache的Phoenix,为了契合HBase1.2.0,我只能从Apache中选择了,但是上面选择的HBase1.2.0和Apache是有差别的,这就比较头疼了,肯定会在部分功能上需要改代码进行整合的。 幸好,apache推出了CDH版本的Phoenix,根据向下相对兼容以及取相近版本规则(CDH Vsersion >=phoenix cdh version),选择了phoenix-4.14.0-cdh5.11.2。
[hadoop@hadoop001 ~]$ cd ~/soft/
[hadoop@hadoop001 soft]$ tar -zxvf apache-phoenix-4.14.0-cdh5.11.2-bin.tar.gz -C ~/app/
[hadoop@hadoop001 soft]$ cd ~/app/apache-phoenix-4.14.0-cdh5.11.2-bin/
将phoenix-[version]-server.jar考到所有的Region server节点的hbase lib目录下。若是Cloudera安装的HBase,则lib默认在:/opt/cloudera/parcels/CDHlib/hbase/lib
[hadoop@hadoop001 apache-phoenix-4.14.0-cdh5.11.2-bin]$ cp phoenix-4.14.0-cdh5.11.2-server.jar ~/app/hbase-1.2.0-cdh5.12.0/lib/
重启HBase
[hadoop@hadoop001 apache-phoenix-4.14.0-cdh5.11.2-bin]$ ~/app/hbase-1.2.0-cdh5.12.0/bin/stop-hbase.sh
[hadoop@hadoop001 apache-phoenix-4.14.0-cdh5.11.2-bin]$ ~/app/hbase-1.2.0-cdh5.12.0/bin/start-hbase.sh
连接的过程: phoenix client–>phoenix server–>HBase Region Server
这里我先将phoenix-[version]-client.jar sz下载到windos,然后使用DBeaver进行Phoenix链接。
第一步:打开DBeaver的Phoenix的链接配置
第二步:将驱动设置为phoenix-[version]-client.jar
第三步:连接测试,注意一定是要写zk的地址,Phoenix以及HBase的通信都是通过ZK进行协调的。
#创建表
CREATE TABLE wsktest(
id integer PRIMARY KEY,
name varchar(20)
)
#插入或更新数据,注意若PRIMARY KEY 的id记录存在即更新,否则是插入
UPSERT INTO WSKTEST VALUES(1,'大王');
UPSERT INTO WSKTEST VALUES(2,'二王');
UPSERT INTO WSKTEST VALUES(3,'三弟');
UPSERT INTO WSKTEST VALUES(1,'二傻');
#查询
SELECT * FROM WSKTEST;
SELECT * FROM WSKTEST WHERE ID=2
#删除数据
DELETE FROM WSKTEST WHERE id = 2;
#删除表
DROP TABLE WSKTEST;
观察HBase中的对应的表数据,rowkey就是PRIMARY KEY,且多了一个列,值为x
\x80\x00\x00\x01 column=0:\x00\x00\x00\x00, timestamp=1559261964835, value=x
\x80\x00\x00\x01 column=0:\x80\x0B, timestamp=1559261964835, value=\xE4\xBA\x8C\xE5\x82\xBB
char/varchar --> varchar
int --> integer
datatime/timestamp --> timestamp
注意:1、采坑,db中的char/varchar转到Phoenix时长度要放长两倍,不然可能放不进去。
由于Phoenix的底层时HBase,故并不适合使用Phoenix进行数据,但是我们可以使用Spark SQL、Hive等进行数据分析(注意,该分析方式速度并没有数据直接列式存储hdfs并使用那些分析引擎快,大批量数据还是老老实实直接怼数据,不要绕一圈那么麻烦)
Phoenix的github上提供了很多结合这个组件的的开发代码案列,如结合Spark开发