前言
我们通过业务系统将爬虫的数据写入了HBase,这篇文章说说HBase的表结构,及在HBase上利用Phoenix进行SQL操作。
HBase表结构
先看看官网对于HBase的数据模型说明:
In HBase, data is stored in tables, which have rows and columns. This is a terminology overlap with relational databases (RDBMSs), but this is not a helpful analogy. Instead, it can be helpful to think of an HBase table as a multi-dimensional map.
上面这段话的大概意思是:和传统关系型数据库的数据模型(由 Row 和 Column 产生的二维储存空间)相比,HBase 是一个多维度的数据储存架构。详细的说就是,HBase中的表是通过 行键(Rowkey)、列簇(Column Family)、列限定符(Column Qualifier)、时间版本(Version)四个维度组织数据。
我们设计一个webtable表:
两个行键(baidu和google),有两个个列簇(基本信息和详细信息),第一个列簇(基本信息)包括两个列限定符(域名),第二个列簇(详细信息)包括一个限定符(内容和作者)。概念视图如下:
概念视图
Rowkey | Time Stamp | ColumnFamily——基本信息 | ColumnFamily——详细信息 |
---|---|---|---|
baidu | t1 | 基本信息:域名=“baidu.com” | |
baidu | t2 | 详细信息:内容=“www.sss.....” | |
baidu | t3 | 详细信息:作者=“老刘” | |
t4 | 基本信息:域名=“google.com” | ||
t5 | 详细信息:内容=“www.baggg.....” | ||
t6 | 详细信息:作者=“bush” |
物理视图
- 列簇——基本信息
|Rowkey|Time Stamp|ColumnFamily 基本信息|
|:--------:|:--------------:|:-------:|:-----------:|
| baidu | t1| 基本信息:域名=“baidu.com”|
| google| t4| 基本信息:域名=“google.com”|
- 列簇——详细信息
Rowkey | Time Stamp | ColumnFamily——详细信息 |
---|---|---|
baidu | t2 | 详细信息:内容=“www.sss.....” |
baidu | t3 | 详细信息:作者=“老刘” |
t5 | 详细信息:内容=“www.baggg.....” | |
t6 | 详细信息:作者=“bush” |
Phoenix安装与使用
由于HBase数据库只提供了Java和shell两种接口,并不支持SQL,所以诞生了Phoenix 工具。
Phoenix安装
我们的HBase版本是1.2.5,下载对应版本是apache-phoenix-4.10.0-HBase-1.2
Phoenix下载地址.png
下载后如何与HBase集群集成,看看官网的说明:
- Download and expand the latest phoenix-[version]-bin.tar.
- 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)
- Restart HBase.
*Add the phoenix-[version]-client.jar to the classpath of any Phoenix client.
这里我们重新创建一个Phoenix容器,将apache-phoenix-4.10.0-HBase-1.2 bin拷贝到该容器,这里配置Phoenix容器的hots文件,使该容器可以用zookeeper的主机名连接HBase集群。
172.17.0.5 master
172.17.0.6 slave01
172.17.0.10 slave02
然后将phoenix-[version]-server.jar拷贝到Hbase集群的三个容器的HBase lib目录下,重启HBase集群。
Phoenix 使用
# Sqlline.py 最简单的使用方法,就是直接以 Zookeeper 机器名(一个就可以)为参数即可,我们的zookeeper集群和hbase集群名称相同,
./sqlline.py master
Sqlline.py使用示意图.png
上图中,我们还使用了 sqlline.py 支持的 table 命令,该命令可以列出 HBase 中所有的表。这里需要注意 Phoenix 不支持直接显示 HBase Shell 中创建的表格。原因很简单,当在 Phoenix 创建一张表时,Phoenix 是将表进行了重组装。而对 HBase Shell 创建的表 Phoenix 并未进行加工,所以无法直接显示。如果需要将 HBase Shell 中创建的表格关联到 Phoenix 中查看,就需要在 Phoenix 中创建一个视图(View)做关联。
我们先在HBase中查看已经创建的webpage表结构
上图中webpage是我们用HBase Java API在业务系统创建的表(其中spiderBase和spiderInfo是表webpage的列族,然后我们需要在Phoenix创建一个名称相同的视图
# 注意视图名称和列名如果不带引号,创建后的视图名称是大写
CREATE VIEW "webpage" (
pk VARCHAR PRIMARY KEY,
"spiderBase"."siteTitle" VARCHAR ,
"spiderBase"."url" VARCHAR ,
"spiderBase"."domain" VARCHAR ,
"spiderBase"."spiderInfoId" VARCHAR ,
"spiderBase"."spiderUUID" VARCHAR ,
"spiderInfo"."title" VARCHAR ,
"spiderInfo"."content" VARCHAR ,
"spiderInfo"."category" VARCHAR ,
"spiderInfo"."rawHTML" VARCHAR ,
"spiderInfo"."gatherTime" VARCHAR ,
"spiderInfo"."keywords" VARCHAR ,
"spiderInfo"."publishTime" VARCHAR ,
"spiderInfo"."summary" VARCHAR
);
在Phoenix用sql操作webpage视图
利用sq操作HBase.png报错问题
HBase 和Phoenix Shell 终端中文乱码,java api操作无问题,暂时没有找到解决办法。
总结
参考文献
[1] Apache Phoenix介绍(SQL on HBase)
[2] HBase Shell 常用操作
[3] HBase 深入浅出
[4] HBase 官网
网友评论