http://blog.csdn.net/zhaorongsheng/article/details/72903431

官网关于orcfile的介绍

背景

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
  • 开启条件及优缺点 
    这里只讨论非combine方式的split个读取方式。

    • 触发条件:

      • set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;(必选)
      • set hive.optimize.index.filter=true;(可选) 
        • 是否条件下推到TS,进行条件过滤,建议开启
      • set hive.exec.orc.zerocopy=true;(可选) 
        • 读取orc文件,是否使用0拷贝,建议开启
    • 上述3个配置都开启情况 
      • 优点:

        • 做split时:

          • 可以将不符合条件的stripe提前过滤,减少map个数
        • 读取时: 
          • 可以直接跳过不符合条件的rowGroup,无需读取多余的数据
      • 缺点: 
        • 不会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掉,减少读取的数据量
  • 优缺点

    • 优点

      • 可以提前过滤无需的stripe,减少split个数
      • 读取时,可以过滤不满足条件的rowGroup,减少读取数
    • 缺点 
      • 做split时,stripe不会合并,有可能导致split数比combine方式更多
      • 也有可能数据量少的split数比数据量多的split数多

测试结果

  1. 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' andchannel_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:
  2. 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' andchannel_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:

参考文档

orc和parquet比较

orcFile split和读数据原理总结(hive0.13)的更多相关文章

  1. 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 ...

  2. 不在折腾---hive-0.13.1-bin

    Hive只在一个节点安装即可 上传tar包 解压 > tar zxvf hive-0.13.1-bin.tar.gz 配置mysql * 检查MySQL是否安装:rpm -qa | grep m ...

  3. Nginx日志导入到Hive0.13.1,同步Hbase0.96.2,设置RowKey为autoincrement(ID自增长)

    ---------------------------------------- 博文作者:迦壹 博客地址:Nginx日志导入到Hive,同步Hbase,设置RowKey为autoincrement( ...

  4. 在Hadoop-2.2.0集群上安装 Hive-0.13.1 with MySQL

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3872872.html 软件环境 操作系统:Ubuntu14.04 JDK版本:jdk1 ...

  5. 在Eclipse上操作Hive-0.13.1-JDBC端口

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3877740.html 完成<在Hadoop-2.2.0集群上安装 Hive-0. ...

  6. hive0.13.1配置hwi

    1 寻找hive-hwi-*.war文件 不清楚什么原因在hive0.13.1版本中的lib文件夹下没有hive-hwi-0.13.0.war,也就是没有*.war的文件. 所以用hive 0.12. ...

  7. 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 ...

  8. Hive0.13.1介绍及安装部署

    一.简介 hive由Facebook开源用于解决海量结构化日志的数据统计.hive是基于Hadoop的一个数据仓库工具,是基于Hadoop之上的,文件是存储在HDFS上的,底层运行的是MR程序.hiv ...

  9. hive0.13.1安装-mysql server作为hive的metastore

    hive0.13.1在hadoop2.4.1伪分布式部署上安装过程 环境:redhat enterprice 6.5 +hadoop2.4.1+hive0.13.1+mysql单节点伪分布式部署 相关 ...

随机推荐

  1. [转]angular使用Md5加密

    本文转自:https://www.cnblogs.com/waitingbar/p/7527928.html 一.现象 用户登录时需要记住密码的功能,在前端需要对密码进行加密处理,增加安全性 二解决 ...

  2. 第一册:lesson fifty one.

    原文: A pleasant climate. A:Where do you come frome? B:I come from Greece. A:What's the climate like i ...

  3. JavaScript匿名函数入门。

    1.第一种匿名函数的使用:简单的调用 var f=function(){ return 'Hello'; };   //匿名函数没法调用,只能赋值,所以作为赋值语句后面得加分号 var result= ...

  4. 从零开始学安全(十二)●建立自己的DNS服务器

    我们的环境windows server 2012   虚拟机 打开服务器的添加角色和向导功能 添加DNF服务器安装 点击 在正向查找区域 反键新建区域 这里我一般输入一级域名 这是输入baidu.co ...

  5. 菜鸟入门【ASP.NET Core】14:MVC开发:UI、 EF + Identity实现、注册实现、登陆实现

    前言 之前我们进行了MVC的web页面的Cookie-based认证实现,接下来的开发我们要基于之前的MvcCookieAuthSample项目做修改. MvcCookieAuthSample项目地址 ...

  6. [日常]nginx与网络事件模型

    Nginx 的特点: 1.处理静态文件 2.反向代理加速 3.fastCGI,简单的负载均衡和容错 4.模块化的结构 5.分阶段资源分配技术,使得它的 CPU 与内存占用率非常低,保持 10,000 ...

  7. springMVC_10拦截器

    一,简介 拦截器概念和struts概念一致 实现拦截器 实现HandlerInterceptor接口 配置拦截器 <mvc:interceptors> <mvc:intercepto ...

  8. mybatis整合springboot 以及需要注意的细节

    具体怎么整合的网上有很多优秀的博客介绍,这里就直接引用一篇个人觉得非常详细的教程: https://blog.csdn.net/winter_chen001/article/details/77249 ...

  9. 提取Chrome插件为crx文件

    在Chrome浏览器输入 chrome://extensions/,点开右上角开发者模式 记录上图中的ID:gidgenkbbabolejbgbpnhbimgjbffefm 在资源管理器中找到Chro ...

  10. python面向对象学习(一)基本概念

    目录 1. 面向对象基本概念 1.1 过程和函数 1.2 面相过程 和 面相对象 基本概念 2. 类和对象的概念 1.1 类 1.3 对象 3. 类和对象的关系 4. 类的设计 大驼峰命名法 4.1 ...