Hbase入门以及Phoenix生产实战

Hbase官网http://hbase.apache.org/ Phoenix官网http://phoenix.apache.org/

前言

HBase与Phoenix简介

  • 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功能在生产上不用,大数据分析事务功能是个鸡肋也必然是个坑,任务失败,需解决问题并重跑。

1.Hbase入门

1.1定位

  • Hadoop database, a distributed, scalable, big data store
    分布式的,可扩展的数据库存储
  • random realtime read/write very large tables billions of rows X millions of columns
    实时数据,存大的宽表(当然生产中就用到几百个列)

一定要架在zookeeper上,我们这里学习可以用CDH-5.12 HBase1.2.0
在这里插入图片描述

1.2特性

  • Linear and modular scalability.
  • Strictly consistent reads and writes.
  • Automatic and configurable sharding of tables
  • Automatic failover support between RegionServers.
  • Convenient base classes for backing Hadoop MapReduce jobs with Apache HBase tables.
  • Easy to use Java API for client access.
  • Block cache and Bloom Filters for real-time queries.
  • Query predicate push down via server side Filters
  • Thrift gateway and a REST-ful Web service that supports XML, Protobuf, and binary data encoding options
  • Extensible jruby-based (JIRB) shell
  • Support for exporting metrics via the Hadoop metrics subsystem to files or Ganglia; or via JMX

1.3对比关系型数据库(Hbase是非关系型数据库,底层存储是落在HDFS)

1.动态列
2.存储数据形式(非结构化的)
3.事务(大数据并不过多考虑)
4.分布式:可扩展的
5.支持的列多
6.kv存储
7.表之间的耦合性低
8.存在数据冗余(HBase存在多个版本)
9.大数据量查询性能比较高(需要什么列就会加载什么列)
10.null不存的,HBase动态列
11.本身二级索引不支持(rowkey scan: 全表 、范围),后续可以自己去做 这个用phoenix
12.trigger不支持
13.字段的支持格式单一(bytes)

1.4HBase单点部署

部署详细过程可参考官网

1.4.1解压

[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/

1.4.2 修改hbase-env.sh 配置

#添加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

1.4.3 修改hbase-site.sh 配置

[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 

<configuration>
  <!--我这里数据存储在本地,生产上实际配置为hdfs的目录 -->
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/hadoop/app/hbase-1.2.0-cdh5.12.0/hbasedata</value>
  </property>
  <!--默认使用的是HBase自带的zk,这里设置zk数据存储位置,生产上使用Zookeeper的zoo.cfg中配置的数据路径-->
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/hadoop/app/hbase-1.2.0-cdh5.12.0/zkdata</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
  </property>
</configuration>

1.4.4 添加环境变量

[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

1.4.5 启动以及命令行使用

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运行。

1.5HBase Shell

help可以查看命令帮助

#进入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(main):001:0> create 'test', 'cf'   #创建一张test表,然后把相同类别的字段全部加到cf的组别里,这个组别在HBase里叫列簇
0 row(s) in 1.7910 seconds        

查询表

hbase(main):002:0> list 'test'
TABLE                                                                                                
test   

描述表

hbase(main):003:0> describe 'test'
Table test is ENABLED                                                                                
test                                                                                                 
COLUMN FAMILIES DESCRIPTION                                                                          
{NAME => 'cf', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FA
LSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BL
OCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                  
1 row(s) in 0.1390 seconds


describe  'ns1:t123123'
 #有enabled  也有enabled
enabledde 的话就不能进行drop操作
需要先disabled  'ns1:t123123'

插入

hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.1080 seconds
 #   rk     字段a    列值

put 'test','123','cf:a','www.ruozedata.com'
#put就相当于SQL里的insert/update
put 'test','123','cf:a','www.ruozedata.com+jepson+ruoze'

put 'ns1:t123123'  'r1','f1:c1','123'
表名  行名  列名(列簇:列名)  value

全表查询

scan   'test'    #相当于select

注意:HBase里是区分大小写的

指定RowKey查询数据

hbase(main):005:0> get 'test', 'row1'
COLUMN                     CELL                                                                      
 cf:a                      timestamp=1568960802024, value=value1                                     
1 row(s) in 0.0260 seconds

get  'test' ,'123'   #就相当于关系型数据库里的主键

删除

delete 'ns1:t1','r1','c1',ts1

delete 'test','123','cf:a'

HBase不支持创建索引

1.6HBase的读写流程

HBase读写是直接请求region server节点,而HMaster主要有表的DDL操作、以及region的分割和合并。

2.Phoenix入门

Apache Phoenix :4.14.0-HBase-1.2(Apache HBase)

Apache:Hadoop HBase Phoenix
CDH: Hadoop HBase 4.14.0-cdh5.11.2(<=cdh的版本)

由于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

在这里插入图片描述

事务要使用的话把phoenix.transactions.enabled这个参数改成true ,当然会有坑,大数据平台正常情况下是不考虑事务

2.1Installation

To install a pre-built phoenix, use these directions:
1)Download and expand the latest phoenix-[version]-bin.tar.
下载当前版本所依赖的版本
2)Add the phoenix-[version]-server.jar to the classpath of all HBase region server and master and remove any previous version. An easy way to do this is to copy it into the HBase lib directory (use phoenix-core-[version].jar for Phoenix 3.x)

phoenix–[v]-server.jar

cp phoenix–[v]-server.jar to region server hbase lib 读和写都是经过region server

CDH安装的如何查找lib目录?

cd /opt/cloudera/parcels/CDH/lib/hbase/lib/

ll  phoenix*

cd /opt/cloudera/parcels/CDH/lib/hadoop
类似的查找hadoop的

3)Restart HBase.

4)Add the phoenix-[version]-client.jar to the classpath of any Phoenix client.

client -->server–>hbase

使用DBerver连接时候里面默认会有一个jar包删除,传进我们下载下来的jar包

CREATE TABLE ruozedata(
id integer PRIMARY KEY,
name varchar(20)
);

SELECT * FROM ruozedata;

UPSERT INTO ruzoedata(id,seller_id)
values (1,'100');

思考:HBase+Phoenix结合起来可否当mysql使用?

解压

[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/

拷贝server的jar包并重启HBase

将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 

使用DBeaver连接Phoenix

连接的过程: 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进行协调的。

  • 若我么们代码开发中涉及phoenix,则也需要拷贝此jar包到工程中

使用DBeaver进行增删改查

#创建表
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         

  • 采坑,HBase的表是区分大小写,但是DBeaver是不区分的。
  • 采坑,Phoenix 的timezone(时区)默认是国外了,而国内的是上海时区,这样导致时间类型数据入Phoenix后时间戳对不上。
  • 采坑,使用Phoenix 进行select时及其小概率会出现两行一模一样的数据,重复数据,过会儿查就没了
  • 采坑,
  • Phoenix 结合HBase 使用起来像是操作mysql,但是HBase强大的动态列功能Phoenix貌似不行,个人觉得它有点儿阉割了- - HBase,故并不是任何场景都适合使用HBase整合Phoenix,对关系型数据入Hive倒是挺好用的。

2.2Mysql到Phoenix的数据类型转换

mysql  -->     phoenix
char/varchar -->varchar
10               20 
int -->integer
datetime/timestamp --> timestamp

注意:1、采坑,db中的char/varchar转到Phoenix时长度要放长两倍,不然可能放不进去。

2.3phoenix坑

a.timezone 时区
读 和 写   (有可能读的时区改了,而写的时区还没改)
b.出现重复数据

Phoenix 结合 Hadoop Prouducts开发

由于Phoenix的底层时HBase,故并不适合使用Phoenix进行数据,但是我们可以使用Spark SQL、Hive等进行数据分析(注意,该分析方式速度并没有数据直接列式存储hdfs并使用那些分析引擎快,大批量数据还是老老实实直接怼数据,不要绕一圈那么麻烦)
Phoenix的github上提供了很多结合这个组件的的开发代码案列,如结合Spark开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值