转:Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index
之前的文章《更高的压缩比,更好的性能–使用ORC文件格式优化Hive》中介绍了Hive的ORC文件格式,它不但有着很高的压缩比,节省存储和计算资源之外,还通过一个内置的轻量级索引,提升查询的性能。这个内置的轻量级索引,就是下面所说的Row Group Index。
其实ORC支持的索引不止这一种,还有一种BloomFilter索引,两者结合起来,更加提升了Hive中基于ORC的查询性能。
说明一下:本文使用Hive2.0.0 + hadoop-2.3.0-cdh5.0.0作为测试环境。表lxw1234_text为text格式保存,总记录数为12000920。
Row Group Index
由之前的文章知道,一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个column的min/max值的索引数据,当查询中有<,>,=的操作时,会根据min/max值,跳过扫描不包含的stripes。
而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index,也叫min-max Index,或者Storage Index。在建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group Index,需要注意的是,为了使Row Group Index有效利用,向表中加载数据时,必须对需要使用索引的字段进行排序,否则,min/max会失去意义。另外,这种索引通常用于数值型字段的查询过滤优化上。
看下面的例子:
- CREATE TABLE lxw1234_orc2 stored AS ORC
- TBLPROPERTIES
- ('orc.compress'='SNAPPY',
- 'orc.create.index'='true',
- 'orc.bloom.filter.fpp'='0.05',
- 'orc.stripe.size'='10485760',
- 'orc.row.index.stride'='10000')
- AS
- SELECT CAST(siteid AS INT) AS id,
- pcid
- FROM lxw1234_text
- DISTRIBUTE BY id sort BY id;
直接执行下面的查询(未使用索引):
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 1382 AND id <= 1399;
很明显,扫描了所有记录。再使用索引查询:
- set hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 1382 AND id <= 1399;
可以看到,只扫描了部分记录,即根据Row Group Index中的min/max跳过了WHERE条件中不包含的stripes,索引有效果。
假如有下面的查询:
- SET hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 0 AND id <= 1000
- AND pcid IN ('0005E26F0DCCDB56F9041C','A');
执行的过程大概是这样的:
先根据Row Group Index中的min/max,判断哪些stripes/file包含在内,接着逐行扫描,过滤pcid IN (‘0005E26F0DCCDB56F9041C’,’A’)的记录。
可以看到,没有全表扫描,跳过了一部分stripes。这样看来,如果where后面的id范围很大,完全可能会包含所有的文件,再根据pcid过滤时候,又相当于全表扫描了。
对于这种查询场景的优化策略,就是下面的BloomFilter索引。
Bloom Filter Index
之前有篇文章《大数据去重统计之BloomFilter》,介绍过BloomFilter的原理和Java版的例子。Hive的ORC中基于此,提供了BloomFilter索引,用于性能优化。
在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的=号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe.
看下面的建表语句,为pcid字段建立BloomFilter索引:
- CREATE TABLE lxw1234_orc2 stored AS ORC
- TBLPROPERTIES
- ('orc.compress'='SNAPPY',
- 'orc.create.index'='true',
- "orc.bloom.filter.columns"="pcid",
- 'orc.bloom.filter.fpp'='0.05',
- 'orc.stripe.size'='10485760',
- 'orc.row.index.stride'='10000')
- AS
- SELECT CAST(siteid AS INT) AS id,
- pcid
- FROM lxw1234_text
- DISTRIBUTE BY id sort BY id;
然后执行上面的查询:
- SET hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 0 AND id <= 1000
- AND pcid IN ('0005E26F0DCCDB56F9041C','A');
您可以关注 lxw的大数据田地 ,或者 加入邮件列表 ,随时接收博客更新的通知邮件。
通过Row Group Index和Bloom Filter Index的双重索引优化,这条语句最终执行,只扫描了60000条记录,大大节省了MapTask的执行时间和资源。
之前的文章《更高的压缩比,更好的性能–使用ORC文件格式优化Hive》中介绍了Hive的ORC文件格式,它不但有着很高的压缩比,节省存储和计算资源之外,还通过一个内置的轻量级索引,提升查询的性能。这个内置的轻量级索引,就是下面所说的Row Group Index。
其实ORC支持的索引不止这一种,还有一种BloomFilter索引,两者结合起来,更加提升了Hive中基于ORC的查询性能。
说明一下:本文使用Hive2.0.0 + hadoop-2.3.0-cdh5.0.0作为测试环境。表lxw1234_text为text格式保存,总记录数为12000920。
Row Group Index
由之前的文章知道,一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个column的min/max值的索引数据,当查询中有<,>,=的操作时,会根据min/max值,跳过扫描不包含的stripes。
而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index,也叫min-max Index,或者Storage Index。在建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group Index,需要注意的是,为了使Row Group Index有效利用,向表中加载数据时,必须对需要使用索引的字段进行排序,否则,min/max会失去意义。另外,这种索引通常用于数值型字段的查询过滤优化上。
看下面的例子:
- CREATE TABLE lxw1234_orc2 stored AS ORC
- TBLPROPERTIES
- ('orc.compress'='SNAPPY',
- 'orc.create.index'='true',
- 'orc.bloom.filter.fpp'='0.05',
- 'orc.stripe.size'='10485760',
- 'orc.row.index.stride'='10000')
- AS
- SELECT CAST(siteid AS INT) AS id,
- pcid
- FROM lxw1234_text
- DISTRIBUTE BY id sort BY id;
直接执行下面的查询(未使用索引):
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 1382 AND id <= 1399;
很明显,扫描了所有记录。再使用索引查询:
- set hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 1382 AND id <= 1399;
可以看到,只扫描了部分记录,即根据Row Group Index中的min/max跳过了WHERE条件中不包含的stripes,索引有效果。
假如有下面的查询:
- SET hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 0 AND id <= 1000
- AND pcid IN ('0005E26F0DCCDB56F9041C','A');
执行的过程大概是这样的:
先根据Row Group Index中的min/max,判断哪些stripes/file包含在内,接着逐行扫描,过滤pcid IN (‘0005E26F0DCCDB56F9041C’,’A’)的记录。
可以看到,没有全表扫描,跳过了一部分stripes。这样看来,如果where后面的id范围很大,完全可能会包含所有的文件,再根据pcid过滤时候,又相当于全表扫描了。
对于这种查询场景的优化策略,就是下面的BloomFilter索引。
Bloom Filter Index
之前有篇文章《大数据去重统计之BloomFilter》,介绍过BloomFilter的原理和Java版的例子。Hive的ORC中基于此,提供了BloomFilter索引,用于性能优化。
在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的=号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe.
看下面的建表语句,为pcid字段建立BloomFilter索引:
- CREATE TABLE lxw1234_orc2 stored AS ORC
- TBLPROPERTIES
- ('orc.compress'='SNAPPY',
- 'orc.create.index'='true',
- "orc.bloom.filter.columns"="pcid",
- 'orc.bloom.filter.fpp'='0.05',
- 'orc.stripe.size'='10485760',
- 'orc.row.index.stride'='10000')
- AS
- SELECT CAST(siteid AS INT) AS id,
- pcid
- FROM lxw1234_text
- DISTRIBUTE BY id sort BY id;
然后执行上面的查询:
- SET hive.optimize.index.filter=true;
- SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 0 AND id <= 1000
- AND pcid IN ('0005E26F0DCCDB56F9041C','A');
您可以关注 lxw的大数据田地 ,或者 加入邮件列表 ,随时接收博客更新的通知邮件。
通过Row Group Index和Bloom Filter Index的双重索引优化,这条语句最终执行,只扫描了60000条记录,大大节省了MapTask的执行时间和资源。
转:Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index的更多相关文章
- Hive性能优化
1.概述 继续<那些年使用Hive踩过的坑>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先 ...
- Hive性能优化上的一些总结
https://blog.csdn.net/mrlevo520/article/details/76339075 1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据 ...
- MySQL性能优化(三):索引
原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...
- Hive性能优化(全面)
1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次 ...
- SqlServer性能优化 查询和索引优化(十二)
查询优化的过程: 查询优化: 功能:分析语句后最终生成执行计划 分析:获取操作语句参数 索引选择 Join算法选择 创建测试的表: select * into EmployeeOp from Adve ...
- 数据库性能优化:SQL索引
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
- SQL Server 性能优化之——重复索引
原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/16/3139006.html 阅读导航 1. 概述 2. 什么是重复索引 3. 查找重复索引 ...
- MySQL性能优化,MySQL索引优化,order by优化,explain优化
前言 今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化.下期文章讲讲MySQL慢查询日志,我们是依据慢查询日志来判断哪条SQL语句有问题,然后在进行优化,敬请期待MySQL慢查询日志篇 建表 ...
- 性能优化之mysql索引优化
sql及索引优化 如何通过慢查询日志发现有问题的sql? 查询次数多且每次查询占用时间长的sql通常为pt-query-digest分析的前几个查询 IO大的sql注意pt-query-digest分 ...
随机推荐
- python web框架 Django的APP以及目录介绍 django 1.11版本
如果有很多业务请求函数 应该放在app目录 很多业务放在主站上 当用户一点跳到分站 例如 一个项目叫运维平台 他的业务 有资产管理 私有云 监控 不同业务线 chouti项目 - chouti - ...
- Centos7管理selinux及使用firewalld管理防火墙
CentOS 7.0默认使用的是firewall作为防火墙 1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status ...
- HTTP协议简要介绍
1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...
- 数据库权限分配(远程共享数据库)(mysql)
1. 数据库远程权限 mysql -uroot -proot grant all privileges on formal.* to root@'192.168.3.40' identified by ...
- CodeMatic动软自动生成Nhibernate
前两天调查了下自动生成工具MyGeneration和codesmith前一个版本已经不更新了后面一个太高级生成 的代码包含了太多东西,没整明白.不过生成的xmlmapping很强大.所以干脆整合一下c ...
- LeetCode:翻转二叉树【226】
LeetCode:翻转二叉树[226] 题目描述 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 题目 ...
- linux sed批量替换多个文件内容
sed -i "s/lgside/main/g" `grep -rl lgside /home/zn/work/project-template` 注意标点符号:`
- CodeForces - 995E Number Clicker (双向BFS)
题意:给出u,v,p,对u可以进行三种变化: 1.u=(u+1)%p ; 2.u = (u+p-1)%p; 3.u = 模p下的逆元.问通过几步可以使u变成v,并且给出每一步的操作. 分析:朴素的b ...
- HDU - 2819 Swap (二分图匹配-匈牙利算法)
题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...
- 特别好用的swagger ui 封装
Swagger简单介绍 Swagger是一个Restful风格接口的文档在线自动生成和测试的框架 官网:http://swagger.io 官方描述:The World’s Most Popular ...