在 HDInsight HBase 上使用 Apache Phoenix

已完成

HDInsight 上的 HBase 群集是与 Apache Phoenix 一起提供的。 Apache Phoenix 是构建在 Apache HBase 基础之上的开源大规模并行关系数据库层。 使用 Apache Phoenix,可以通过 HBase 使用类似于 SQL 的查询。 它使用下的 JDBC 驱动程序,让用户能创建、删除和更改 SQL 表。 还可以建立索引、创建视图和序列,以及单独或批量插入行。 Phoenix 使用 noSQL 本机编译而不是 MapReduce 来编译查询,可让用户在 HBase 的顶层创建低延迟的应用程序。 Phoenix 添加了协处理器,支持在服务器的地址空间中运行客户端提供的代码,执行与数据共置的代码。 此方法可将客户端/服务器数据传输延迟降到最低。 有关详细信息,请参阅 Apache Phoenix 文档

How Apache Phoenix interfaces with Apache HBase.

HDInsight HBase 上的 Apache Phoenix 通常用于启用自助分析并提取见解,如下所示。 Phoenix 可以插入任何与 ODBC 兼容的 BI 工具,并能在 HBase 上启用临时 SQL 分析。

Self service with Apache HBase.

将 Apache HBase 和 Phoenix 结合,可用作可变数据的数据存储。 HBase 上的 Apache Phoenix 查询引擎附带了一些重要功能。

辅助索引

HBase 中的记录是使用主行键访问的,使用的是单个索引,在主行键上按字母顺序排列。 如果尝试以除主行以外的任何方式访问记录,会导致系统对 HBase 表中的所有数据进行低效率的扫描。 使用 Apache Phoenix,可以为列和表达式创建辅助索引,以创建允许点查找或沿此新索引进行范围扫描的可选行键。 有关详细信息,请参阅 Apache Phoenix 辅助索引文档

CREATE INDEX 命令用于在 HBase 中创建辅助索引,如下所示。

CREATE INDEX ix_purchasetype on SALTEDWEBLOGS (purchasetype, transactiondate) INCLUDE (bookname, quantity); 

视图

建议限制 HBase 中的物理表数,进而限制区域数量。 Phoenix 中的视图能帮助你执行该策略,使用此类视图,可以在 HBase 上创建多个共享相同基础物理表虚拟表。 有关详细信息,请参阅 Apache Phoenix 视图文档

在明确 HBase 中的以下表定义后。

CREATE  TABLE product_metrics (
    metric_type CHAR(1),
    created_by VARCHAR,
    created_date DATE,
    metric_id INTEGER
    CONSTRAINT pk PRIMARY KEY (metric_type, created_by, created_date, metric_id));

可以定义以下视图。

CREATE VIEW mobile_product_metrics (carrier VARCHAR, dropped_calls BIGINT) AS SELECT * FROM product_metric WHERE metric_type = 'm';

事务

尽管 HBase 仅适用于行级事务,但 Apache Phoenix 通过与 Apache Tephra 集成,可支持跨表和跨行事务,并具有完全 ACID 支持。

有关详细信息,请参阅 Apache Phoenix 事务文档

下面的示例创建一个名为 my_table 的表,然后对该表进行更改以启用事务。

CREATE TABLE my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true;

ALTER TABLE my_other_table SET TRANSACTIONAL=true;

加盐表

如果行键单调递增,则在按顺序的写入过程中会出现 HBase 中的区域服务器作用点。 Apache Phoenix 可以通过提供一种方法,使用加盐字节来为特定表的行键加盐,从而缓解作用点问题。 有关详细信息,请参阅 Apache Phoenix 加盐表文档。

CREATE TABLE Saltedweblogs (
    transactionid varchar(500) Primary Key,
    transactiondate Date NULL,
    customerid varchar(50) NULL,
    bookid varchar(50) NULL,
    purchasetype varchar(50) NULL,
    orderid varchar(50) NULL,
    bookname varchar(50) NULL,
    categoryname varchar(50) NULL,
    invoicenumber varchar(50) NULL,
    invoicestatus varchar(50) NULL,
    city varchar(50) NULL,
    state varchar(50) NULL,
    paymentamount DOUBLE NULL,
    quantity INTEGER NULL,
    shippingamount DOUBLE NULL) SALT_BUCKETS=4;

跳过扫描

对于一组给定的行,Apache Phoenix 对范围扫描的行内扫描使用跳过扫描,从而提高性能。 跳过扫描利用 SEEK_NEXT_USING_HINT HBase 筛选器。 它存储了关于要在每个列中搜索的一组键/键范围的信息。 然后会得到一个键(在筛选过程中传递过来的键),并判断它是否属于某个组合或范围。 如果没有,它会找出要跳转到的下一个最高键。 有关详细信息,请参阅 Apache Phoenix 跳过扫描文档

Apache Phoenix 上的性能优化是一个可选的请求功能,主要依赖于底层的 HBase 性能优化。 性能优化是一个复杂的话题,不在本课程的讨论范围之内。 不过如果你感兴趣,可以参考有关 Apache Phoenix 性能最佳做法的文档。