使用Docker搭建HBase+Phoenix大数据平台


平时我们开发程序用的最多的是MySQL数据库,但是MysQL数据库有一个绕不过去的坎:单表数据量超过2000万,CRUD的性能会急速下降。所!以我们要安排DBA或者自动化脚本,定期把半年或者一年的数据,迁移到归档数据库中,这样就可以起到缩表的目的。如果你开发的是普通的MIS系统,业务数据没有那么多,一个MysQL不用做定期归档也能支撑下来。但是类似于电商平台的项目,每天都会产生大量业务数据,一两个月就能累积几千万条数据。这种情况下,要么频繁的做数据归档,要么选择可以容纳数百TB而不需要归档的大数据平台。这里我选择了后者,既可以降低开发难度,又能减少请DBA的运维成本,何乐而不为呢。

一、大数据平台的技术选择

1.HBase技术

HBase是一个分布式,版本化,面向列的开源数据库,构建在 Apache Hadoop 和 Apache Zookeeper之上。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系統,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,HBase基于列的而不是基于行的模式。 HBase

HBase的特点

1.海量数据存储,HBase中的表可以容纳上百亿行x上百万列的数据。 2.列式存储,HBase中的数据是基于列进行存储的,能够动态的增加和删除列。 3.准实时查询,HBase在海量的数据量下能够接近准实时的查询 (百毫秒以內) 4. 多版本,HBase中每一列的数据都有多个版本。 5. 高可靠性,HBase中的数据存储于HDFS中且依赖于Zookeeper进行Master和** **的协调含理。

HBase虽然支持表结构,但是操作起来并不方便。例如下面是个学生表,里面包含了若干的字段。

如果我们给学生表添加新的记录,就需要执行下面的命令。

put 'Student', '001', 'StuInfo:Name','Tom Green', 1

想要获取数据的时候,我们执行get命令就可以了。

get 'Student', '0001'

对于我们平时习惯SQL语句的人来说,上面的命令如果简单还行,要是叠加上复杂的条件和函数,那么阅读性就非常差,所以我们要引入Phoenix技术。

scan 'mytest:test01',FILTER=>"ROWFilter(=,'substring:202006')",LIMIT=>1
count 'mytest:test01”, FILTER=>“RowFilter(-l'substring :202094°) ",INTERVAL=>10080

2.Phoenix技术

Phoenix是给HBase添加了一个语法表示层,允许我们用SQL语句读写HBase中的数据,可以做联机事务处理,拥有低延迟的特性,这就让我方便多了。Phoenix会把SQL编泽成一系列的Hbase的scan操作,然后把scan结果生成标准的JDBC结果集,处理千万级行的数据也只用毫秒或秒级就搞定。而且Phoenix还支持MyBatis框架。

二、部署HBase与Phoenix技术

1.导入镜像文件

首先我们在共享的资源中找到phoenix.tar.gz镜像文件,然后把这个文件上传到Centos系統中,执行命令,把 镜像文件导入Docker之中。

docker  load <  phoenix.tar.gz

2.创建容器

因为镜像中已经包含和HBase和Phoenix,所以我们只需要创建出容器即可。由于HBase需要使用的内存较大,这里我没有规定具体的内存大小,容器会自动使用空闲的内存。容器中数据目录是 /tmp/hbase-root/hbase/dat a,我把这个目录映射到宿主机的 /root/hbase/data 目录。

docker run -it -d -p 2181:2181 -p 8765:8765 -p 15165:15165 \
-p 16000:16000 -p 16010:16010 -p 16020:16020 \
-v /root/hbase/data:/tmp/hbase-root/hbase/data \
--name phoenix \
boostport/hbase-phoenix-all-in-one:2.0-5.0
docker run -it -d -p 2181:2181 -p 8765:8765 -p 15165:15165 -p 16000:16000 -p 16010:16010 -p 16020:16020 -v /root/hbase/data:/tmp/hbase-root/hbase/data --name phoenix boostport/hbase-phoenix-all-in-one:2.0-5.0

3.开放端口

我们要把Linux宿主机的2181、8765、15165、16000、16010、16020,映射到电脑相对应的端口上面。

4.初始化Phoenix

运行命令,进入到Phoenix容器中,然后执行命令设置HBASE_CONF_DIR环境变量。

docker exec -it phoenix bash

export HBASE_CONF_DIR=/opt/hbase/conf/

接下来我们要连接Phoenix的命令行客户端。虽然IDEA也内置了Phoenix客户端,但是Bug挺多的,用着并不方便,所以我建议大家使用Phoenix白带的命令行客户端更好一些。而且我们要执行的SQL语句也并不多,命令行客户端已经足够用了。

/opt/phoenix-server/bin/sqlline.py localhost

三、创建逻辑数据库和数据表

1、创建逻辑库

为了存储数据,我们需要像操作MySQL一样,先创建逻辑库,然后定义数据表。在Phoenix的命令行客户端我们先 来执行创建逻辑库的命令。

CREATE SCHEMA hospital;

USE hospital;

2、创建数据表与导入数据

在本课程的git上面有 数据库脚本.SQL文件 ,你把这个SQL文件中的语句复制粘贴到Phoenix的命令行中执行即可。

-- 患者端用户表 -----------------------------------------------
DROP TABLE IF EXISTS hospital.patient_user;
CREATE TABLE hospital.patient_user
(
    "id"          INTEGER NOT NULL PRIMARY KEY,
    "open_id"     VARCHAR,
    "nickname"    VARCHAR(50),
    "photo"       VARCHAR,
    "sex"         VARCHAR(1),
--   状态:1代表正常,2代表禁用
    "status"      TINYINT,
    "create_time" DATE
);
DROP SEQUENCE IF EXISTS hospital.patient_user_sequence;
CREATE SEQUENCE hospital.patient_user_sequence START WITH 1 increment BY 1;
CREATE INDEX patient_user_idx_1 ON hospital.patient_user ("open_id");
CREATE INDEX patient_user_idx_2 ON hospital.patient_user ("status");

文章目录