【大数据Hive】hive 表数据优化使用详解

目录

一、前言

二、hive 常用数据存储格式

2.1 文件格式-TextFile

2.1.1 操作演示

2.2 文件格式 - SequenceFile

2.2.1 操作演示

2.3 文件格式 -Parquet

2.3.1 Parquet简介

2.3.2 操作演示

2.4 文件格式-ORC

2.4.1 ORC介绍

2.4.2 操作演示

三、hive 存储数据压缩优化

3.1 数据压缩-概述

3.2 数据压缩的优缺点

3.2.1 压缩的优点

3.2.2 压缩的缺点

3.3 常用压缩格式和压缩算法

3.3.1 Hadoop中各种压缩算法性能对比

3.3.2 压缩参数设置

3.3 操作演示

3.3.1 设置压缩参数

3.3.2 创建表,指定为textfile格式

3.3.3 创建表,指定为orc格式

四、hive 存储优化

4.1 避免小文件生成

4.2 ORC文件索引

4.2.1 Row Group Index

4.2.2 核心参数设置

4.2.3 操作演示

4.2.4 Bloom Filter Index

4.2.5 操作演示

4.3 ORC矢量化查询

五、写在文末


一、前言

通过之前的学习了解到,hive本身并不存储数据,其数据存储的本质还是HDFS,所有的数据读写都基于HDFS的文件来实现,因此对于hive表数据的优化可以归结为对hdfs上面存储数据相关的优化,比如数据存储格式的选择等。

二、hive 常用数据存储格式

为了提高对HDFS文件读写的性能,Hive提供了多种文件存储格式:TextFile、SequenceFile、ORC、Parquet等,不同的文件存储格式具有不同的存储特点,有的可以降低存储空间,有的可以提高查询性能。

Hive的文件格式在建表时指定,默认是TextFile,在hive的建表语法树中,在 [STORED AS file_format] 这一项中可以进行指定;

2.1 文件格式-TextFile

TextFile是Hive中默认的文件格式,存储形式为按行存储。工作中最常见的数据文件格式就是TextFile文件,几乎所有的原始数据生成都是TextFile格式,所以Hive设计时考虑到为了避免各种编码及数据错乱的问题,选用了TextFile作为默认的格式。建表时如果不指定存储格式即为TextFile,导入数据时把数据文件拷贝至HDFS不进行处理。

TextFile格式优缺点对比:

优点缺点应用场景

1、最简单的数据格式,可以直接查看

2、可以使用任意的分隔符进行分割

3、便于和其他工具共享数据

4、可以搭配压缩一起使用

1、耗费存储空间,I/O性能较低

2、结合压缩时Hive不进行数据切分合并,不能进行并行操作,查询效率低

3、按行存储,读取列的性能差

1、适合于小量数据的存储查询

2、一般用于做第一层数据加载和测试使用

2.1.1 操作演示

在本地有一个2K大小的文件

建表并加载数据

create table tb_sogou_source(stime string,userid string,keyword string,clickorder string,url string
)row format delimited fields terminated by '\t';load data local inpath '/usr/local/soft/data/sogo.reduced' into table tb_sogou_source;

执行过程

 TextFile这种格式的文件的典型特征是,数据在hdfs上面文件大小与原文件保存不变,同时可以直接查看;

2.2 文件格式 - SequenceFile

SequenceFile是Hadoop里用来存储序列化的键值对即二进制的一种文件格式。SequenceFile文件也可以作为MapReduce作业的输入和输出,hive也支持这种格式。

优点缺点使用场景

1、以二进制的KV形式存储数据;

2、与底层交互更加友好,性能更快;

3、可压缩、可分割,优化磁盘利用率和I/O;

4、可并行操作数据,查询效率高;

5、也可以用于存储多个小文件

1、存储空间消耗最大;

2、与非Hadoop生态系统之外的工具不兼容;

3、构建SequenceFile需要通过TextFile文件转化加载

适合于小量数据,但是查询列比较多的场景

SequenceFile 底层存储架构图

2.2.1 操作演示

建表并加载数据

create table tb_sogou_seq(stime string,userid string,keyword string,clickorder string,url string
)row format delimited fields terminated by '\t'stored as sequencefile;insert into table tb_sogou_seq
select * from tb_sogou_source;

执行过程

从文件大小来说,略有减小,但是这种文件下载之后是二进制格式的;

2.3 文件格式 -Parquet

2.3.1 Parquet简介

  • Parquet是一种支持嵌套结构的列式存储文件格式,最早是由Twitter和Cloudera合作开发,2015年5月从Apache孵化器里毕业成为Apache顶级项目;
  • 是一种支持嵌套数据模型对的列式存储系统,作为大数据系统中OLAP查询的优化方案,它已经被多种查询引擎原生支持,并且部分高性能引擎将其作为默认的文件存储格式;
  • 通过数据编码和压缩,以及映射下推和谓词下推功能,Parquet的性能也较之其它文件格式有所提升;

优缺点对比

优点缺点使用场景

1、更高效的压缩和编码可压缩、可分割,优化磁盘利用率和I/O;

2、可用于多种数据处理框架

不支持update, insert, delete, ACID适用于字段数非常多,无更新,只取部分列的查询

2.3.2 操作演示

建表并加载数据

create table tb_sogou_parquet(stime string,userid string,keyword string,clickorder string,url string
)row format delimited fields terminated by '\t'stored as parquet;insert into table tb_sogou_parquet
select * from tb_sogou_source;

执行过程

执行完成后,检查hdfs文件目录,对比原始文件可以看到这个压缩的比率还是很高的; 

2.4 文件格式-ORC

2.4.1 ORC介绍

  • ORC(OptimizedRC File)文件格式也是一种Hadoop生态圈中的列式存储格式;
  • 它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度;
  • 2015年ORC项目被Apache项目基金会提升为Apache顶级项目;
  • ORC不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储;
  • ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Hive、Spark SQL、Presto等查询引擎支持;

优缺点:

优点缺点应用场景

1、列式存储,存储效率非常高;

2、可压缩,高效的列存取;

3、查询效率较高,支持索引;

4、支持矢量化查询

1、加载时性能消耗较大;

2、需要通过text文件转化生成;

3、读取全量数据时性能较差

适用于Hive中大型的存储、查询

2.4.2 操作演示

建表并加载数据

create table tb_sogou_orc(stime string,userid string,keyword string,clickorder string,url string
)row format delimited fields terminated by '\t'stored as orc;insert into table tb_sogou_orc
select * from tb_sogou_source;

执行过程

 从hdfs文件目录下的数据来看,orc格式下文件仍然可以得到较大的压缩,使得存储空间大大降低;

三、hive 存储数据压缩优化

3.1 数据压缩-概述

Hive底层运行MapReduce程序时,磁盘I/O操作、网络数据传输、shuffle和merge要花大量的时间,尤其是数据规模很大和工作负载密集的情况下。鉴于磁盘I/O和网络带宽是Hadoop的宝贵资源,数据压缩对于节省资源、最小化磁盘I/O和网络传输非常有帮助。

Hive压缩实际上说的就是MapReduce的压缩。

下图是hive在运行MR任务时数据压缩过程的运行架构图

3.2 数据压缩的优缺点

3.2.1 压缩的优点

  • 减小文件存储所占空间;
  • 加快文件传输效率,从而提高系统的处理速度;
  • 降低IO读写的次数;

3.2.2 压缩的缺点

使用数据时需要先对文件解压,加重CPU负荷,压缩算法越复杂,解压时间越长

3.3 常用压缩格式和压缩算法

Hive中的压缩就是使用了Hadoop中的压缩实现的,所以Hadoop中支持的压缩在Hive中都可以直接使用。Hadoop中支持的压缩算法:

 要想在Hive中使用压缩,需要对MapReduce和Hive进行相应的配置

3.3.1 Hadoop中各种压缩算法性能对比

3.3.2 压缩参数设置

--开启hive中间传输数据压缩功能
--1)开启hive中间传输数据压缩功能
set hive.exec.compress.intermediate=true;
--2)开启mapreduce中map输出压缩功能
set mapreduce.map.output.compress=true;
--3)设置mapreduce中map输出数据的压缩方式
set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;--开启Reduce输出阶段压缩
--1)开启hive最终输出数据压缩功能
set hive.exec.compress.output=true;
--2)开启mapreduce最终输出数据压缩
set mapreduce.output.fileoutputformat.compress=true;
--3)设置mapreduce最终数据输出压缩方式
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
--4)设置mapreduce最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

3.3 操作演示

3.3.1 设置压缩参数

使用上面的压缩参数

3.3.2 创建表,指定为textfile格式

指定为textfile格式,并使用snappy压缩

drop table tb_sogou_snappy;create table tb_sogou_snappystored as textfile
as select * from tb_sogou_source;

执行过程

3.3.3 创建表,指定为orc格式

指定为orc格式,并使用snappy压缩

create table tb_sogou_orc_snappystored as orc tblproperties ("orc.compress"="SNAPPY")
as select * from tb_sogou_source;

执行过程 

创建完成后,检查hdfs表的数据目录,可以发现数据目录的结尾会带有snappy,同时这个数据压缩比起上文更夸张了;

四、hive 存储优化

4.1 避免小文件生成

Hive的存储本质还是HDFS,HDFS是不利于小文件存储的,因为每个小文件会产生一条元数据信息,并且不利用MapReduce的处理,MapReduce中每个小文件会启动一个MapTask计算处理,导致资源的浪费,所以在使用Hive进行处理分析时,要尽量避免小文件的生成。

Hive中提供了一个特殊的机制,可以自动的判断是否是小文件,如果是小文件可以自动将小文件进行合并。

如下配置参数

-- 如果hive的程序,只有maptask,将MapTask产生的所有小文件进行合并
set hive.merge.mapfiles=true;-- 如果hive的程序,有Map和ReduceTask,将ReduceTask产生的所有小文件进行合并
set hive.merge.mapredfiles=true;-- 每一个合并的文件的大小(244M)
set hive.merge.size.per.task=256000000;-- 平均每个文件的大小,如果小于这个值就会进行合并(15M)
set hive.merge.smallfiles.avgsize=16000000;

如果遇到数据处理的输入是小文件的情况,怎么解决呢?Hive中也提供一种输入类CombineHiveInputFormat,用于将小文件合并以后,再进行处理。

设置Hive中底层MapReduce读取数据的输入类:将所有文件合并为一个大文件作为输入

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

4.2 ORC文件索引

在使用ORC文件时,为了加快读取ORC文件中的数据内容,ORC提供了两种索引机制:Row Group Index 和 Bloom Filter Index可以帮助提高查询ORC文件的性能;当用户写入数据时,可以指定构建索引,当用户查询数据时,可以根据索引提前对数据进行过滤,避免不必要的数据扫描。

4.2.1 Row Group Index

  • 一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个column的min/max值的索引数据;
  • 当查询中有大于等于小于的操作时,会根据min/max值,跳过扫描不包含的stripes;
  • 而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index行组索引,也叫min-max Index大小对比索引,或者Storage Index;

Row Group Index 补充说明

1、建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group Index;

2、为了使Row Group Index有效利用,向表中加载数据时,必须对需要使用索引的字段进行排序;

4.2.2 核心参数设置

--1、开启索引配置set hive.optimize.index.filter=true;--2、创建表并制定构建索引create table tb_sogou_orc_index    stored as orc tblproperties ("orc.create.index"="true")as select * from tb_sogou_source    distribute by stime    sort by stime;--3、当进行范围或者等值查询(<,>,=)时就可以基于构建的索引进行查询select count(*) from tb_sogou_orc_index where stime > '12:00:00' and stime < '18:00:00';

4.2.3 操作演示

开启索引配置

set hive.optimize.index.filter=true;

创建表并制定构建索引

create table tb_sogou_orc_indexstored as orc tblproperties ("orc.create.index"="true")
as select * from tb_sogou_sourcedistribute by stimesort by stime;

当进行范围或者等值查询(<,>,=)时就可以基于构建的索引进行查询

select count(*) from tb_sogou_orc_index where stime > '12:00:00' and stime < '18:00:00';

执行结果

4.2.4 Bloom Filter Index

俗称布隆过滤器索引

  • 建表时候通过表参数”orc.bloom.filter.columns”=”columnName……”来指定为哪些字段建立BloomFilter索引,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构;
  • 当查询条件中包含对该字段的等值过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe;

4.2.5 操作演示

创建表指定创建布隆索引

create table tb_sogou_orc_bloom
stored as orc tblproperties ("orc.create.index"="true","orc.bloom.filter.columns"="stime,userid")
as select * from tb_sogou_source
distribute by stime
sort by stime;

stime的范围过滤可以走row group index,userid的过滤可以走bloom filter index

selectcount(*)
from tb_sogou_orc_index
where stime > '12:00:00' and stime < '18:00:00'and userid = '3933365481995287' ;

执行结果

4.3 ORC矢量化查询

Hive的默认查询执行引擎一次处理一行,而矢量化查询执行是一种Hive针对ORC文件操作的特性,目的是按照每批1024行读取数据,并且一次性对整个记录整合(而不是对单条记录)应用操作,提升了像过滤, 联合, 聚合等等操作的性能。

注意:要使用矢量化查询执行,就必须以ORC格式存储数据。

开启矢量化查询参数

set hive.vectorized.execution.enabled = true;

set hive.vectorized.execution.reduce.enabled = true;

五、写在文末

本文通过大量案例详细探讨了Hive中表的常用优化策略,希望对看到的小伙伴有用哦,本篇到此结束,感谢观看。

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

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

相关文章

在线主动学习算法评估策略:prequential evaluation procedure

在线主动学习算法评估策略&#xff1a;prequential evaluation procedure 在在线主动学习领域(Online Active Learning)&#xff0c;对在线主动学习算法的评估策略有多种方法&#xff0c;而现如今常用的方法是prequential evaluation procedure(出自论文《High density-focuse…

c++二叉树遍历

参考文献 数据结构c语言版&#xff0c;严蔚敏_吴伟民著。 二叉树 中序遍历代码实现 #include<vector> #include<iostream> using namespace std;//Definition for a binary tree node. struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : v…

腾讯云轻量应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像介绍

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像&#xff0c;腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍&#xff1a; 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像&#xff1a;独有的应用镜像除了包…

Mysql设置了更新时间自动更新,指定更新部分sql时不进行时间更新

现象&#xff1a; 因为字段设置了自动更新&#xff0c;所以sql语句一进行修改此字段就会自动更新时间&#xff0c;但是呢我们的有部分定时任务是半夜执行&#xff0c;并且不能让这个任务修改到数据的更新时间 解决&#xff1a; <update id"updateCreative">ALT…

GoLand GC(垃圾回收机制)简介及调优

GC(Garbage Collector)垃圾回收机制及调优 简单理解GC机制 其实gc机制特别容易理解&#xff0c;就是物理内存的自动清理工。我们可以把内存想象成一个房间&#xff0c;程序运行时会在这个房间里存放各种东西&#xff0c;但有时候我们会忘记把不再需要的东西拿出去&#xff0c…

HubSpot CRM是什么?如何添加、使用呢?

HubSpot CRM是一款强大的客户关系管理工具&#xff0c;它不仅简化了销售和市场营销过程&#xff0c;还提供了多种功能&#xff0c;有助于增强客户互动、提高销售效率和提供更多的洞察信息。 今天运营坛将带领大家深入了解HubSpot CRM&#xff0c;涵盖了它的定义、使用流程、添…

基于STM32闭环步进电机控制系统设计

**单片机设计介绍&#xff0c;1654基于STM32闭环步进电机控制系统设计&#xff08;仿真&#xff0c;程序&#xff0c;说明&#xff09; 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的闭环步进电机控制系统设计是…

Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

安卓逆向之雷电模拟器中控

一, 雷电模拟器 安装使用 官方地址: https://www.ldmnq.com ,官方论坛 https://www.ldmnq.com/forum/ . 有一个多开管理器,还有就是设置手机的参数比较关键。 二,雷电模拟器开启面具,安装LSP。 设置root 权限。

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序表: 该顺序表使用动态内存分配,可以用来存储任意数量的同类型数据. 顺序表需要包含三个要素:存储数据的数组arr,顺序表…

Python程序设计期末复习笔记

文章目录 一、数据存储1.1 倒计时1.2 os库1.3 字符串操作1.4 文件操作1.5 列表操作1.6 元组1.7 字典 二、文本处理及可视化2.1 jieba分词2.2 集合操作2.3 pdf文件读取2.4 参数传递2.5 变量作用域 三、数据处理分析3.1 Sumpy3.2 Matplotlib3.3 Numpy 四、Pandas4.1 索引操作4.2 …

技术视角下的跑腿小程序开发:关键挑战和解决方案

跑腿小程序作为连接服务提供者和用户的桥梁&#xff0c;面临着诸多技术挑战。本文将聚焦于技术层面的关键挑战&#xff0c;并提供解决方案&#xff0c;以帮助开发者应对技术上的复杂问题。 1. 实时性与性能挑战 挑战&#xff1a; 跑腿小程序需要实时地匹配订单、更新状态和提…

40基于MATLAB,使用模板匹配法实现车牌的识别。

基于MATLAB&#xff0c;使用模板匹配法实现车牌的识别。具体包括将原图灰度化&#xff0c;边缘检测&#xff0c;腐蚀操作&#xff0c;车牌区域定位&#xff0c;车牌区域矫正&#xff0c;二值化&#xff0c;均值滤波&#xff0c;切割&#xff0c;字符匹配&#xff0c;最终显示车…

小程序request请求封装

以上为本人的项目目录 1.首先在utils中创建request.js文件封装request请求&#xff0c;此封装带上了token&#xff0c;每次请求都会自带token&#xff0c;需要你从后端获取后利用wx.setStorageSync(token,返回的token),不使用的话就是空。 直接复制即可&#xff0c;需要改一下…

(三)库存超卖案例实战——使用redis分布式锁解决“超卖”问题

前言 在上一节内容中我们介绍了如何使用mysql数据库的传统锁&#xff08;行锁、乐观锁、悲观锁&#xff09;来解决并发访问导致的“超卖问题”。虽然mysql的传统锁能够很好的解决并发访问的问题&#xff0c;但是从性能上来讲&#xff0c;mysql的表现似乎并不那么优秀&#xff…

vue3后台管理系统之跨域代理

vite.config.js中 server: {port: 5002,host: true, //0.0.0.0open: false,strictPort: true,proxy: {// 请求前缀/api&#xff0c;只有加了/api前缀的请求才会走代理(前端自定义)/api: {target: http://127.0.0.1:8000,// 获取服务器地址的设置changeOrigin: true,// 路径重写…

AMD HIP并行编程语言及其矢量相加实例——一文带你快速入门

✍️写在前面&#xff1a;随着计算的应用场景变得日益复杂多样&#xff0c;为了跟上人工智能算法对算力的需求&#xff0c;GPU硬件架构快速走向多样化&#xff0c;GPU生产厂家众多&#xff0c;且在商业和市场等因素的影响下&#xff0c;GPU通用计算编程模型也日益多元化。因此&…

Gateway一个诡异问题处理过程

一、前言 我们搭好了网关和一个基础微服务&#xff08;含用户体系、门店服务、商品服务、客户服务&#xff09;&#xff0c;然后用APIfox测试过程中发现通过网关入口请求某些接口&#xff0c;一段时间后返回错误&#xff0c;查看系统日志发现除了报There is no session with i…

流程封装与基于加密接口的测试用例设计

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 错误思路1&#xff1a;使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程&#xff0c;如果这时线程锁住了共享资源&#xff0c;那么当它被杀死后就再也没有机会释 …