苹果维修点

您现在的位置是:首页 > 苹果手机 > 苹果维修教程

苹果维修教程

hbase的二级索引应用,关于hbase二级索引的描述)

2022-07-27 08:28:25 苹果维修教程
hbase的二级索引应用,关于hbase二级索引的描述)Phoenix在HBase生态系统中占据了非常重要的地位,本文主要包括以下几方面内容:Phoenix介绍CDHHBase集成Phoenix使用Phoenix创建HBase二级索引Phoenix索引类型介绍Phoenix介绍Phoenix是构建在HBase之上的高效的S

hbase的二级索引应用,关于hbase二级索引的描述)

hbase的二级索引应用,关于hbase二级索引的描述)

Phoenix 在 HBase 生态系统中占据了非常重要的地位,本文主要包括以下几方面内容:

Phoenix 介绍CDH HBase 集成 Phoenix使用 Phoenix 创建 HBase 二级索引Phoenix 索引类型介绍Phoenix 介绍

Phoenix 是构建在 HBase 之上的高效的 SQL 引擎,同时具备 OLTP 和 OLAP 能力,作为 HBase 生态系统中非常重要的组件,重点的特性包括:

底层存储基于 HBase,并提供一套标准的 JDBC API 作为 HBase SQL 层;支持标准 SQL,以及完整 ACID 事务特性;为 HBase 提供了二级索引解决方案;

此外,Phoenix 还和很多其他组件做了集成,比如 Spark、Hive、Flume 等.Phoenix 与 HBase 集成,其最大的特点就是为 HBase 提供了二级索引,后文会重点介绍.下图是 Phoenix 的基本架构:

然后我们查看下 HBase 中 Phoenix 的系统表:

hbase(main):003:0> listSYSTEM:CATALOGSYSTEM:FUNCTIONSYSTEM:LOGSYSTEM:MUTEXSYSTEM:SEQUENCESYSTEM:STATS

(可左右滑动)

接下来看一下如何在 Phoenix 中创建 HBase 表的二级索引.

使用 Phoenix 创建 HBase 二级索引映射已存在的 HBase 表1. 查看 HBase 表

当前 HBase 中存在一张操作日志表 ns1000:operate_log,数据量近280w,包括14个字段,如下:

hbase(main):017:0> count 'ns1000:operate_log', INTERVAL => 100000...2799827 row(s) in 173.4200 seconds=> 2799827hbase(main):018:0> scan 'ns1000:operate_log', LIMIT => 1ROW COLUMN+CELLx00x00x12x12x00x00x00x0D1538216707720 column=f:appVersion, timestamp=1538216707892, value=2.22.0x00x00x12x12x00x00x00x0D1538216707720 column=f:area, timestamp=1538216707892, value=xE6xB1x9FxE5x8Cx97xE5x8CxBAx00x00x12x12x00x00x00x0D1538216707720 column=f:authId, timestamp=1538216707892, value=x00x00x12x12x00x00x00x0D1538216707720 column=f:city, timestamp=1538216707892, value=xE9x87x8DxE5xBAx86xE5xB8x82x00x00x12x12x00x00x00x0D1538216707720 column=f:imei, timestamp=1538216707892, value=AF36147F-8106-47F0-B58F-A3FB75DBE325x00x00x12x12x00x00x00x0D1538216707720 column=f:lat, timestamp=1538216707892, value=29.577587127685547x00x00x12x12x00x00x00x0D1538216707720 column=f:lon, timestamp=1538216707892, value=106.50493621826172x00x00x12x12x00x00x00x0D1538216707720 column=f:memberType, timestamp=1538216707892, value=0x00x00x12x12x00x00x00x0D1538216707720 column=f:mobileManufacturer, timestamp=1538216707892, value=iPhonex00x00x12x12x00x00x00x0D1538216707720 column=f:mobileModel, timestamp=1538216707892, value=iPhone 6 Plusx00x00x12x12x00x00x00x0D1538216707720 column=f:province, timestamp=1538216707892, value=xE9x87x8DxE5xBAx86xE5xB8x82x00x00x12x12x00x00x00x0D1538216707720 column=f:systemType, timestamp=1538216707892, value=1x00x00x12x12x00x00x00x0D1538216707720 column=f:systemVersion, timestamp=1538216707892, value=12.0x00x00x12x12x00x00x00x0D1538216707720 column=f:time, timestamp=1538216707892, value=15382167077201 row(s) in 0.0460 seconds

(可左右滑动)

2. Phoenix 中创建与 namespace 名称一致的 schema

0: jdbc:phoenix:> create schema if not exists "ns1000";No rows affected (0.012 seconds)

(可左右滑动)

3. Phoenix 中创建视图,并查询数据及条数

0: jdbc:phoenix:> use "ns1000";No rows affected (0.021 seconds)0: jdbc:phoenix:> create view "operate_log"(. . . . . . . . > "pk" varchar primary key,. . . . . . . . > "f"."appVersion" varchar,. . . . . . . . > "f"."city" varchar,. . . . . . . . > "f"."lat" varchar,. . . . . . . . > "f"."lon" varchar,. . . . . . . . > "f"."memberType" varchar,. . . . . . . . > "f"."time" varchar);No rows affected (6.555 seconds)0: jdbc:phoenix:> !tables+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+--------+| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE_NAME | SELF_REFERENCING_COL_NAME | REF_GENERATION | INDEX_STATE | IMMUTABLE_ROWS | SALT_BUCKETS | MULTI_TENANT | VIEW_STATEMENT | VIEW_TYPE | INDEX_ |+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+--------+| | SYSTEM | CATALOG | SYSTEM TABLE | | | | | | false | | false | | | || | SYSTEM | FUNCTION | SYSTEM TABLE | | | | | | false | | false | | | || | SYSTEM | LOG | SYSTEM TABLE | | | | | | true | 32 | false | | | || | SYSTEM | SEQUENCE | SYSTEM TABLE | | | | | | false | | false | | | || | SYSTEM | STATS | SYSTEM TABLE | | | | | | false | | false | | | || | ns1000 | operate_log | VIEW | | | | | | false | | false | | MAPPED | |+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+--------+0: jdbc:phoenix:> !columns "operate_log";+------------+--------------+--------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------+| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | COLUMN_SIZE | BUFFER_LENGTH | DECIMAL_DIGITS | NUM_PREC_RADIX | ABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_O |+------------+--------------+--------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------+| | ns1000 | operate_log | pk | 12 | VARCHAR | | | | | 0 | | | | | || | ns1000 | operate_log | appVersion | 12 | VARCHAR | | | | | 1 | | | | | || | ns1000 | operate_log | city | 12 | VARCHAR | | | | | 1 | | | | | || | ns1000 | operate_log | lat | 12 | VARCHAR | | | | | 1 | | | | | || | ns1000 | operate_log | lon | 12 | VARCHAR | | | | | 1 | | | | | || | ns1000 | operate_log | memberType | 12 | VARCHAR | | | | | 1 | | | | | || | ns1000 | operate_log | time | 12 | VARCHAR | | | | | 1 | | | | | |+------------+--------------+--------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------+0: jdbc:phoenix:> select * from "operate_log" limit 1;+------------------------+-------------+-------+---------------------+---------------------+-------------+----------------+| pk | appVersion | city | lat | lon | memberType | time |+------------------------+-------------+-------+---------------------+---------------------+-------------+----------------+1538216707720 | 2.22.0 | 重庆市 | 29.577587127685547 | 106.50493621826172 | 0 | 1538216707720 |+------------------------+-------------+-------+---------------------+---------------------+-------------+----------------+1 row selected (0.115 seconds)0: jdbc:phoenix:> select count(*) from "operate_log";+-----------+| COUNT(1) |+-----------+| 2799827 |+-----------+1 row selected (3.848 seconds)

(可左右滑动)

4. 根据字段 time 进行时间范围查询:0: jdbc:phoenix:> select count(*) from "operate_log" where "f"."time" between '1538216707720' and '1538223834000';+-----------+| COUNT(1) |+-----------+| 5883 |+-----------+1 row selected (5.241 seconds)

(可左右滑动)

这种情况下,基本上查询都在 5s 左右.

这里还要有两点说明:

Phoenix 会自动将表名、字段名都转成大写,如果要区分大小写使用双引号括起来即可.这里我们创建的是视图,相当于外部表,也可以 create table 创建表,视图的特点是删除时不会删除 HBase 表,但是视图创建的二级索引不会自动更新,如果要实时更新的话,只能使用 create table,然后通过 Phoenix jdbc 的方式写入数据,只有通过 Phoenix 写,然后用 Phoenix 实现的协处理器才能实现实时更新的索引.使用 Phoenix 创建二级索引1. 使用 Phoenix 对 time 字段创建索引0: jdbc:phoenix:> create index index_operate_log_time on "operate_log" ("f"."time");2,799,827 rows affected (95.814 seconds)

(可左右滑动)

2. 再次根据 time 字段做范围查询

00: jdbc:phoenix:> select count(*) from "operate_log" where "f"."time" between '1538216707720' and '1538223834000';+-----------+| COUNT(1) |+-----------+| 5883 |+-----------+1 row selected (0.049 seconds)

(可左右滑动)

这里基本上查询都在 50 ms 左右.这就是通过 Phoenix 的二级索引带来的性能提升.

Phoenix 索引类型介绍

Phoenix 提供了多种索引类型,包括覆盖索引、函数索引,以及全局索引与本地索引等,具体介绍如下.

Covered Indexes(覆盖索引)

覆盖索引是在索引表中直接存储某些常用字段,当查询时所有字

苹果维修哪家好常州

段仅涉及索引表中包含的字段时,则无需再在基于 rowkey 索引的数据表中查询,提高了查询的效率.

比如,我们在operate_log 表 “f”.”time” 列上创建一个索引,并在索引中包含 “f”.”lat”, “f”.”lon” 列:

0: jdbc:phoenix:> create index index_operate_log_time2 on "operate_log" ("f"."time") INCLUDE("f"."lat", "f"."lon");2,799,827 rows affected (133.367 seconds)

(可左右滑动)

这样我们做类似如下查询时就可以直接走索引表,以提高查询性能:

0: jdbc:phoenix:> select "f"."lat", "f"."lon" from "operate_log" where "f"."time" between '1538216707720' and '1538223834000' limit 10;

(可左右滑动)

Functional Indexes(函数索引)

函数索引是在 Phoeinx 4.3 版本之后新增的,它使得索引的建立不仅仅只限于基于列,而可以使用任意的表达式来创建索引,在查询时,如出现相同的表达式查询条件,则会自动优先检索索引表.

比如,我们在operate_log 表上基于 substr ( “f”.”time”, 1, 10) 创建一个索引:

0: jdbc:phoenix:> create index index_operate_log_time3 on "operate_log" (substr("f"."time", 1, 10));2,799,827

苹果服务维修中心嘉兴

rows affected (94.74 seconds)

(可左右滑动)

这样创建索引后,我们就可以使用相同表达式走索引表进行查询优化了,比如:

0: jdbc:phoenix:> select count(*) from "operate_log" where substr("f"."time", 1, 10) between '1538216707' and '1538223834';+-----------+| COUNT(1) |+-----------+| 5886 |+-----------+1 row selected (0.059 seconds)

(可左右滑动)

Global Indexes(全局索引)

上面的覆盖索引和函数索引都属于全局索引,也是 Phoenix 默认的索引创建模式.

全局索引将索引表和数据表分开存储,如以上例子中都会创建一张新的索引表,因此每条数据和其索引数据可能会分布在不同的数据节点上,数据表的添加、删除和修改都会更新相关的索引表,所以写入数据时由于额外的网络开销会带来较大的性能消耗.而查询数据的时候,Phoenix 会通过索引表来快速低损耗的获取数据.因此全局索引更适合读多写少的使用场景.

Local Indexes(本地索引)

本地索引与全局索引相反,在 4.8.0 版本之后会将索引数据以特定的列簇存储在同一张数据表中,并通过特定的 rowkey 设置,将每条数据及其索引数据存储在同一 region 中,因此在数据写入时防止了额外的网络开销,而在读取数据时因无法提前判断索引数据的准确位置,则会在所有的 region 中检索索引数据,而非常影响读取性能.所以本地索引更适合于写多读少的使用场景.

本地索引只要在原来索引创建时增加 local 关键字即可,比如:

0: jdbc:phoenix:> create local index index_operate_log_time on "operate_log" ("f"."time");

(可左右滑动)

总结

Phoenix 是构建在 HBase 之上的 SQL 层,不仅能够提供标准的 SQL 查询,还能够为 HBase 提供二级索引能力,在 HBase 使用场景中应用非常广泛.Phoenix 二级索引主要分为全局索引和本地索引,全局索引适合那些读多写少的场景,本地索引更适合那些写多读少的场景.判断是否走索引可以 explain SQL 查看具体执行计划.

参考:

1. HBase集成Phoenix,构建Phoenix view和table的区别

2. 如何使用Phoenix在CDH的HBase中创建二级索引

3. 产品 | Cloudera正式宣布在CDH中支持Apache Phoenix

◆Apache Hudi 0.5.1版本重磅发布

◆贝壳找房基于 Flink 的实时平台建设

◆网易大数据基础平台建设之路

◆小米流式平台架构演进与实践


济南苹果维修点

佛山苹果维修中心

以上就是关于"hbase的二级索引应用,关于hbase二级索引的描述)"相关内容,希望对你有所帮助,更多关于苹果维修教程,敬请关注赐研手机网.

赐研手机维修网】文章内容来源:https://vip-chn.com/iphone/jiaocheng/12829.html