热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hbase安装包_HBase集成Phoenix构建二级索引实践

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

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 的基本架构:

ba2820d8bf92d32ffbb262e21e2449af.png

CDH HBase 集成 Phoenix

版本说明

  • http://phoenix.apache.org/download.html;

  • 高版本 CDH 安装 Phoenix 可以参考:产品 | Cloudera正式宣布在CDH中支持Apache Phoenix

  • http://archive.cloudera.com/cloudera-labs/phoenix/parcels/

  • 此外,用户还可以自行编译适合自己的Phoenix版本。

安装

首先到官网下载适合自己环境的 Parcel 安装包,并发布到 httpd 服务:

[root@hadoop-01 /var/www/html/phoenix/4.14.0]$ ll
total 300524
-rw-r--r-- 1 root root 307722240 Feb 3 19:30 APACHE_PHOENIX-4.14.0-cdh5.11.2.p0.3-el7.parcel
-rw-r--r-- 1 root root 178 Feb 3 19:28 APACHE_PHOENIX-4.14.0-cdh5.11.2.p0.3-el7.parcel.sha512
-rw-r--r-- 1 root root 5081 Feb 3 19:30 manifest.json

(可左右滑动)

0af2f1cae3f1fce5824c4cf0c9917764.png然后配置成 CDH 远程 Parcel 存储库 url:17dba8aa3b9545459866f3e78a19f3ba.png接下来下载,分配,激活完成安装即可。

配置

安装完 Phoenix 后,需要做一些必要配置才能使用 Phoenix,CDH HBase 配置界面配置如下两处:

1. hbase-site.xml 的 HBase 服务高级配置代码段(安全阀)

2. hbase-site.xml 的 HBase 客户端高级配置代码段(安全阀)

添加如下参数配置:


hbase.regionserver.wal.codecorg.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec


phoenix.schema.isNamespaceMappingEnabledtrue
phoenix.schema.mapSystemTablesToNamespacetrue

(可左右滑动)

然后,按照提示重启HBase服务并重新部署客户端配置即可。

命令行使用

CDH 安装后环境变量都已经配置好了,可以直接使用 phoenix-sqlline.py,如下:

[root@hadoop-01 ~]$ phoenix-
phoenix-performance.py phoenix-psql.py phoenix-sqlline.py phoenix-utils.py

(可左右滑动)

执行 phoenix-sqlline.py 初始化使用 Phoenix:

9f60f5987e77b1fc67d563b47597a703.png

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

hbase(main):003:0> list
SYSTEM:CATALOG
SYSTEM:FUNCTION
SYSTEM:LOG
SYSTEM:MUTEX
SYSTEM:SEQUENCE
SYSTEM: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

=> 2799827
hbase(main):018:0> scan 'ns1000:operate_log', LIMIT => 1
ROW COLUMN+CELL
x00x00x12x12x00x00x00x0D1538216707720 column=f:appVersion, timestamp=1538216707892, value=2.22.0
x00x00x12x12x00x00x00x0D1538216707720 column=f:area, timestamp=1538216707892, value=xE6xB1x9FxE5x8Cx97xE5x8CxBA
x00x00x12x12x00x00x00x0D1538216707720 column=f:authId, timestamp=1538216707892, value=
x00x00x12x12x00x00x00x0D1538216707720 column=f:city, timestamp=1538216707892, value=xE9x87x8DxE5xBAx86xE5xB8x82
x00x00x12x12x00x00x00x0D1538216707720 column=f:imei, timestamp=1538216707892, value=AF36147F-8106-47F0-B58F-A3FB75DBE325
x00x00x12x12x00x00x00x0D1538216707720 column=f:lat, timestamp=1538216707892, value=29.577587127685547
x00x00x12x12x00x00x00x0D1538216707720 column=f:lon, timestamp=1538216707892, value=106.50493621826172
x00x00x12x12x00x00x00x0D1538216707720 column=f:memberType, timestamp=1538216707892, value=0
x00x00x12x12x00x00x00x0D1538216707720 column=f:mobileManufacturer, timestamp=1538216707892, value=iPhone
x00x00x12x12x00x00x00x0D1538216707720 column=f:mobileModel, timestamp=1538216707892, value=iPhone 6 Plus
x00x00x12x12x00x00x00x0D1538216707720 column=f:province, timestamp=1538216707892, value=xE9x87x8DxE5xBAx86xE5xB8x82
x00x00x12x12x00x00x00x0D1538216707720 column=f:systemType, timestamp=1538216707892, value=1
x00x00x12x12x00x00x00x0D1538216707720 column=f:systemVersion, timestamp=1538216707892, value=12.0
x00x00x12x12x00x00x00x0D1538216707720 column=f:time, timestamp=1538216707892, value=1538216707720
1 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



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 在更换电脑或重装系统时,用户经常需要处理诸如备份收藏夹、电子邮件、用户配置文件和常用文档等任务。尽管这些操作并不复杂,但却相当繁琐。本文介绍了一种利用Windows 7中的“轻松传送”功能,高效便捷地在两台电脑之间同步数据的方法,大大简化了这一过程。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
author-avatar
川川shilohjr_993
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有