HBase Phoenix助力海量数据实时分析

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介:

前言

phoenix这个项目我一直接触不多,在去年接触的一家公司使用phoenix分析数百亿的记录并且在秒级别返回的延迟时,笔者才慢慢探究一些phoenix的内幕。上个星期跟一位phoenix的PMC&Committer聊了聊phoenix的定位及未来的发展,发现phoenix还是比较竞争力的,从最近phoenix不断的发布版本来看,phoenix也在迅速的发展。在phoenix社区也组织了phoenixCon来宣传phoenix:PhoenixCon 2017。本文的目的是想梳理下phoenix的,phoenix怎么支持海量数据的实时分析,一些细节点不多。

架构

phoenix是专门为HBase增强的,具体说就是HBase有几个方面的问题:

  • HBase比较底层,没有SQL接口,对于希望使用SQL的同学转换成本高
  • HBase不支持二级索引(HBase自身也有一些方案,不过还是以phoenix支持最佳)
  • HBase不支持事务

最近几年,从SQL到NO-SQL,再到NewSQL的兴起。其实NewSQL本身并没有什么大技术的创新点(持久内存等硬件本身除外),只是架构的创新或者说是一种混合架构。Phoenix是不是NewSQL,其实并不重要,重要的是他解决了什么问题。
大致的phoenix嵌入进HBase的图如下所示:

image

phoenix最主要给HBase添加了二级索引、SQL的支持。至于事物及一些其它的支持,算是锦上添花,让phoenix越看越是NewSQL。phoenix的官方文档比较全,笔者就不搬了。

特别地:

  • 支持join(hash joinSort-Merge Join)
  • 相关SQL的优化(现在正在对接Calcite:http://calcite.apache.org/ )
  • 支持jdbc直接访问

性能

phoenix适合海量数据的实时分析需求:

  • phoenix基本通过建立索引在海量数据上查询少量数据,并且基本实时返回。
  • phoenix也支持做一些复杂SQL操作,包括join,sub-query等。
  • phoenix不适合于ETL,比如10T数据变为10T数据。

如下有一张跟Hadoop体系hive的对比:

image
出自: https://phoenix.apache.org/performance.html

在四个场景中,Hive On HBase最差,phoenix(key filter)最快,究其原因就是phoenix(key filter)走了index,查询时间基本在1s以内。另外,Hive on HDFS跟phoenix on HDFS对比,在5000w条数据量左右是分界线,时间在20s左右,其实hive启动时间都在5s左右,再跑一个MR/TEZ作业都在10s左右(后续有一定的优化)。

测试数据:http://phoenix-bin.github.io/client/performance/phoenix-20160718043634.htm 
其中包括了主要的一些场景,比如:Aggregation、 Count Distinct、 IN/LIKE Clause、LIMIT,测试数据集合基本是百万级别,时间在数秒左右。
其实,分析的性能就在于index是否命中,另外,index也会消耗更多的空间,较多的index也会降低写的QPS

演示

目前云HBase也已经支持phoenix4.6版本,用户可以直接下载 http://hbase-cloud2.oss-cn-hangzhou.aliyuncs.com/phoenix-4.6.0-HBase-1.1.tar.gz 
我们简单演示下join的功能,参考:https://phoenix.apache.org/joins.html#joining-tables-with-indices-eg1

CREATE TABLE IF NOT EXISTS Customers(
CustomerID  VARCHAR NOT NULL,
CustomerName  VARCHAR,
Country VARCHAR
CONSTRAINT pk PRIMARY KEY(CustomerID)
);


CREATE TABLE IF NOT EXISTS Items(
ItemID  VARCHAR NOT NULL,
ItemName  VARCHAR,
Price Decimal
CONSTRAINT pk PRIMARY KEY(ItemID)
);

SELECT O.OrderID, C.CustomerName
FROM ORDERS AS O
INNER JOIN CUSTOMERS AS C
ON O.CustomerID = C.CustomerID;

0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> CREATE INDEX iOrders ON Orders (ItemID) INCLUDE (CustomerID, Quantity);
5 rows affected (1.519 seconds)
0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> CREATE INDEX i2Orders ON Orders (CustomerID) INCLUDE (ItemID, Quantity);
5 rows affected (1.502 seconds)
0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> CREATE INDEX iItems ON Items (ItemName) INCLUDE (Price);
6 rows affected (1.427 seconds)


0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> SELECT O.OrderID, C.CustomerName, C.Country, O.Date
. . . . . . . . . . . . . . . . . . . . . . .> FROM Orders AS O
. . . . . . . . . . . . . . . . . . . . . . .> INNER JOIN Customers AS C
. . . . . . . . . . . . . . . . . . . . . . .> ON O.CustomerID = C.CustomerID;
+------------------------------------------+------------------------------------------+------------------------------------------+-------------------------+
|                O.ORDERID                 |              C.CUSTOMERNAME              |                C.COUNTRY                 |         O.DATE          |
+------------------------------------------+------------------------------------------+------------------------------------------+-------------------------+
| 1630781                                  | Alps Nordic AB                           | Sweden                                   | 0009-01-22 13:00:00.000 |
| 1630782                                  | Salora Oy                                | Finland                                  | 0009-02-22 13:00:00.000 |
| 1630783                                  | Logica                                   | Belgium                                  | 0009-03-22 13:00:00.000 |
| 1630784                                  | Alps Nordic AB                           | Sweden                                   | 0009-04-22 13:00:00.000 |
| 1630785                                  | Deister Electronics                      | Germany                                  | 0009-05-22 13:00:00.000 |
+------------------------------------------+------------------------------------------+------------------------------------------+-------------------------+
5 rows selected (0.136 seconds)


0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> SELECT ItemName, sum(Price * Quantity) AS OrderValue
. . . . . . . . . . . . . . . . . . . . . . .> FROM Items
. . . . . . . . . . . . . . . . . . . . . . .> JOIN Orders
. . . . . . . . . . . . . . . . . . . . . . .> ON Items.ItemID = Orders.ItemID
. . . . . . . . . . . . . . . . . . . . . . .> WHERE Orders.CustomerID > 'C002'
. . . . . . . . . . . . . . . . . . . . . . .> GROUP BY ItemName;
+------------------------------------------+------------------------------------------+
|                 ITEMNAME                 |                ORDERVALUE                |
+------------------------------------------+------------------------------------------+
| BX016                                    | 10374                                    |
| MU3508                                   | 1.44E+4                                  |
| XT2217                                   | 46436                                    |
+------------------------------------------+------------------------------------------+
3 rows selected (0.184 seconds)

较大的数据量:

0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> select count(*) from "usertable";
+------------------------------------------+
|                 COUNT(1)                 |
+------------------------------------------+
| 29643363                                 |
+------------------------------------------+
1 row selected (38.704 seconds)
0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> select count(*) from "usertable" where "cf"."field0" like  '9%';
+------------------------------------------+
|                 COUNT(1)                 |
+------------------------------------------+
| 925932                                   |
+------------------------------------------+
1 row selected (1.071 seconds)
0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> select count(*) from "usertable" where "cf"."field0" like  '9C%';
+------------------------------------------+
|                 COUNT(1)                 |
+------------------------------------------+
| 14248                                    |
+------------------------------------------+
1 row selected (0.043 seconds)
0: jdbc:phoenix:hb-bp18zlo0b209p7g23-001.hbas> select "cf"."field0","field1" from "usertable" where "field0" like  '9Cy/9>%';
+------------------------------------------+------------------------------------------+
|                  field0                  |                  field1                  |
+------------------------------------------+------------------------------------------+
| 9Cy/9>2Go.]a'Iy;>.44&09~<Z/=Ye2L3(Cg.Ni&Gc1Ue&@1).n"+8%'f+,.+".%Kc!-.4%b)249(z/3z;6~0N5,( 70h?<t6X}+ | &5j;O!.,& Uw3Qy":"/<*-No>M51Y}<]-18<5 $(Gw5Ig.8p.R7-$<0[5$?&<-f;Yg6$89_c+Ha'9`6Mc2'8 |
+------------------------------------------+------------------------------------------+
1 row selected (0.046 seconds)

HBase技术交流社区 - 阿里官方“HBase生态+Spark社区大群”点击加入:https://dwz.cn/Fvqv066s

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
SQL 存储 分布式数据库
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
|
存储 SQL 自然语言处理
基于 HBase 的海量数据查询与检索解析|学习笔记
快速学习基于 HBase 的海量数据查询与检索解析
833 0
基于 HBase 的海量数据查询与检索解析|学习笔记
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0
|
4月前
|
SQL 消息中间件 分布式数据库
基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(三)离线分析
基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(三)离线分析
60 0
|
4月前
|
SQL 分布式数据库 HIVE
Hbase二级索引_Hive on Hbase 及phoenix详解
Hbase二级索引_Hive on Hbase 及phoenix详解
43 0
|
6月前
|
存储 SQL 分布式数据库
记录一次 Hbase 线上问题的分析和解决,并分析总结下背后的知识点 - KeyValue size too large
记录一次 Hbase 线上问题的分析和解决,并分析总结下背后的知识点 - KeyValue size too large
|
8月前
|
存储 分布式计算 关系型数据库
|
分布式数据库 Hbase
|
SQL 物联网 关系型数据库
实时即未来,车联网项目之phoenix on hbase 即席查询【四】
实时即未来,车联网项目之phoenix on hbase 即席查询【四】
156 0
|
分布式数据库 Hbase