【004hive基础】hive的文件存储格式与压缩

news2024/10/5 14:08:54

文章目录

  • 一.hive的行式存储与列式存储
  • 二. 存储格式
    • 1. TEXTFILE
    • 2. ORC格式
    • 3. PARQUET格式 ing
  • 三. Hive压缩格式
    • 1. mr支持的压缩格式:
    • 2. hive配置压缩的方式:
      • 2.1. 开启map端的压缩方式:
      • 2.2.开启reduce端的压缩方式:
  • 四. hive中存储格式和压缩相结合
  • 五. hive主流存储格式性能对比
    • 1. 压缩比比较
    • 2. 存储文件的查询效率测试

一.hive的行式存储与列式存储

HIve的文件存储格式常见的有四种:textfile 、sequencefile、orc、parquet ,前面两种是行式存储,后面两种是列式存储。

hive的存储格式指表的数据是如何在HDFS上组织排列的。

 
如下图,箭头的方向代表了数据是如何进行(写入)组织排列的。

在这里插入图片描述
 

我们讨论一下行、列存储在读写上的特点:

行存储在数据写入和修改上的优势
写入:

行存储的写入是一次完成的,如果这种写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,可以保证数据的完整性。
 
列式存储写入需要把一行记录拆分成单列保存, 写入次数明显比行存储多(因为磁头调度次数多,而磁头调度是需要时间的,一般在 1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际消耗更大。

修改:

数据修改实际上也是一次写入过程,不同的是,数据修改是对磁盘上的记录做删除标记。 行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。

因为行式存储写入和修改都是一次完成,相比列式存储需要将一行记录进行拆分,行式存储的优势还是比较明显的。
 
 
列式存储在数据读取和解析、分析数据上具有优势
数据读取方面:

  • 行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。
  • 列存储 每次读取的数据是集合的一段或者全部,不存在冗余性问题。

数据解析方面:

  • 列式存储中的每一列数据类型是相同的,不存在二义性问题,例如,某列类型为整型 int,那么它的数据集合一定是整型数据,这种情况使数据解析变得十分容易。
  • 相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗 CPU,增加了解析的时间。

 
所以列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域比较重要。

一般来说,一个 OLAP 类型的查询可能需要访问几百万或者几十亿行的数据,但是OLAP 分析时只是获取少数的列,对于这种场景列式数据库只需要读取对应的列即可,因此这种场景更适合列式数据库,可以大大提高 OLAP 数据分析的效率。

 
 

二. 存储格式

1. TEXTFILE

hive默认存储格式,数据不做压缩,磁盘开销大,数据解析开销大。

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

 

2. ORC格式

Orc (Optimized Row Columnar)是hive 0.11版里引入的新的存储格式。

可以看到每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于RowGroup概念,不过大小由4MB->250MB,这样能提升顺序读的吞吐率。

在这里插入图片描述
每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer:

  • Index Data:默认每隔1W行做一个索引。这里的索引只是记录某行的各字段在Row Data中的offset。
  • Row Data:存储具体数据,先取部分行(1万行?),然后对这些行按列进行存储。每个列都进行了编码,分成多个Stream来存储。
  • Stripe Footer:存储stripe的元数据信息:
    • File Footer,存储Stripe的行数,每个Column的数据类型信息等;
    • PostScript,记录了Stripe的压缩类型以及FileFooter的长度信息等。

 
数据读取逻辑:

读取文件时,

  • 会先seek到文件尾部读PostScript,解析到File Footer长度
  • 再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。

 

3. PARQUET格式 ing

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

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

Parquet文件的格式如下图所示:

在这里插入图片描述
上图展示了一个Parquet文件的内容,一个文件中可以存储多个行组,

  • 文件的首位是该文件的Magic Code,用于校验它是否是一个Parquet文件
  • Footer length记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量
  • 元数据:包括行组的元数据信息和该文件存储数据的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据。
  • 在Parquet中,有三种类型的页:数据页、字典页和索引页。
    • 数据页存储行组中该列的值;
    • 字典页存储该列值的编码字典,每一个列块中最多包含一个字典页
    • 索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页。

 
 

三. Hive压缩格式

在实际工作当中,hive当中处理的数据,一般都需要经过压缩,使用压缩来节省我们的MR处理的网络带宽。

1. mr支持的压缩格式:

在这里插入图片描述
 
hadoop支持的解压缩的类:
在这里插入图片描述

 
压缩性能的比较:
在这里插入图片描述

 
hadoop需要配置的压缩参数:

在这里插入图片描述

 

2. hive配置压缩的方式:

2.1. 开启map端的压缩方式:

1.1)开启hive中间传输数据压缩功能
 hive (default)>set hive.exec.compress.intermediate=true;
1.2)开启mapreduce中map输出压缩功能
 hive (default)>set mapreduce.map.output.compress=true;
1.3)设置mapreduce中map输出数据的压缩方式
 hive (default)>set mapreduce.map.output.compress.codec
                  = org.apache.hadoop.io.compress.SnappyCodec;
1.4)执行查询语句
 select count(1) from score;

2.2.开启reduce端的压缩方式:

1)开启hive最终输出数据压缩功能
 hive (default)>set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩
 hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式
 hive (default)> set mapreduce.output.fileoutputformat.compress.codec 
                       = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩
 hive (default)>set mapreduce.output.fileoutputformat.compress.type
                       =BLOCK;
5)测试一下输出结果是否是压缩文件
 insert overwrite local directory '/export/servers/snappy' 
       select * from score distribute by s_id sort by s_id desc;

 
 

四. hive中存储格式和压缩相结合

以ORC举例,相关配置参数:
在这里插入图片描述

创建一个非压缩的ORC存储方式:

1)建表语句
    create table log_orc_none(
    track_time string,
    url string,
    session_id string
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS orc tblproperties ("orc.compress"="NONE");
2)插入数据
 insert into table log_orc_none select * from log_text ;
3)查看插入后数据
 dfs -du -h /user/hive/warehouse/myhive.db/log_orc_none;
 结果显示:
 7.7 M  /user/hive/warehouse/log_orc_none/123456_0

创建一个SNAPPY压缩的ORC存储方式:

1)建表语句
    create table log_orc_snappy(
    track_time string,
    url string,
    session_id string
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS orc tblproperties ("orc.compress"="SNAPPY");
2)插入数据
 insert into table log_orc_snappy select * from log_text ;
3)查看插入后数据
 dfs -du -h /user/hive/warehouse/myhive.db/log_orc_snappy ;
 结果显示: 
 3.8 M  /user/hive/warehouse/log_orc_snappy/123456_0
 
4)实际上:默认orc存储文件默认采用ZLIB压缩。比snappy压缩率还高。

存储方式和压缩总结:

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。 压缩方式一般选择snappy。

 
 

五. hive主流存储格式性能对比

从存储文件的压缩比和查询速度两个角度对比

1. 压缩比比较

1)创建表,存储数据格式为TEXTFILE、ORC、Parquet
    create table log_text (
    track_time string,
    url string,
    session_id string,
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS TEXTFILE  ;2)向表中加载数据
 load data local inpath '/export/servers/hivedatas/log.data' into table log_text ;3)查看表中数据大小,大小为18.1M
 dfs -du -h /user/hive/warehouse/myhive.db/log_text;

...
textfile:结果显示: 
 18.1 M  /user/hive/warehouse/log_text/log.data


ORC 结果显示:
 2.8 M  /user/hive/warehouse/log_orc/123456_0

Parquet结果显示:
13.1 M  /user/hive/warehouse/log_parquet/123456_0

数据压缩比结论: ORC > Parquet > textFile

 

2. 存储文件的查询效率测试

1)textfile
hive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 seconds, Fetched: 1 row(s)  

2)orc
hive (default)> select count(*) from log_orc;
_c0
100000
Time taken: 20.867 seconds, Fetched: 1 row(s) 


3)parquet
hive (default)> select count(*) from log_parquet; 
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)

存储文件的查询效率比较: ORC > TextFile > Parquet

 
 

参考:
https://cloud.tencent.com/developer/article/1880494

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/553278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分立元件】MOSFET的工作原理

MOSFET适用于瓦至十数千瓦的中小功率,特别适用于电源管理行业的入门学习。IGBT和MOSFET使用相似,但属于中大功率场合才使用,如果想使用好IGBT,也要先学习MOSFET。 对于MOSFET的学习我们需要学习它的工作原理,知道MOSFET的主要参数,MOSFET的开关过程以及如何驱动MOSFET,应…

技术最强,干活最多,但不会来事,又不是嫡系,得不到领导重用,这种情况去创业公司会不会好点?...

能力强但情商不高,许多程序员都有这样的问题,这种情况怎么办? 一位程序员问: 组内技术能力最强,干活最多,解决不了的问题就会派他上,领导嘴上认可,但因为他不会来事,又不…

一文搞定十大排序算法

文章目录 概述冒泡排序 (Bubble Sort)算法步骤图解算法代码实现算法分析 选择排序 (Selection Sort)算法步骤算法图解代码实现算法分析 插入排序(Insertion Sort)算法步骤图解算法代码实现算法分析 希尔排序 (Shell Sort)算法步骤图解算法代码实现算法分析 归并排序 (Merge Sor…

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多…

系统集成实验模拟总公司和分公司之间通信(涉及mpls vxn,链路聚合,nat,vlan划分,单臂路由,dhcp....)

目录 一 需求描述 二 需求分析 三 实验拓扑 四 实验配置 4.1 总公司 4.1.1 vlan间通信 4.1.2 dhcp自动分配ip 配置地址池 接口开启dhcp 4.1.3 链路聚合 4.1.4 ospf实现内网通信 4.2 分公司 4.2.1 单臂路由 4.2.2 dhcp自动获取ip 4.2.3 ospf实现内网通信 4.3 mp…

判断传入数据是否为列表、数组、数据框等数据结构pd.api.types.is_list_like()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断传入数据是否为 列表、数组、数据框等数据结构 pd.api.types.is_list_like() 选择题 下列说法错误的是? import pandas as pd import numpy as np print("【执行】pd.api.ty…

基于html+css的图展示85

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

深度学习之使用Keras构建分类问题的MLP神经网络——用于糖尿病预测

大家好,我是带我去滑雪! Keras 是一个用于构建和训练深度学习模型的高级 API,它基于 Python编写,并能够运行于 TensorFlow, CNTK, 或者 Theano 等深度学习框架之上。Keras简化了深度神经网络的构建流程,让用户能够更加…

云计算基础——云计算主流解决方案

原数据:描述数据的数据,不可分割。 7.1 Google云计算技术 7.1.1 GCP Google 将这些技术组合在一起,运用这些从自身业务需求出发,逐步发展起来的一系列云计算技术和工具搭建起了其面向商业的云计算解决方案Google Cloud Platform (…

【数据湖架构】Azure Data Lake数据湖指南

数据湖漫游指南 文件大小和文件数文件格式分区方案使用查询加速我如何管理对我的数据的访问?我选择什么数据格式?如何管理我的数据湖成本?如何监控我的数据湖?ADLS Gen2 何时是您数据湖的正确选择?设计数据湖的关键考虑…

Vue.observable的理解

一、Observable 是什么 Observable 翻译过来我们可以理解成可观察的 先来看其在Vue中的定义 Vue.observable,让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发…

PDF.js实现按需分片加载pdf文件-包含前后端开发源码和详细开发教程

PDF.js实现按需加载pdf文件 说明前言前端项目分片加载的效果前端项目结构前端核心代码项目运行与访问 后端项目项目结构核心代码实现注意事项 项目源码 说明 本文主要是介绍pdf.js的前后端项目的实现,包含可直接运行的源码。由于本人偏向于后端开发,因此…

Redis设计逻辑及生产部署问题整理

数据结构 redis数据结构包括:简单动态字符串SDS、链表、字典、跳跃表、整数组合、压缩列表。 SDS:在增加/减少字符串时不会频繁进行内存充分配,采用了空间预分配和惰性空间释放两种优化策略。 链表:链表节点使用void*保存节点值&a…

Stable Diffusion Web-UI 安装指南

Stable DIffusion 是 Stability.AI 开源的 text-to-image 模型,目前类似产品有 Midjourney 以及 OpenAI 的 DELL-2 ;从AI绘画效果上来说,Midjourney 目前公认是最好的;但从模型的可玩性和发展潜力来看,个人观点来看&am…

【009】C++数据类型之转义字符和类型转换

C数据类型之转义字符和类型转换 引言一、转义字符1.1、概念1.2、八进制转义1.3、十六进制转义 二、类型转换2.1、自动类型转换原则2.2、强制类型转换 三、C新特性中类型转换的扩展3.1、隐式类型转换3.2、显式类型转换 总结 引言 💡 作者简介:专注于C/C高…

Packet Tracer – 配置单臂路由器 VLAN 间路由

Packet Tracer – 配置单臂路由器 VLAN 间路由 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0.10 172.17.10.1 255.255.255.0 不适用 G0/0.30 172.17.30.1 255.255.255.0 不适用 PC1 NIC 172.17.10.10 255.255.255.0 172.17.10.1 PC2 NIC 1…

游乐园里,一边带小孩,一边写代码,分享一些有趣好玩儿的嵌入式软硬件资讯...

作者:晓宇,排版:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 01 边带小孩边写代码 以前觉得,自己下班后都还有大把时间,下班了回到家还能再干个两三个小时,学…

定义运营系统架构

介绍 供应商提供的信息系统随着新功能和实施策略不断发展。可用选项的复杂性和多样性使许多公司难以充分讨论和比较可能满足或不满足其要求的替代方案。 供应商通常会推广由公司或个人工具箱中的产品或解决方案支持的架构。如果公司对其运营系统的架构没有清晰的愿景&#xf…

第九章:C语言的简单结构体

作为一个人有什么关于人的属性呢?简单的梳理一下,人的属性有自己的名字,年龄,身高,体重...。当然关于人的属性还有很多,当我们C语言来描述一下人的属性,就需要定义多个变量,那我们这…

21天学会C++:Day4----函数重载

CSDN的uu们,大家好。这里是C入门的第四讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 知识引入 2. 函数重载的知识点 2. 为什么C语言不支持函数重载而C支持呢&…