• Hive文件存储格式和数据压缩


    Hive 存储格式和压缩算法

    在实际的项目开发当中,hive表存储格式一般选择:ORC或PARQUET,压缩算法一般选择 Zlib 和 SNAPPY



    存储格式分类


    逻辑表中的数据,最终需要落到磁盘上,以文件的形式存储,有两种常见的存储形式:行式存储列式存储

    (C:\Users\49692\AppData\Roaming\Typora\typora-user-images\1667196618250.png)]



    行式存储

    优点:
    1、相关的数据保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录
    2、方便进行insert或update操作
    
    缺点:
    1、如果仅需要查询几列数据,它会把整行数据都读取出来,不能跳过不必要的列读取
    2、由于每一行中列的数据类型不一致,导致不容易获得一个极高的压缩比(空间利用率不高)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    textfile
    • 行式存储
    • 创建表时的默认格式
    • 数据不做压缩,磁盘开销大,数据解析开销大
    • 可以直接使用load就加载数据,不需要走MapReduce(因为不需要压缩)

    sequencefile
    • 行式存储

    • 适合用于将小文件合并起来,可以获得更高效率的存储和计算



    列式存储

    优点:
    1、查询时,只有涉及到的列才会被查询,可以跳过不必要的列查询
    2、高效的压缩率,不仅节省储存空间也节省计算内存和CPU
    3、任何列都可以作为索引
    
    缺点:
    1、不适合进行insert或update操作
    2、不适合扫描小量的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8


    ORC

    全称为Optimized Row Columnar,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度

    它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储

    ORC文件是以二进制方式存储的,所以不可以直接读取,ORC文件也是自解析的

    优点:

    • 有多种文件压缩方式,并且有着很高的压缩比
    • 文件是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅节省HDFS存储资源,查询任务的输入数据量减少,使用的MapTask也就减少了
    • 可以支持复杂的数据结构(比如Map等)

    ORC结构(了解即可)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Htcm1B5a-1667197395753)(C:\Users\49692\AppData\Roaming\Typora\typora-user-images\1667196052668.png)]

    一个ORC文件可以分为若干个Stripe,一个stripe可以分为三个部分:

    • Index Data:一个轻量级的index,默认是每隔1W行做一个索引(目录)。这里做的索引只是记录某行的各字段在Row Data中的offset
    • Row Data:存储具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream来存储。
    • Strip Footer:存储各个stripe的元数据信息

    每个ORC文件文件有一个File Footer,存储的是每个Stripe的行数以及Stripe中每个Column的数据类型信息等;

    每个ORC文件文件的尾部是一个Post Script,这里面记录了整个文件的压缩类型以及File Footer的长度信息等。

    在读取文件时,会seek到文件尾部读Post Script,从里面解析到File Footer长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读



    parquet

    面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目

    parquet文件是以二进制方式存储的,所以是不可以直接读取。文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的

    通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度



    ORC和Parquet区别
    • ORC存储格式比Parquet压缩率更好
    • Parquet格式对嵌套列的支持比较友好,可以只查询某个列中的嵌套子列,而不用查询其他的子列。
    • ORC支持ACID事务,而Parquet目前还不支持。


    压缩算法


    数据压缩概念

    优点:
    1、减少存储磁盘空间,降低单节点的磁盘IO
    2、由于压缩后的数据占用的带宽更少,因此可以加快数据在Hadoop集群流动的速度,减少网络传输带宽
    
    缺点:
    1、需要花费额外的时间/CPU做压缩和解压缩计算
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    问题:MR(Hive的底层是MR)哪些阶段可以进行压缩操作

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L5OYccte-1667197395754)(C:\Users\49692\AppData\Roaming\Typora\typora-user-images\1667196632749.png)]

    1. 需要分析处理的数据在进入map前可以压缩,然后解压处理
    2. map处理完成后的输出可以压缩,这样可以减少网络I/O(reduce通常和map不在同一节点上)
    3. reduce拷贝压缩的数据后进行解压,处理完成后可以压缩存储在hdfs上,以减少磁盘占用量


    压缩算法分类以及速度对比

    压缩格式压缩格式所在的类
    Zliborg.apache.hadoop.io.compress.DefaultCodec
    Gziporg.apache.hadoop.io.compress.GzipCodec
    Bzip2org.apache.hadoop.io.compress.BZip2Codec
    Lzocom.hadoop.compression.lzo.LzoCodec
    Lz4org.apache.hadoop.io.compress.Lz4Codec
    Snappyorg.apache.hadoop.io.compress.SnappyCodec

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAoAtlKu-1667197395754)(C:\Users\49692\AppData\Roaming\Typora\typora-user-images\1667196710403.png)]


    问题:Zlib和Snappy两种压缩算法的对比?

    Zlib 压缩率 高, 解压速度
    Snappy则与Zlib相反,按照业务情况来选择使用

  • 相关阅读:
    正点原子嵌入式linux驱动开发——Linux并发与竞争
    人力资源管理系统如何促进业务增长
    Java.lang.Character类中codePointBefore(char[ ] a, int index)方法具有什么功能呢?
    含稀土铕双功能荧光磁性纳米粒子/包裹磁性稀土荧光复合物纳米微球的性能与表征
    MYSQL函数
    【Javascript】在对象的方法里访问自己的属性
    32、Java高级特性——日期操作类、Date类、SimpleDateFormat类、Calendar类
    Makefile与CMake学习笔记
    Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)
    《乔布斯传》英文原著重点词汇笔记(七)【 chapter five】
  • 原文地址:https://blog.csdn.net/weixin_42322454/article/details/127614798