在传统银行 IT 架构中,联机交易与统计分析系统往往采用不同的技术与物理设备,通过定期执行的 ETL 将联机交易数据向分析系统中迁移。而作为数据服务资源池,同一份数据可能被不同类型的微服务共享访问。当一些联机交易与审计类业务针对同一份数据同时运行时,必须保证请求在完全隔离的物理环境中执行,做到交易分析业务无干扰。
HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,善于处理大数据场景,具备以下特点:
表规模大,亿级别行,上百万列
面向列存储,列独立检索
但是 HBase 在使用中也存在下面的一些问题:
HBase 只能做简单的 key-value 查询,无法实现复杂的统计 SQL
HBase 不支持多索引
运维复杂。Hadoop 作为一套完整大数据分析体系框架,操作比较复杂,出现问题难以定位
标准SQL支持
支持高并发
多索引中支持
易维护等需求
1 导出HBase数据
先用 Hive 把 HBase 数据导出为 csv 文件。Hbase 数据结构如下:
图1 Hbase数据结构 整合HBase和hive, 创建hive外部表进行关联
hive 创建外部表关联 Hbase 参考语句
CREATE EXTERNAL TABLE hbase_user( id string, name string, phone string, birthday string, id_number string, gender string, email string, address string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:phone,info:birthday,info:id_number,info:gender,info:email,i nfo:address") # 指定映射关系,:key为rowkey TBLPROPERTIES ("hbase.table.name" = "user"); # 指定要映射的hbase表名
整合效果如下图所示
hive (default)> select * from hbase_user limit 1;OKhbase_user.id hbase_user.name hbase_user.phone hbase_user.birthday hbase_user.id_number hbase_user.gender hbase_user.email hbase_user.address0004928c7287408085403c6ec4cd3c12 刘英 15073203583 2013-07-15 211324199408301340 M maojuan@yahoo.com 黑龍江省晶市徐汇六盘水街J座 222331
导出 hive 表中的数据到 csv
导出的数据如下图所示,为 csv 格式
[hadoop@node hbase_hive_export_user.csv]$ tail -2f 000000_0
ffdca61d22b74462aefdcb948d819542,边志强,18598897076,1958-08-25,52062819960928857X,M,ming52@gmail.com,内蒙古自治区太原县浔阳史街P座 547199
ffdf82a4e2f84c3a9c99e726153d9496,傅玉华,14509458979,1977-08-13,451022198005119836,M,yanhe@hotmail.com,辽宁省兵县山亭深圳路h座 706208
2 通过CSV文件导入到SequoiaDB中
sdbimprt 是 SequoiaDB 的数据导入工具,它可以将 JSON 格式或 csv 格式的数据导入到 SequoiaDB 数据库中。
将 HBase 导出的 csv 文件导入到 SequoiaDB 中,导入的命令如下:
sdbimprt --hosts=localhost:11810 --type=csv --file=user.csv -c users -l employee --fields='id string,name string,phone string,birthday string,id_number string,gender string,email string,address string'
其中集合空间名称为users,集合名称为 employee,执行结果如下:
$ sdbimprt --hosts=localhost:11810 --type=csv --file=user.csv -c users -l employee --fields='id string,name string, phone string,birthday string,id_number string,gender string,email string,address string' parsed records: 24282 parse failure: 0 sharding records: 0 sharding failure: 0 imported records: 24282 import failure: 0
3 在SequoiaDB 的MySQL层创建HBase对应映射表
CREATE TABLE `employee` ( `id` int(11) DEFAULT NULL, `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL, `phone` int(20) DEFAULT NULL, `birthday` datetime DEFAULT NULL, `id_number` int(20) DEFAULT NULL, `gender` varchar(11) COLLATE utf8mb4_bin DEFAULT NULL, `email` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL, `address` int(50) DEFAULT NULL) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
4 在SequoiaDB 的SAC图形化界面查看数据导入情况
登录到 SequoiaDB 存储引擎层,查看数据量为24282,数据导入成功完毕。
#sdb > db = new Sdb("localhost", 11810) > db.users.employee.count() 24282 Takes 0.002236s.
在 SequoiaDB 的图形化界面上,可以查看到导入到 SequoiaDB 中的数据条数为24282
图3 SAC图形化界面SequoiaDB存储引擎层查看数据示意图
同时,在 SequoiaDB 对应的 MySQL 实例层,可以查看到对应数据是24282
$ /opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root ... mysql> use users; Database changed mysql> show tables; +-----------------+ | Tables_in_users | +-----------------+ | employee | +-----------------+ 1 row in set (0.00 sec) mysql> select count(*) from employee; +----------+ | count(*) | +----------+ | 24282 | +----------+ 1 row in set (0.00 sec)
在SequoiaDB 的 SAC 图形化界面中,查看 MySQL 实例层,得出数据条数为24282
图4 SAC界面MySQL实例层查询数据示意图
5 在SequoiaDB 中执行多索引查询验证
在 SequoiaDB 的 mysql 实例层创建多个索引
mysql> ALTER TABLE `employee` ADD INDEX index_id (`id`); mysql> ALTER TABLE `employee` ADD INDEX index_email (`name`);
在 SequoiaDB 的 mysql 实例层,执行多个索引查询
mysql> select count(*) from employee where name="xiuyingxia"; +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec)
从 HBase 迁移数据至 SequoiaDB,并且在 SequoiaDB 的 SAC 界面可以分别从底层存储引擎层和 MySQL 的实例层查看到对应导入的数据,并且支持多索引查询。
总结
SequoiaDB 支持复杂 SQL 查询、支持多索引、支持高并发,作为开源分布式数据库运维简单便捷。Hbase 迁移至 SequoiaDB,可以先通过 hive 导出数据文件 csv 格式,然后通过 SequoiaDB 的导入工具 sdbimprt 导入到 SequoiaDB 中。