Hive优化

工作中涉及到优化部分不多,下面的一些方案可能会缺少实际项目支撑,这里主要是为了完备一下知识体系。
参考的hive参数管理文档地址:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

对于Hive优化,可以从下面几个角度出发:

  • 一、建表优化
  • 二、存储压缩优化
    • 1.存储
    • 2.压缩
  • 三、Job层面优化
    • 1.合理控制map&reduce个数
    • 2.JVM重用
    • 3.Fetch抓取
    • 4.本地模式
    • 5.并行执行
    • 6.推测执行
    • 7.严格模式
  • 四、HQL层面优化
    • 1.列裁剪&分区裁剪
    • 2.谓词下推
    • 3.CBO优化
    • 4.group by优化
    • 5.join优化
    • 6.order by+limit
    • 7.避免产生笛卡尔积

一、建表优化

根据业务选择合适的分区表或分桶表,分区在HDFS上的表现就是分文件夹,分桶就是分文件,这样在进行数据查询分析时可以避免全表扫描,直接读取目标分区或分桶。

二、存储压缩优化

1.存储

存储主要分为列式存储与行式存储,hive支持的主要存储方式有:
TextFile:行式,也是hive默认的存储格式,数据以纯文本格式存储,可直接文本编辑器打开查看。
Sequence File:行式,序列化为二进制存储,可以被MR高效读写,但因为行式所以不适合SQL分析,因此当某些需要MR处理但不需要进行SQL分析的可以选择。
ORC File:列式,RCFile的升级版,对hadoop生态的原生支持比较好,Hive 0.11版本及之后引入。支持ACID事务和行级别的更新。
Parquet File:列式,兼容性比较好,包括hadoop生态和很多非hadoop生态系统。

hive中,往往是基于大数据量对某些指标进行分析计算,只需要处理某几个特定的字段就行了,因此一般选择列式存储,可以提升读的效率。

2.压缩

压缩可以从3个角度来说,分别是map输出结果的压缩,reduce最终输出结果的压缩,和同一个job中不同MR之间中间结果数据的压缩。压缩会一定程度的增加CPU开销,但是降低了磁盘IO和网络传输IO。

开发中常用的方案:ORC/Parquet + Snappy

三、Job层面优化

1.合理控制map&reduce个数

MR中,一个map或者一个reduce就是一个进程,进程的创建启动开销大,如对于小文件问题,会造成为每个小文件都启动一个map任务,浪费资源。可以通过参数设置在map任务执行前对小文件进行合并。或者是,input的文件很大,处理逻辑又复杂,就会导致单个map的负载过重,造成整体任务缓慢,这种情况可以通过减小每个map可以读取的数据量最大值来增加map数量,提高并行计算的能力。

对于reduce的个数,可以通过调整每个reduce处理的数据量进而调整reduce的个数,或者是通过参数直接指定具体个数。但要注意reduce个数太少可能会导致单个任务处理缓慢,过多可能会导致reduce任务启动开销的浪费和输出小文件过多的问题。一般来说,让hive自己选择就好。

2.JVM重用

原因同上,默认情况下,每个map或reduce任务都会启动一个JVM进程,通过参数设置JVM重用就是为了减少进程的频繁创建启动,当通过参数指定每个JVM进程处理的任务数后,JVM实例只有在处理完指定的任务数量之后才会销毁。需要注意的是,设置JVM重用并不会影响启动的JVM个数,区别只是在于执行完任务后是直接执行下一个任务,还是销毁进程,重新启动一个JVM
去执行下个任务。可以通过在hadoop的mapred-site.xml配置文件中设置 mapreduce.job.jvm.numtasks参数(在一些低版本的hadoop中参数可能为mapred.job.reuse.jvm.num.tasks)为JVM设置可重复运行的任务个数。
在这里插入图片描述
参考:https://hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

3.Fetch抓取

hive读取HDFS数据有两种方式:
1)通过MR读取。
2)直接读取。
开启fetch机制后,特定条件下的查询不会转换成MR任务,而是直接从HDFS中读取数据,从而提升效率。
通过参数hive.fetch.task.conversion设置,值允许为none, minimal , more。
在这里插入图片描述
在Hive 0.14.0及之后默认值为more,当涉及到简单的select全局查找或字段查找,where过滤或者limit查找时不走MR。这就要求当前的查询不能出现分组、聚合、关联等类似操作,很好理解,因为涉及到后面的操作时必须启动MR计算,而不是简单的将数据原样读取返回即可。

4.本地模式

这点主要是针对小数据量的任务而言的。也就是对于小数据量的任务,不提交到集群执行,而是在集群的某个单一节点上执行。好处是避免了集群间不必要的资源协调调度和跨节点数据传输。可通过下面参数开启配置:
在这里插入图片描述

5.并行执行

一个HiveSQL可能会转化为多个stage阶段,如果这些阶段之间没有依赖关系是可以并行执行的,最大化利用集群资源。类似于(A) union all (B),此时AB是可以并行执行的。可以通过下面参数设置:
在这里插入图片描述
并行执行受限于集群资源,只有当集群资源充足才会并行执行。同时对于小数据量的sql可能反而导致效率变慢,原因是增加了资源和任务的调度开销,超过了小查询本身执行的时间。

6.推测执行

这主要是针对个别执行过慢的任务的一种优化策略。如果某个任务执行时间明显超过其他同类型任务时,可能是因为执行该任务的节点硬件故障,网络拥堵,或者其他原因。此时hive会重启一个备份任务执行,和原任务谁先执行完就以谁的结果为准。设置参数:
在这里插入图片描述
参考:https://hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

7.严格模式

严格模式就是不让执行hive认为有“风险”的查询,比如分区表必须使用分区过滤,order by时必须跟着limit子句,限制产生笛卡尔积的查询等。参数设置:
在这里插入图片描述

四、HQL层面优化

1.列裁剪&分区裁剪

就是查询时只select需要的字段,对于分区表指定分区查找。

2.谓词下推

就是将where数据过滤尽早的提前到map端过滤,而不是在reduce端对处理后的结果进行过滤。类似于下面这两段SQL:

-- 没有使用谓词下推的sql执行逻辑
select 
	*
from A join B on A.id = B.id
where A.id<10;

-- 使用谓词下推后的sql执行逻辑
select
	*
from (select * from A where id<10) A join B on A.id=B.id;

hive中默认开启此配置:
在这里插入图片描述

3.CBO优化

CBO:Cost based Optimizer,基于代价/成本的优化。比如多个表join的时候,如果不考虑CBO优化,往往前面的表作为驱动表被加载进内存,后面的表作为被驱动表进行磁盘扫描。开启CBO优化后,hive会根据统计信息决定最优的表连接顺序,连接算法等。可以通过下面4个参数开启设置:

set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

在hive1.1.0之后默认开启:
在这里插入图片描述
关于hive中CBO优化细节可以查看https://cwiki.apache.org/confluence/display/Hive/Cost-based+optimization+in+Hive

4.group by优化

group by是对相同key的数据拉取到同一个reduce中处理,如果这个key的数据量很大,就可能导致数据倾斜。可以通过开启map端预聚合,和当出现数据倾斜时开启负载均衡来优化。

负载均衡指的是将原先的一个MR job转换成两个MR job,第一阶段随机打散预聚合,第二阶段对预聚合的结果进行最终聚合。

可通过下面参数开启:

-- 开启map端预聚合
set hive.map.aggr = true;
-- map端预聚合的数据条数
set hive.groupby.mapaggr.checkinterval = 100000;
-- 开启负载均衡
set hive.groupby.skewindata = true;

在这里插入图片描述

5.join优化

join优化可分为map join(小表join大表)和SMB join(大表join大表)。

map join
map join是将小表直接分发到各个map任务的进程中,在map进程中完成join,省略了shuffle的过程,也就避免了数据倾斜的可能。

参数设置:

-- 开启map join
set hive.auto.convert.join=true;
-- 小表阈值,单位字节,大约25MB
set hive.mapjoin.smalltable.filesize=25000000;

SMB join
SMB(Sort Merge Bucket Join),这种方式要求两个表都根据关联字段分桶并排序。原理是将两个大表分桶,且两表桶数成倍数关系,那么关联的时候,驱动表的每个桶都只会被驱动表中与自己相关的桶进行连接,避免了全局shuffle,在map阶段就可以完成,所以也不会导致数据倾斜单个任务执行缓慢。同时因为桶内有序,所以连接时可以采用类似归并排序的方式进行连接,提高连接效率。

6.order by+limit

如果排序时不加limit限制,那么就会将所有数据拉取到同一个reduce中进行排序,非常容易导致任务执行缓慢。而+limit限制之后,比如说limit 5,那么会首先在每个reduce中对局部数据进行排序,并从每个reduce中找出局部前5的数据,再将所有reduce的结果进行最终排序,选出全局前5的数据。

7.避免产生笛卡尔积

这里主要就是说,join连接时要指定连接字段,一般开发中也不会犯这种错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

综合知识篇10-计算机网络考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

SpringBoot2.7集成Swagger3

Swagger2已经在17年停止维护了&#xff0c;取而代之的是 Swagger3&#xff08;基于openApi3&#xff09;&#xff0c;所以新项目要尽量使用Swagger3. Open API OpenApi是业界真正的 api 文档标准&#xff0c;其是由 Swagger 来维护的&#xff0c;并被linux列为api标准&#x…

【洛谷 P9232】[蓝桥杯 2023 省 A] 更小的数 题解(字符串+区间DP)

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n n n 且仅由数字字符 0 ∼ 9 0 \sim 9 0∼9 组成的字符串&#xff0c;下标从 0 0 0 到 n − 1 n-1 n−1&#xff0c;你可以将其视作是一个具有 n n n 位的十进制数字 n u m num num&#xff0c;小蓝可以从 n…

相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)

许久没更新四足机器人相关的博客文章&#xff0c;由于去年一整年都在干各种各样的~活&#xff0c;终于把硕士毕业论文给写好&#xff0c;才有点时间更新自己的所学和感悟。步态规划和足端规划只是为了在运动学层面获取四足机器人各关节的期望角位移和速度信号&#xff0c;再由底…

基于Java中的SSM框架实现在线通用旅游平台网站系统项目【项目源码+论文说明】

基于Java中的SSM框架实现在线通用旅游平台网站系统演示 摘要 近几年来&#xff0c;计算机网络的发展得到了飞速的提升&#xff0c;由此展开的一系列行业大洗牌也由此开始。早些年只是人们只是对于计算机和互联网有了些基础的认识&#xff0c;现在它正在悄悄的改变着我们生活的…

Latex插入pdf图片,去除空白部分

目录 参考链接&#xff1a; 流程&#xff1a; 参考链接&#xff1a; ​科研锦囊之Latex-如何插入图片、表格、参考文献 http://t.csdnimg.cn/vpSJ3 流程&#xff1a; Latex的图片插入支持PDF文件&#xff0c;这里笔者建议都使用PDF文件进行图片的插入&#xff0c;因为PDF作…

广州大彩科技新品发布:大彩科技COF系列2.4寸串口屏发布!

一、产品介绍 此次发布的是S系列平台2.4寸COF超薄结构串口屏&#xff0c;分辨率为240*320&#xff0c;该平台采用了Cortex-M3内核的处理器&#xff0c;内置了2Mbyte PSRAM和64Mbit FLASH&#xff0c;是专为小尺寸串口屏设计的MCU&#xff0c;精简了外围电路。 该平台默认支持大…

鸿蒙App开发学习 - TypeScript编程语言全面开发教程(下)

现在我们接着上次的内容来学习TypeScript编程语言全面开发教程&#xff08;下半部分&#xff09; 4. 泛型 TypeScript 中的泛型&#xff08;Generics&#xff09;是一种编程模式&#xff0c;用于在编写代码时增强灵活性和可重用性。泛型使得在定义函数、类、接口等数据类型时…

MySQL 锁机制

优质博文&#xff1a;IT-BLOG-CN 定义&#xff1a;锁是计算机协调多个进程或线程并发访问某一资源的机制。 一、表锁&#xff08;偏读&#xff09; MyISAM 引擎&#xff0c;开销小&#xff0c;加锁快&#xff0c;无死锁、锁定粒度大、发生锁冲突的粒度最高&#xff0c;并发度…

从零开始学习深度学习库-4:自动微分

欢迎来到本系列的第四部分&#xff0c;在这里我们将讨论自动微分 介绍 自动微分&#xff08;Automatic Differentiation&#xff0c;简称AD&#xff09;是一种计算数学函数导数&#xff08;梯度&#xff09;的技术。在深度学习和其他领域中&#xff0c;自动微分是一种极其重要…

C#集合:从字典到队列——探索数据结构核心

文章目录 C# 中的集合类型C# Dictionary 字典C# Hashtable&#xff1a;哈希表Hashtable 类中的属性Hashtable 类中的方法 C# SortedList&#xff1a;排序列表SortedList 类的中的属性SortedList 类的中的方法 C# Stack&#xff1a;堆栈Stack 类中的属性Stack 类中的方法 C# Que…

深度学习面经-part3(RNN、LSTM)

3.RNN 核心思想&#xff1a;像人一样拥有记忆能力。用以往的记忆和当前的输入&#xff0c;生成输出。 RNN 和 传统神经网络 最大的区别:在于每次都会将前一次的输出结果&#xff0c;带到下一次的隐藏层中&#xff0c;一起训练。 RNN应用场景: 1.文本生成 2.语音识别 3.机器翻…

C/C++动态链接库的封装和调用

1 引言 静态链接库是在编译时被链接到程序中的库文件&#xff0c;在编译时&#xff0c;链接器将静态链接库的代码和数据复制到最终的可执行文件中。动态链接库是在程序运行时加载的库文件&#xff0c;在编译时&#xff0c;可执行文件只包含对动态链接库的引用&#xff0c;而不…

mac npm install 很慢或报错

npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired 1、取消ssl验证&#xff1a; npm config set strict-ssl false 修改后一般就可以了&#xff0c;…

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

3d导出stl格式模型破碎是什么原因,怎么解决?---模大狮模型网

在导出3D模型为STL格式时出现破碎(或称为碎片化)的情况通常是由于模型中存在几何上的问题造成的。以下是一些可能导致STL模型破碎的原因以及解决方法&#xff1a; 3d导出stl格式模型破碎的原因&#xff1a; 模型不封闭&#xff1a;STL格式要求模型必须是封闭的实体&#xff0c…

电机学(笔记)

磁极对数p&#xff1a; 直流电机的磁极对数是指电机定子的磁极对数&#xff0c;也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说&#xff0c;极对数越多&#xff0c;电机转速越低&#xff0c;扭矩越大&#xff0c;适用于低速、高扭矩的场合&#xff1b;相反&…

分布式搜索引擎elasticsearch专栏一

初识elasticsearch 1.1了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在码云搜索代码 在电商网站搜索商品 在百度搜索答案 1.1.2.ELK…

一个可商用私有化部署的基于JAVA的chat-gpt网站

目录 介绍一、核心功能1、智能对话2、AI绘画3、知识库4、一键思维导图5、应用广场6、GPTS 二、后台管理功能1、网站自定义2、多账号登录支持3、商品及会员系统4、模型配置5、兑换码生成6、三方商户用户打通 结语 介绍 java语言的私有化部署的商用网站还是比较少的 这里给大家介…

中国银行信息系统应用架构发展历程

概述&#xff1a; 从 20 世纪 80 年代开始至今&#xff0c;我国银行业信息化历程已 有四十年历史。虽然相对于发达国家来讲&#xff0c;我国银行业务信 息化起步较晚&#xff0c;但发展速度很快&#xff0c; 目前我国一些大型商业银行的信息化程度已经处于全球领先水平。 “银行…