Phoenix二级索引(Secondary Indexing)的使用

利用Phoenix为HBase创建二级索引 为什么需要Secondary Index对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。对于较大的表,全表扫瞄的代价是不可接受的。但是,很多情况下,需要从多个角度查询数据。 阅读详情

 

2017年02月22日 08:35:04 xuguokun1986 阅读数:499

摘要

HBase只提供了一个基于字典排序的主键索引,在查询中你只能通过行键查询或扫描全表来获取数据,使用Phoenix提供的二级索引,可以避免在查询数据时全表扫描,提高查过性能,提升查询效率

 

测试环境:

数据约370万

数据格式:(数据来自搜狗实验室)

三节点集群(一主两从,hadoop和HBase属同一集群)

 

目录

  • Covered Indexes(覆盖索引)
  • Functional indexes(函数索引)
  • Global indexes(全局索引)
  • Local indexes(本地索引)

 

索引类型

Covered Indexes(覆盖索引)

覆盖索引:只需要通过索引就能返回所要查询的数据,所以索引的列必须包含所需查询的列(SELECT的列和WHRER的列)

 

不带索引的查询:

查询USERID= 9bb8b2af925864bb275b840c578df3c3的KEYWORD和URL

EXPLAIN(语句的执行逻辑及计划):

(由图看知先进行了全表扫描再通过过滤器来筛选出目标数据,显示这种查询方式效率是很低的)

 

查询时间:(平均在38s~41s)

 

 

带索引:

(创建基于USERID的覆盖索引并绑定KEYWORD列上的数据)

CREATE INDEX COVERINDEX ON CSVTANLES(USERID) INCLUDE(KEYWORD)

当你要通过UERID来查询KEYWORD时就直接可以从索引上取回数据而无需先得到索引再去数据表中查询数据

查询语句:

SECECT KEYWORD FROM CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3'

 

EXPLAIN:

(使用了COVERINDEX索引使用SCAN在索引区间内查询)

 

查询用时(平均在49ms~70ms):

注意:SELECT所带的字段必须包含在覆盖索引内

 

Functional indexes(函数索引)

从Phoeinx4.3以上就支持函数索引,其索引不局限于列,可以合适任意的表达式来创建索引,当在查询时用到了这些表达式时就直接返回表达式结果

例2:使用UPPER函数创建函数索引使查询出的USERID和URL里字母都是大写的

创建函数索引

CREATE INDEX UPPERINDEX ON CSVTABLES (UPPER(USERID || '  ' || URL))

查询:

 

Global indexes(全局索引)

全局索引适用于多读少写的场景,在写操作上会给性能带来极大的开销,因为所有的更新和写操作(DELETE,UPSERT VALUES和UPSERT SELECT)都会引起索引的更新,在读数据时,Phoenix将通过索引表来达到快速查询的目的。

在用使用全局索引之前需要在每个RegionServer上的hbase-site.xml添加如下属性:

 

 
  1. <property>

  2. <name>hbase.regionserver.wal.codec</name>

  3. <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>

  4. </property>

  5. <property>

  6. <name>hbase.region.server.rpc.scheduler.factory.class</name>

  7. <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>

  8. </property>

  9. <property>

  10. <name>hbase.rpc.controllerfactory.class</name>

  11. <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>

  12. </property>

在用使用全局索引之前需要在每个HMaster上的hbase-site.xml添加如下属性:

 
  1. <property>

  2. <name>hbase.region.server.rpc.scheduler.factory.class</name>

  3. <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>

  4. <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>

  5. </property>

  6. <property>

  7. <name>hbase.rpc.controllerfactory.class</name>

  8. <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>

  9. </property>

  10. <property>

  11. <name>hbase.region.server.rpc.scheduler.factory.class</name>

  12. <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value> </property>

  13. <property> <name>hbase.rpc.controllerfactory.class</name>

  14. <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>

  15. </property>

 

 

在USERID字段上创建索引

CREATE INDEX USERIDINDEX ON CSVTABLES(USERID);

 

以下查询会用到索引

SELECT USERID FROM CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3';

 

SELECT USERID,ROWKEY CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3';

 

以下查询不会用到索引

查询语句1.

SELECT USERID,KEYWORD FROM CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3'

(虽然USERID是索引字段,但KEYWORD不是索引字段,所以不会使用到索引)

 

查询语句2.

SELECT KEYWORD FROM CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3'

(同理,KEYWORD不是索引字段)

 

使用以下三种方式,执行查询语句2时也将用到索引.

1.创建包含字段KEYWORD的覆盖索引

CREATE INDEX MYINDEX ON CSVTABLE(USERID) INCLUDE(KEYWORD);

 

2.强制使用索引

SELECT /*+ INDEX(CSVTABLES,MYINDEX) */ KEYWORD FROM CSVTABLES WHERE USERID='9bb8b2af925864bb275b840c578df3c3';

如果KEYWORD是索引字段,那么就会直接从索引表中查询

如果KEYWORD不是索引字段,那么将会进行全表扫描,所以当用户明确知道表中数据较少且符合检索条件时才适用,此时的性能才是最佳的。

 

3.使用本地索引

CREATE LOCAL INDEX MYINDEX ON CSVTABLES(KEYWORD);

 

Local indexes(本地索引)

本地索引适用于写多读少,空间有限的场景,和全局索引一样,Phoneix在查询时会自动选择是否使用本地索引,使用本地索引,为避免进行写操作所带来的网络开销,索引数据和表数据都存放在相同的服务器中,当查询的字段不完全是索引字段时本地索引也会被使用,与全局索引不同的是,所有的本地索引都单独存储在同一张共享表中,由于无法预先确定region的位置,所以在读取数据时会检查每个region上的数据因而带来一定性能开销。

在使用本地索引需要在Master的hbase-site.xml添加以下属性

复制代码

<property>
   <name>hbase.master.loadbalancer.class</name>
   <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>
<property>
   <name>hbase.coprocessor.master.classes</name>
   <value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
</property>

复制代码

Phoeinx4.3以上为支持在数据region合并时本地索引region也能进行合并需要在每个region servers中添加以下属性

<property>
   <name>hbase.coprocessor.regionserver.classes</name>
   <value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>

创建本地索引

CREATE LOCAL INDEX MYINDEX ON CSVTABLES(USERID);

查询

CREATE LOCAL INDEX MYINDEX ON CSVTABLES(USERID);

整个查询只花了0.19s

 

 

删除索引

CREATE LOCAL INDEX MYINDEX ON CSVTABLES(KEYWORD);

如果表中的一个索引列被删除,则索引也将被自动删除,如果删除的是

覆盖索引上的列,则此列将从覆盖索引中被自动删除。

 

索引的优化

以下属性都必须在各节点上的hbase-site.xml中设置为true才能起效,

1.index.builder.threads.max:(默认值:10)

    根据主表的更新来确定更新索引表的线程数

 

2.index.builder.threads.keepalivetime:(默认值:60)

    builder线程池中线程的存活时间

 

3.index.write.threads.max:(默认值:10)

    更新索引表时所能使用的线程数(即同时能更新多少张索引表),其数量最好与索引表的数量一致

 

4.index.write.threads.keepalivetime(默认值:60)

     更新索引表的线程所能存活的时间

  

5.hbase.htable.threads.max(默认值:2147483647)

     每张索引表所能使用的线程(即在一张索引表中同时可以有多少线程对其进行写入更新),增加此值可以提高更新索引的并发量

 

6.hbase.htable.threads.keepalivetime(默认值:60)

     索引表上更新索引的线程的存活时间

 

7.index.tablefactoy.cache.size(默认值:10)

     允许缓存的索引表的数量

     增加此值,可以在更新索引表时不用每次都去重复的创建htable,由于是缓存在内存中,所以其值越大,其需要的内存越多

 

phoenix索引 1. 介绍 二级索引这个特性应该是大部分用户引入Phoenix主要考虑的因素之一。HBase因其历史原因只支持rowkey索引,当使用rowkey来查询数据时可以很快定位到数据位置。现实中,业务查询需求条件往往比较复杂,带有多个查询字段组合,如果用HBase查的话,只能全表扫描进行过滤,效率很低。而Phoenix支持除rowkey外的其它字段的索引创建,即二级索引,查询效率可大幅提升。 为什... 阅读详情

相关推荐

Revit二次开发之获取钢筋(Rebar)的线(Line)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_25986069的博客 1313

大数据Phoenix系列之Phoenix基本操作

phoenix表操作、索引操作、表结构调整方式

飞翔的博客 1628

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3226

大数据之Phoenix视图操作和二级索引

Phoenix视图操作和基于Phoenix的二级索引

weixin_43339889的博客 875

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 489

Skynet 框架面试题

本文整理了游戏服务端开发面试中 Skynet 框架的高频考点,涵盖底层架构、消息派发、协程调度、网络 I/O、harbor 跨机通信、内存管理、socket 处理、阻塞操作、错误处理等核心内容。全面覆盖 Skynet 框架的原理、使用和实战问题,追求深入准确,拒绝八股文。

小赖的博客 384

Phoenix二级索引(Secondary Indexing)的使用(转:https://www.cnblogs.com/MOBIN/p/5467284.html)

摘要 HBase只提供了一个基于字典排序的主键索引,在查询中你只能通过行键查询或扫描全表来获取数据,使用Phoenix提供的二级索引,可以避免在查询数据时全表扫描,提高查过性能,提升查询效率 测试环境: 数据约370万 数据格式:(数据来自搜狗实验室) 三节点集群(一主两从,hadoop和HBase属同一集群) 目录 Covered Indexes(覆盖索引) Functional indexe...

涂作权的博客 5080

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

爬虫系列,(3),达盖尔图片抓取

import re import requests from bs4 import BeautifulSoup # 第一步得到代理 def proxy(): with open(r'ip_proxies\有效ip.txt', 'r', encoding='utf-8') as f: r = f.readlines() for ip in r: ...

enodhs 14万+

《UDS/OBD诊断需求编辑工具》总目录

目录 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 2.1 编辑ODX-D诊断描述文件 2.2 编辑ODX-F刷写软件 该专栏主要负责介绍CANdela Studio和ODX Studio编辑CDD/ODX/PDX诊断描述文件。 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 【ODX介绍 】-1- 标准梳理 【ODX介绍】 -2-如何手..

「汽车电子助手」的博客 1万+

华为OD机试 - 学校的位置 - 数学问题(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 455

phoenix学习四节 Secondary Indexing 二级索引

1.Secondary Indexing二级索引二级索引就是从主要访问路径的另一个hbase表的方式。1.覆盖索引机制 phoenix提供了一个强大的覆盖机制,就是一旦从索引中找到检索的条目就不去访问主表了。就是说它将关心的数据绑定到索引中,这样就可以节省读取时间,典型的用空间换时间的案例。 例如,以下内容将在v1和v2列上创建索引,并在索引中包含v3列,以防止必须从数据表中获取它:CREATE ...

浏阳河 1458

在 SAP 中启用应收/应付“代扣税(Withholding Tax)”功能,本质上是激活并配置“扩展代扣税(Extended Withholding Tax)”模型

摘要:SAP中启用应收/应付代扣税功能需完成3个层级12个核心步骤:1)全局激活公司代码代扣税功能;2)配置代扣税规则、税率和科目,包括定义税种类型、代码、总账科目等;3)在供应商/客户主数据中关联代扣税设置。完成后系统可在发票或付款环节自动计算并过账代扣税,支持多税种并行计算和税率年度调整,最终生成税务报表。常见问题排查需检查公司代码激活状态和主数据配置。(149字)

金牌架构师 836

通过phoenix在hbase上创建二级索引,Secondary Indexing

环境描述: 操作系统版本:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 phoenix版本:phoenix-4.10.0 hbase版本:hbase-1.2.6 hbase节点分布:1个HMaster,2个RegionServer 文档目的: 通过在phoenix客户端连接hbase数据库,在phoenix中创建二...

weixin_34019144的博客 203

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

phoenix:Secondary Indexing

Secondary Indexing 二级索引是以一种垂直的方式去访问主表的数据(以前是通过get scan去获取数据的)。在Hbase中,有一个独特的索引,主表的row key,按照字典顺序进行排列 。访问数据的方式不再是通过主表的row key(潜在需要进行值全表扫描)去匹配过滤条件。对于二级索引,你索引的表或者表达式构成了 row key来实现点查询和范围查询。 Conver...

huang358468的博客 277

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么需要Secondary Index

对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。对于较大的表,全表扫瞄的代价是不可接受的。 但是,很多情况下,需要从多个角度查询数据。例如,在定位某个人的时候,可以通过姓名、身份证号、学籍号等不同的角度来查询,要想把这么多角度的数据都放到rowkey中几乎不可能(业务的灵活性不允许,对r

xuguokun1986的博客 3541

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大数据(5d)Phoenix

Phoenix简介 Phoenix安装 Phoenix Shell 配置 Global Indexes Local Indexes 低延时场景的OLAP 用户借助Phoenix,可以使用SQL语法来操作HBase Secondary Indexing加速查询 Introduction Deploy Phoenix Shell Secondary Indexing Configuration

ArYe 305

Phoenix命令及语法

基本命令: 首先sqlline.py lyy1,lyy2,lyy3,lyy4:2181登录到Phoenix的shell中,可以使用正常的SQL语句进行操作。 !table查看表信息 !describe tablename可以查看表字段信息 !history可以查看执行的历史SQL !dbinfo !index tb;查看tb的索引 help查看其他操作 导入数据: 在phoenix 目录下执行 hadoop jar /home/phoenix-4.12/phoenix-4.6.0-HBase-1.0-.

JacksonKing的专栏 1661

hdfs phoenix 导入_apach hadoop2.6 集群利用Phoenix 4.6-hbase 批量导入并自动创建索引

基础环境:1、安装apach 版本hadoop2.62、部署hbase1.0.03、下载phoenix-4.6.0-HBase-1.0。下载地址(http://mirror.nus.edu.sg/apache/phoenix/phoenix-4.6.0-HBase-1.0/bin/phoenix-4.6.0-HBase-1.0-bin.tar.gz)4、phoenix 集成HBase : 将hoe...

weixin_42293447的博客 246

Apache Phoenix on CDH 5

We are happy to announce the inclusion of Apache Phoenix in Cloudera Labs.[Update:A new package forApache Phoenix 4.7.0 on CDH 5.7was released in June 2016.]Apache Phoenixis an efficient SQL skin ...

weixin_30432007的博客 177

Phoenix二级索引使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33788244的博客 498
上一篇: 15分钟熟悉HBase Shell命令
下一篇: HBase最佳实践-读性能优化策略
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值