orcFile split和读数据原理总结(hive0.13)
http://blog.csdn.net/zhaorongsheng/article/details/72903431
背景
Hive的rcfile格式已经使用多年,但是,它会将所有的列都当做二进制来处理,没有与类型挂钩。因此,Hive0.11版本引入orcFile。OrcFile有以下几点好处:
- 每个task只生成一个文件,减轻hdfs压力
- 保存列类型,支持datetime, decimal和负责类型(struct, list, map, and union)
- 文件中保存轻量级索引
- 跳过不需的row group
- seek到指定的row
- 根据列类型进行压缩
- 整数类型:run-length encoding
- string类型:dictionary encoding
- 不同的recordReader并发读同一文件
- split时,无需扫描标记
- 可以限制读写占用的内存
- 使用pb存放元数据,支持添加和移除列
结构
(图片来源:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC)
orc dump工具
// Hive version 0.11 through 0.14:
hive --orcfiledump <location-of-orc-file>
// Hive version 0.15 and later:
hive --orcfiledump [-d] [--rowindex <col_ids>] <location-of-orc-file>
// Hive version 1.2.0 and later:
hive --orcfiledump [-d] [-t] [--rowindex <col_ids>] <location-of-orc-file>
// Hive version 1.3.0 and later:
hive --orcfiledump [-j] [-p] [-d] [-t] [--rowindex <col_ids>] [--recover] [--skip-dump]
[--backup-path <new-path>] <location-of-orc-file-or-directory>
配置
KEY | Default | Notes |
---|---|---|
orc.compress | ZLIB | 压缩算法,NONE/ZLIB/SNAPPY |
orc.compress.size | 262,144 | 每个压缩块大小,也是压缩保存stripe数据缓存大小 |
orc.stripe.size | 67,108,864 | stripe大小 |
orc.row.index.stride | 10,000 | 索引数据间隔行(必须>=1000),即每10,000行数据,建一次索引,也是划分rowGroup的依据 |
orc.create.index | true | 是否建行级索引 |
split读取原理
涉及配置
- hive.optimize.index.filter
- 默认值:false
- 意义:
- 是否使用索引优化物理执行计划
- 是否将条件下推到TableScanOperator中(读取数据、做split时会使用此条件信息)
- orcFile需要设置为true,才能获取到过滤条件,进行stripe过滤
- hive.exec.orc.zerocopy
- 默认:false
- 读取orc文件时,是否使用0拷贝
- hive.input.format
- 默认:CombineHiveInputFormat
- 当使用combine方式时,会将小文件进行合并,但是不会用到OrcInputFormat的过滤stripe机制
- 当使用
org.apache.hadoop.hive.ql.io.HiveInputFormat
,会调用OrcInputFormat的getSplits方法
,过滤不符合要求的stripe
- hive.optimize.index.filter
开启条件及优缺点
这里只讨论非combine方式的split个读取方式。- 触发条件:
- set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;(必选)
- set hive.optimize.index.filter=true;(可选)
- 是否条件下推到TS,进行条件过滤,
建议开启
- 是否条件下推到TS,进行条件过滤,
- set hive.exec.orc.zerocopy=true;(可选)
- 读取orc文件,是否使用0拷贝,
建议开启
- 读取orc文件,是否使用0拷贝,
- 上述3个配置都开启情况
- 优点:
- 做split时:
- 可以将不符合条件的stripe提前过滤,减少map个数
- 读取时:
- 可以直接跳过不符合条件的rowGroup,无需读取多余的数据
- 做split时:
- 缺点:
- 不会combine,有可能会因为小文件过多,导致map数过多
- 依赖用户where条件,如果where条件过滤的数据不是很多,可能不会过滤stripe,导致map数过多(同时增加额外的计算,导致性能有所下降)
- 优点:
- 触发条件:
原理介绍
- split
- 步骤1:stripe1,设置offset1和end1
- 步骤2:stripe2被过滤条件过滤,
stripe1则会产生一个split
- 步骤3:stripe3,设置offset2和end2
- 步骤4:stripe4和stripe3处于不同的block,
stripe3则会产生一个split
,offset和end分别指向stripe4的开始和结束位置 - 步骤5:stripe5,offset不变,end指向stripe5的结束位置
- 步骤6:stripe6,此时(end4-offset4)>maxSplitSize,
stripe4/5/6则会产生一个split
- 步骤7:stripe7,到达文件结束,
stripe7产生一个split
- 读取
- 读取footer:获取列信息、索引位置信息、数据位置信息等
- 读取indexData
- 根据
orc.row.index.stride
的值,划分rowGroup,每个rowGroup的索引数据条数为orc.row.index.stride
的值 - 根据索引数据的信息(max/min),判断每个rowGroup是否满足下推的where条件,实际读取数据时进行skip
- 根据
- 读取实际数据
- 读取每列的数据,当遇到被过滤的rowGroup时,会skip掉,减少读取的数据量
- split
优缺点
- 优点
- 可以提前过滤无需的stripe,减少split个数
- 读取时,可以过滤不满足条件的rowGroup,减少读取数
- 缺点
- 做split时,stripe不会合并,有可能导致split数比combine方式更多
- 也有可能数据量少的split数比数据量多的split数多
- 优点
测试结果
stripeSize为128M
- sql1
select log_date,log_time,hh24,area_country,area_prov,area_city from tbl_orc_128M where dt='20161109' and hh24='19' and
channel_id=179569143limit 100;
- combine方式
- map数:1310
- 会进行列skip
Reading ORC rows from hdfs://bipcluster/bip/external_table/xx/tbl_orc_128M/dt=20161109/000856_0 with {include: [true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], offset: 0, length: 225585161}
- combine方式+条件下推
- map数:1310
- 会进行列skip
- 会进行rowGroup的skip
- 非combine方式
- map数:1747
- 会进行列skip
- 非combine方式+条件下推
- map数:43
- 会进行列skip
- 会进行rowGroup的skip:
- sql2
select log_date,log_time,hh24,area_country,area_prov,area_city from tbl_orc_128M where dt='20161109' and hh24='19' limit 100;
- combine方式
- map数:1310
- 会进行列skip
- combine方式+条件下推
- map数:1310
- 会进行列skip
- 会进行rowGroup的skip
- 非combine方式
- map数:1747
- 会进行列skip
- 非combine方式+条件下推
- map数:1747
- 会进行列skip
- 会进行rowGroup的skip:
- sql1
stripeSize为64M
- sql1
select log_date,log_time,hh24,area_country,area_prov,area_city from tbl_orc_64M where dt='20161109' and hh24='19' and
channel_id=179569143limit 100;
- combine方式
- map数:1448
- 会进行列skip
- combine方式+条件下推
- map数:1448
- 会进行列skip
- 会进行rowGroup的skip
- 非combine方式
- map数:3494
- 会进行列skip
- 非combine方式+条件下推
- map数:0
- sql2
select log_date,log_time,hh24,area_country,area_prov,area_city from tbl_orc_64M where dt='20161109' and hh24='19' limit 100;
- combine方式
- map数:1448
- 会进行列skip
- combine方式+条件下推
- map数:1448
- 会进行列skip
- 会进行rowGroup的skip
- 非combine方式
- map数:3494
- 会进行列skip
- 非combine方式+条件下推
- map数:3494
- 会进行列skip
- 会进行rowGroup的skip:
- sql1
参考文档
orcFile split和读数据原理总结(hive0.13)的更多相关文章
- ubuntu12.04+hadoop2.2.0+zookeeper3.4.5+hbase0.96.2+hive0.13.1伪分布式环境部署
目录: 一.hadoop2.2.0.zookeeper3.4.5.hbase0.96.2.hive0.13.1都是什么? 二.这些软件在哪里下载? 三.如何安装 1.安装JDK 2.用parallel ...
- 不在折腾---hive-0.13.1-bin
Hive只在一个节点安装即可 上传tar包 解压 > tar zxvf hive-0.13.1-bin.tar.gz 配置mysql * 检查MySQL是否安装:rpm -qa | grep m ...
- Nginx日志导入到Hive0.13.1,同步Hbase0.96.2,设置RowKey为autoincrement(ID自增长)
---------------------------------------- 博文作者:迦壹 博客地址:Nginx日志导入到Hive,同步Hbase,设置RowKey为autoincrement( ...
- 在Hadoop-2.2.0集群上安装 Hive-0.13.1 with MySQL
fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3872872.html 软件环境 操作系统:Ubuntu14.04 JDK版本:jdk1 ...
- 在Eclipse上操作Hive-0.13.1-JDBC端口
fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3877740.html 完成<在Hadoop-2.2.0集群上安装 Hive-0. ...
- hive0.13.1配置hwi
1 寻找hive-hwi-*.war文件 不清楚什么原因在hive0.13.1版本中的lib文件夹下没有hive-hwi-0.13.0.war,也就是没有*.war的文件. 所以用hive 0.12. ...
- Hadoop-2.2.0 + Hbase-0.96.2 + Hive-0.13.1(转)
From:http://www.itnose.net/detail/6065872.html # 需要软件 Hadoop-2.2.0(目前Apache官网最新的Stable版本) Hbase-0.96 ...
- Hive0.13.1介绍及安装部署
一.简介 hive由Facebook开源用于解决海量结构化日志的数据统计.hive是基于Hadoop的一个数据仓库工具,是基于Hadoop之上的,文件是存储在HDFS上的,底层运行的是MR程序.hiv ...
- hive0.13.1安装-mysql server作为hive的metastore
hive0.13.1在hadoop2.4.1伪分布式部署上安装过程 环境:redhat enterprice 6.5 +hadoop2.4.1+hive0.13.1+mysql单节点伪分布式部署 相关 ...
随机推荐
- 在.net中怎么解析json串 [Error reading JObject from JsonReader. Current JsonReader item is not an obj]
编辑时间:2017-05-10,增加一种转化list的方法 一.以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JO ...
- python之isinstance内建函数
语句: isinstance(object,type) 作用: 来判断一个对象是否是一个已知的类型. 解释: 其第一个参数(object)为对象,第二个参数(type)为类型名(int...)或类型名 ...
- java安全管理器SecurityManager介绍
java安全管理器类SecurityManager简单剖析: javadoc介绍: SecurityManager是一个允许应用实现一种安全策略的类.它允许一个应用去明确,在执行一个可能安全或者敏感的 ...
- redux 入门
背景: 在react中使用redux 重点:不要滥用redux,如果你的页面非常简单,没有 那么多的互动,那么就不要使用redux,反而会增加项目的复杂性. 如果你有以下情况,则可以考虑使用redux ...
- intellij error updating changes svn解决办法
乌龟检出的svn版本为1.8,而1.8在IntelliJ 上跑起来貌似有问题, 经过多次尝试,当Format改为1.7后,问题被解决.
- canvas-7globleCompositeOperation.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [工具配置]使用requirejs模块化开发多页面一个入口js的使用方式
描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...
- 照葫芦画瓢系列之Java --- eclipse下使用maven创建Struts 2项目
一.创建Maven项目 http://www.cnblogs.com/zhanqun/p/8425571.html 二.添加struts2核心依赖包以及其他依赖项 打开pom.xm配置界面 点击Add ...
- Android为TV端助力 handler传递消息机制
当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...
- Bitmap压缩图片
代码实现: public class MainActivity extends AppCompatActivity { private ImageView img; @Override prot ...