Hive的存储格式和压缩算法的特点和选择

2024-06-12 08:20

本文主要是介绍Hive的存储格式和压缩算法的特点和选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、数据存储格式:

    ①TEXTFILE


    HIVE 中默认的存储格式;

    一般使用在数据贴源层(ODS 或 STG) ,针对需要使用脚本 LOAD 加载数据到 HIVE 数仓表中的情况;需要把表里数据导出或直接可以查看等场景,作为BI供数
        易读性要比 ORC 高很多;

    数据存储时不压缩,因此磁盘的开销和数据解析开销比较大;

    TEXTFILE 可以结合 Gzip、Bzip2 等压缩算法使用(系统自动检查,执行查询时自动解压),但使用这种方式,HIVE 不会对数据进行切分,从而无法对数据进行并行操作;

    在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比 SequenceFile 高几十倍;

    可以直接通过 LOAD 的方式从文件中加载数据到 HIVE 表中;

当用户的数据文件格式不能被当前 HIVE 所识别的时候,可以自定义文件格式
    通过实现 inputformat 和 outputformat 来自定义输入输出格式

    ②SEQUENCE FILE


    HADOOP API 提供的一种二进制文件,以 key-value 的形式序列化到文件中;

    支持切片;

    数据加载导入方式可以通过INSERT方式加载数据;


    ③PARQUET


    面向列的二进制文件格式,所以是不可以直接读取的;

    文件中包括该文件的数据和元数据,因此 Parquet 格式文件是自解析的;

    使用场景在 Impala 和 Hive 共享数据和元数据的场景;

    ④ORCFILE


    运用 ORC 可以提高 HIVE 的读、写、计算的性能,主要使用在 DWD、DWB、DWS 层

    数据按行分块,每块按照列存储;

    压缩快、快速列存取;

    效率比 rcfile 高,是 rcfile 的改良版本;

    不考虑 ORC 的场景:需要通过 LOAD 方式加载数据到表里;需要把表里数据导出或直接可以查看等场景,这两种场景更适合使用 TEXTFILE ,易读性要比 ORC 高很多;

    ORC 文件格式可以使用 HIVE 自带的命令 concatenate 快速合并小文件

    

在 Hive 中使用 ORC 文件格式时,是自动实现文件的分割(splitting)。这是因为 ORC 文件格式是为优化大规模数据处理而设计的,其中包括了有效的数据分割机制以支持并行处理。以下是一些关于 ORC 文件分割的关键点:

1. 块与条带(Stripes)

ORC 文件将数据分成多个条带(Stripes),每个条带都是自包含的数据集合,包括其自己的索引、数据和行索引。这些条带是分割数据的物理单位,可以独立于其他条带处理,支持并行读取和查询。

2. 文件的索引

每个 ORC 文件包含一个轻量级的文件尾部索引,其中包含有关文件中数据的统计信息和条带位置的详细信息。这使得查询引擎能够有效地确定哪些条带需要读取以满足特定的查询条件,从而实现快速的数据访问。

3. 分割与并行处理

当 Hive 执行查询时,它会根据数据的存储位置和条带信息自动对 ORC 文件进行分割。每个数据分割可以分配给不同的处理节点进行并行处理。这种分割机制允许 Hive 在多个处理节点上有效地分配工作,从而优化查询性能和减少数据处理时间。

4. 设置条带大小和行索引间隔

虽然分割机制自动运作,但你可以通过设置条带大小和行索引间隔来优化性能。例如,可以在创建表时通过以下方式设置条带大小和行索引间隔:

CREATE TABLE my_table (column1 INT,column2 STRING
)
STORED AS ORC
TBLPROPERTIES ("orc.stripe.size"="67108864",       -- 设置条带大小为64MB"orc.row.index.stride"="10000",      -- 设置行索引间隔"orc.compress"="SNAPPY"             -- 设置压缩算法为SNAPPY
);

HIVE 中常用的存储格式对比
存储格式是否默认存储方式支持压缩算法
TextFile行式存储Gzip、Bzip2
SequenceFile行式存储NONE、RECORD、BLOCK
Parquet列式存储Uncompress(默认)、Snappy、Gzip、Lzo
RCFile数据按行分块,每块按列存储-
(RCFile的优化)ORCFile数据按行分块,每块按列存储NONE、ZLIB(默认)、SNAPPY

2、压缩算法

文件存储格式不同对应不同的压缩算法,从而带来不同的性能,我们根据实际使用考虑压缩算法的性能,
主要通过以下 3 个指标:

① 压缩比
    压缩比越高,压缩后文件越小,所以压缩比越高越好;
    压缩比越高,存储磁盘空间占用越小,可以降低单节点的磁盘IO,同时可以减少占用的带宽;

② 压缩时间
    越快越好,加快数据在Hadoop集群流动的速度和磁盘 IO 的速度

③ 压缩后的文件是否可以再分割
    可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的 并行化

压缩算法对比
压缩方式压缩比压缩速度解压缩速度是否可分割
gzip13.4%21 MB/s118 MB/s否,无法并行处理
bzip213.2%2.4MB/s9.5MB/s是,并行处理
LZO20.5%135 MB/s410 MB/s是,并行处理
snappy22.2%172 MB/s409 MB/s否,无法并行处理

3、使用场景

ODS 贴源层 : TextFile + Gzip
DWD   : ORC + SNAPPY
DWS   : ORC + SNAPPY

① 数据量较大
如果单个文件比较大,可以使用 Parquet 存储,lzo 压缩,可以避免由于读取不可分割大文件引发的数据倾斜

② 计算逻辑比较少
使用 ORC 存储 + ZLIB 压缩,可以尽量减少占用存储空间

③ 计算逻辑比较多
使用 ORC 存储 + SNAPPY 压缩,可以提高读写速度,从而提高整体计算性能

在 Hive 中,对于计算逻辑比较多且要求计算速度达到最佳状态的场景,选择 ORC 存储格式是明智的,因为 ORC 格式具备高效的列存储和强大的压缩功能,能够显著提高查询性能。
然而,在压缩算法的选择上,虽然 SNAPPY 和 LZO 各有优劣,但选择的依据需要综合考虑多个因素。

3.1 ORC + SNAPPY 的优势

快速压缩和解压缩:
    SNAPPY 以其快速的压缩和解压缩速度著称。对于频繁的读写操作,快速的解压缩可以减少查询延迟,从而提高整体计算性能。

低 CPU 开销:
    SNAPPY 的压缩和解压缩操作对 CPU 资源的消耗较低。对于计算密集型任务,低 CPU 开销有助于将更多的 CPU 资源用于计算本身,而不是浪费在压缩和解压缩过程中。
    适合查询优化:

ORC 文件格式支持谓词下推(predicate pushdown)、列裁剪(column pruning)和其他查询优化技术。SNAPPY 的低延迟特性使得这些优化技术能够更快地生效,从而提高查询性能。

在 ORC 文件格式中使用 SNAPPY 压缩时,压缩是在分割(条带创建)之后进行的。这是 ORC 文件结构处理数据的一般流程:

  1. 数据组织与条带创建:首先,数据被组织成多个条带(Stripes)。每个条带包含一部分数据,通常是几千到几万行,具体取决于配置的条带大小和数据的实际特性。

  2. 列式存储:在 ORC 文件中,数据按列而非按行存储。这意味着每个条带中的数据会按列组织,这有助于提高数据访问的效率并优化查询性能。

  3. 压缩:数据在条带级别被组织好之后,每个条带的数据会根据配置的压缩算法进行压缩。如果选择了 SNAPPY 压缩,每个条带的数据会被 SNAPPY 压缩算法压缩。压缩是独立于每个条带进行的,这允许在读取数据时可以并行解压缩不同的条带。

  4. 索引和元数据写入:ORC 文件还会包含每个条带的索引信息和整个文件的元数据,包括每个列的统计信息,如最大值、最小值等。这些信息也存储在文件的尾部,并可以用来优化读取操作,因为它们可以帮助快速确定是否需要读取某个条带来满足查询条件。

因此,SNAPPY 压缩在 ORC 文件的条带创建之后执行,这样做的好处是可以保持压缩数据的独立性,支持高效的并行处理。每个条带压缩后仍可独立解压,这有利于分布式处理和快速数据访问。

3.2 ORC + LZO 的情况

并行处理:
    LZO 支持并行处理和分片(splitting),这在写入大规模数据时是一个优势,因为它能够充分利用多核 CPU 进行并行压缩,缩短写入时间。

压缩率:
    LZO 的压缩率可能会比 SNAPPY 高一些,这意味着在相同的数据量下,LZO 压缩后的文件会更小,可以节省存储空间和 I/O 开销。

综合考虑


    尽管 LZO 支持并行处理和分片,适合大规模数据的写入,但在大多数计算密集型场景下,查询性能的提升往往比写入性能更为重要。
    SNAPPY 在读取时的快速解压缩和低 CPU 开销,使得它在读取和计算过程中表现更优。这些优势在以下方面尤为明显:

查询性能:SNAPPY 的快速解压缩速度有助于加快数据加载和处理,特别是对于复杂查询和计算逻辑多的场景。
CPU 利用率:低 CPU 开销意味着更多的计算资源可以用于执行实际的查询和分析任务,而不是消耗在解压缩过程中。
实际表现:实际测试和基准测试往往显示,对于计算密集型任务,SNAPPY 的整体表现(包括读取和计算阶段)优于 LZO。
因此,在大多数需要高计算性能的 Hive 使用场景中,推荐使用 ORC + SNAPPY 作为存储和压缩组合,尽管 SNAPPY 不支持并行处理,但当与 ORC 文件格式配合使用时,实际情况可能有所不同。
        有几个关键因素说明为什么在某些情况下使用 ORC 存储格式配合 SNAPPY 压缩依然能实现高效的计算速度:

1. ORC 文件的结构特性
ORC 文件是一种高效的列式存储格式,它自带索引和分区数据的功能。即使在使用 SNAPPY 压缩时,ORC 文件格式还是可以支持有效的数据拆分(split)和并行处理。ORC 文件将数据存储在多个块中,每个块可以独立压缩和解压缩。这意味着在处理时,每个数据块可以被独立加载和解码,允许并行处理。

2. SNAPPY 压缩的性能优势
SNAPPY 压缩提供了快速的压缩和解压速度,这是其设计的主要目标。虽然它不支持压缩数据的拆分,但其快速的解压速度对于计算密集型任务来说非常重要,因为它可以快速地将数据送入处理流程。对于需要频繁读取的应用,这种快速的解压速度可以显著提高数据处理的效率。

3. 计算和 I/O 开销的平衡
在使用 ORC 和 SNAPPY 的组合时,可以实现对计算资源和 I/O 开销的良好平衡。由于 SNAPPY 提供了快速的解压缩,它可以减少从磁盘读取数据所需的时间,从而允许更多的资源被用于执行计算逻辑。这种快速的数据流转对于计算密集型任务尤其重要。

4. 总体系统性能
在选择压缩算法时,还需要考虑到整个数据平台的架构和性能。虽然 LZO 提供了并行压缩的能力,但其解压速度通常不如 SNAPPY 快。此外,如果大部分时间都在进行数据读取和计算而不是写入,那么解压缩性能将更为关键。

结论
因此,尽管 SNAPPY 不支持拆分压缩数据,但由于 ORC 的结构使得数据可以在块级别进行并行处理,再加上 SNAPPY 的高解压速度,使得这种组合在很多场景下仍然可以实现非常高效的查询和计算性能。当然,这种选择也应基于具体的使用场景和性能测试来确定,以确保满足特定的性能和成本效益需求。

这篇关于Hive的存储格式和压缩算法的特点和选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053688

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A