数据仓库技术及应用(Hive调优)

一、Hive性能调优使用工具

HiveSQL是一种声明式语言,用户提交的交互式查询,Hive会将其转换成MR任务。

常用调优工具
1.EXPLAIN

Hive提供EXPLAIN命令显示查询语句的执行计划,通过显示信息可以了解Hive如何将查询转换为MR。

语法及释义:

#EXTENDED:提供执行计划关于操作的额外信息,比如文件路径
#DEPENDENCY:提供JSON格式的输出,包括查询所依赖的表和分区的列表
#AUTHORIZATION:提供所有需要授权的实体,包括查询的输入输出和认证失败
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query

EXPLAIN输出包括三个部分 

  • 查询的抽象语法树
  • 执行计划中不同stage之间的依赖关系
  • 每个stage的描述信息,主要显示了操作与数据的对应关系
2.ANALYZE 

ANALYZE关键字可以搜集表的数值统计信息,用于执行计划选择的参考。 

语法:

# noscan参数表示不会扫描文件数据,统计速度会更快
ANALYZE TABLE tablename [PARTITION(col1[=val1], col2[=val2],…)]
COMPUTE STATISTICS [noscan]

统计字段含义

统计字段说明
numPartitions分区个数
numFiles文件个数
totalSizeHDFS存储空间大小
rawDataSize原始数据大小(未压缩)
numRows行数

二、优化MapTask和ReduceTask个数

1.MapTask数量对Hive的影响
  • MapTask数量过大,会造成Map阶段输出文件太小,产生过多小文件,对HDFS造成压力,创建Map开销大;
  • MapTask数量太小,文件处理或查询并行度低,Job执行时间过长,性能不高。
2.设置MapTask数量
  • 减少MapTask数量可以通过合并目录下的文件实现;
  • 增加MapTask数量可以通过增加其依赖的前一个Job的Reduce个数,产生更多的文件来增加。

ReduceTask数量的设定极大影响任务执行效率 。

默认情况,Hive会计算确定Reduce个数。

# 每个Reduce任务处理的数据量,默认是1G
hive.exec.reducer.bytes.per.reducer
# 每个任务最大的Reduce个数,默认是999
hive.exec.reducer.max
# 用户自定义调整Reduce个数
hive.exec.reducer.bytes.per.reducer

三、Hive Job优化

1.使用本地模式运行任务
  • 适合待处理的数据很小的情况
  • 启动分布式数据处理是一种开销
  • 完全启动分布式模式的时间较长
2.设置本地模式运行任务 
# 临时设置方式。注意,作业必须满足条件才能本地模式运行,作业总输# 入大小必须低于2中设置的值,#Map任务总数必须小于属性3中设置的# 值,Reduce任务总数必须是1个或者0个
1. hive>set hive.exec.mode.local.auto=true;--default false
2. hive>set hive.exec.mode.local.auto.inputbytes.max=50000000;
3. hive>set hive.exec.mode.local.auto.input.files.max=5;--default 4
 3.JVM重用
  • 适合轻量级的作业
  • 启动JVM的过程是一种开销
  • 通过共享JVM来重用JVM以串行方式运行MR Job

设置JVM重用运行MR Job  

#设置需在hive-site.xml中添加属性设置,该默认值是1,JVM重用只 #能在同一个job中的Map和Reduce任务起作用,对于不同Job的任务,仍然是运行在独立的JVM。
hive>set mapred.job.reuse.jvm.num.tasks=5;
4.并行执行 
  • Hive会将一个查询转换成一个或多个stage,按顺序执行;
  • 将这些stage并行执行可以缩短整个Job的执行时间。

设置并行执行

<property>
<name>hive.exec.parallel</name>
<value>true</value>
</property>
<property>
<name>hive.exec.parallel.thread.number</name>
<value>16</value>
</property>
 5.推测执行
  • 适合负载不均衡,同一Job的不同Task运行速度不同的情况;
  • Hadoop采用推测执行机制,将执行慢的Task加入黑名单,并为这样的Task启动备份任务,选择先完成的计算结果。

设置推测执行 

#需在$HADOOP_HOME/conf/mapred-site.xml中添加属性设置
mapred.map.tasks.speculative.execution设置为true
mapred.reduce.tasks.speculative.execution设置为true
6.合并小文件
  • Hive实际存储数据是在HDFS上,小文件过多将影响性能
  • 通过合并Map和Reduce的结果文件可避免这种影响

设置合并小文件 

#是否合并Map输出文件
hive.merge.mapfile属性设置为true
#是否合并Reduce输出文件
hive.merge.mapredfiles属性设置为true
#合并文件的大小
hive.merge.size.per.task属性设置为256*1000*1000

四、Hive Query优化

1.列裁剪
  • Hive查询时只查询需要使用的列,效率会更高
  • 列裁剪相关属性为hive.optimize.cp,默认值为true
2.分区裁剪 

当有需求对目标表的某个分区数据进行查询时

# 分区裁剪的配置
<property><name>hive.optimize.pruner</name><value>true</value>
</property>
3.JOIN
  • 将小表或子查询放在Join操作符左边,可以减少内存溢出错误发生的概率
  • 对小表连接时可使用MapJoin,在Map阶段完成Join操作,避免发生shuffle,提高Join操作的效率

Join优化设置 

#自动使用MapJoin优化,默认为true
hive.auto.convert.join  
#通过该属性这是使用MAPJOIN优化表的大小,如果表的大小小于该设置值就会被加载进内存中,默认值是250M
hive.mapjoin.smalltable.filesize
 4.GROUP BY操作  

在Map端进行部分聚合操作,在Reduce端得出最终结果

设定在Map端进行Group by操作

<property><name>hive.map.aggr</name><value>true</value>
</property>
#设定map端进行聚合的条目数
<property><name>hive.groupby.mapaggr.checkinierval</name><value>100000</value>
</property>

五、设置压缩

1.数据压缩
  • MR性能瓶颈主要在于网络I/O和磁盘I/O
  • 采用数据压缩是减少数据量、提高性能的很好的方式

常用数据压缩方法 

压缩算法是否支持拆分Hive自带压缩率压缩/解压缩速度
gzip很高比较快
lzo比较高很快
snappy比较高很快
bizp2最高
2.配置压缩 

中间数据压缩,在MR的shuffle阶段对Map端产生的中间结果数据进行压缩

#激活hive中间数据压缩,默认为False
hive.exec.compress.intermediate属性设置为true

最终数据压缩,可控制对最终输出内容的压缩

#激活hive最终数据压缩,默认为False
hive.compress.output属性设置为true

六、SQL本身的优化

  1. 只select需要的列,避免select *
  2. where条件写在子查询中,先过滤再关联
  3. 关联条件写在on中,而不是where中
  4. 数据量大时,用group by代替count distinct
  5. 数据量小时,用in代替join
  6. 避免笛卡尔积
  7. join时大表放后面,使用相同的连接键
  8. 严格格式

Hive.mapred.mode,分 nonstrict,strict,默认是nonstrict,
如果设置为strict,对三种情况限制
(1)分区表必须加分区。
(2)order by 必须使用limit
(3)存在笛卡尔积 

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

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

相关文章

c语言基础篇C

C1.关系运算符 < &#xff08;小于&#xff09;> &#xff08;大于&#xff09;> &#xff08;大于等于&#xff09; &#xff08;等于&#xff09;! &#xff08;不等于&#xff09;关系表达式的值是一个逻辑值&#xff0c;即“真”或“假”关系运算符优先级低于算数…

2024年江苏三支一扶公告已出,招440人!

本次江苏省将招募440名高校毕业生&#xff0c;安排到乡镇&#xff08;街道&#xff09;从事支教、支农、支医、帮扶乡村振兴、水利、就业和社会保障服务工作&#xff08;以下简称“三支一扶”计划&#xff09;&#xff0c;服务期限为2年。 招募程序 招募工作按照个人报名、资格…

数据结构之线性表(3)

数据结构之线性表&#xff08;3&#xff09; 上文我们了解了线性表的静动态存储的相关操作&#xff0c;此篇我们对线性表中链表的相关操作探讨。 在进行链表的相关操作时&#xff0c;我们先来理解单链表是什么&#xff1f; 1.链表的概念及结构 链表是一种物理存储结构上非连…

yudao-ui-admin-vue3 nginx配置

本文记录一个yudao-ui-admin-vue3 nginx配置信息 一、安装依赖 npm install 二、编译打包 npm run build:prod三、修改.env.prod文件 # 请求路径 VITE_BASE_URL=http://IP地址/admin-api四、 nginx配置 server {listen 80;server_name localhost

【UCOS-III】中断管理

引言&#xff1a;中断是学习 C/OS-III 的过程中一个重要的部分&#xff0c;任务切换、系统时钟节拍等等&#xff0c;都是利用 中断来完成的&#xff0c;并且&#xff0c;既然是 RTOS&#xff0c;那么对中断的响应也应该是十分迅速的。C/OS-III 有一 套中断管理的方法&#xff0…

echarts组件x轴坐标显示不全解决方法

1.旋转: 修改前: option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130,120, 200, 150, 80, 70, 1…

每日一练——删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; int removeDuplicates(int* nums, int numsSize) {int i 0;int j 0;while(numsSize--){if(nums[i] ! nums[j]){i;nums[i] nums[j];j;}else j;}return i 1; }

Golang | Leetcode Golang题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; func detectCycle(head *ListNode) *ListNode {slow, fast : head, headfor fast ! nil {slow slow.Nextif fast.Next nil {return nil}fast fast.Next.Nextif fast slow {p : headfor p ! slow {p p.Nextslow slow.Next}return p}}r…

AI数据分析:根据Excel表格数据绘制柱形图

工作任务&#xff1a;将Excel文件中2013年至2019年间线上图书的销售额&#xff0c;以条形图的形式呈现&#xff0c;每个条形的高度代表相应年份的销售额&#xff0c;同时在每个条形上方标注具体的销售额数值 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#…

eNSP学习——RIP的路由引入

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建公司B的RIP网络 3、优化公司B的 RIP网络 4、连接公司A与公司B的网络 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版_ensp…

[Leetcode]同时进行正向和逆向迭代匹配解决回文链表问题

题目链接:234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题解&#xff1a; currentNode 指针是先到尾节点&#xff0c;由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val ! frontPointer.val 则返回 false。…

876. 链表的中间结点-链表

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 快慢指针 class Solution { public:ListNode* middleNode(ListNode* head) {ListNode* slow head;ListNode* fast head;while(fast ! nullptr && fast->next ! nullptr){slow slow->next;fast …

用MATLAB绘制地球围绕太远运动而月球围绕地球运动

绘制 MATLAB代码: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 初始化参数 num_frames 1000; % 动画帧数 G200; dt 0.01; % 时间步长% 设置太阳、地球和月球的初始位置和半径 sun_position [0, 0]; earth_radius …

Leetcode881. 救生艇

Every day a Leetcode 题目来源&#xff1a;881. 救生艇 解法1&#xff1a;贪心 排序 双指针 排序后&#xff0c;使用双指针分别指向数组首尾&#xff0c;每次取两个指针指向的元素之和与 limit 比较&#xff0c;如果小于等于 limit&#xff0c;则两个指针同时向中间移动一…

【TensorFlow深度学习】Q学习算法原理与Q表的实现

Q学习算法原理与Q表的实现 Q学习算法原理与Q表的实现&#xff1a;强化学习的基石探索Q学习算法原理Q表的实现代码实现结语 Q学习算法原理与Q表的实现&#xff1a;强化学习的基石探索 在强化学习的广阔天地里&#xff0c;Q学习算法是一颗璀璨的明星&#xff0c;以其优雅的理论基…

docker-ce 和 docker-ee介绍版本介绍

1 docker-ce 和 docker-ee介绍版本介绍 •Docker-CE指Docker社区版&#xff0c;由社区维护和提供技术支持&#xff0c;为免费版本&#xff0c;适合个人开发人员和小团队使用。•Docker-EE指Docker企业版&#xff0c;为收费版本&#xff0c;由售后团队和技术团队提供技术支持&am…

箭头函数 this

箭头函数中&#xff0c;是没有this的&#xff0c;所以写在箭头函数中的this&#xff0c;会自动向当前作用域的上一层作用域寻找&#xff0c;是否含有this&#xff0c;如果有就指代&#xff0c;没有就继续找上一层。 new Vue({el:#root,data:{firstName:张,lastName:三,fullNam…

Android Studio历史版本

android studio的历史版本

【langchain】langchain调用huggingface本地模型基础demo

目前网上的langchain教程大多数都是关于如何调用OpenAI等远程模型&#xff0c;对于本地模型的调用示例写法比较少。而且langchain也在不停迭代&#xff0c;文档也比较杂。我个人用Hugging Face的开源模型比较多。因此&#xff0c;本文将向大家介绍如何使用Langchain调用Hugging…

国产达梦数据库使用说明

参考&#xff1a; https://eco.dameng.com/document/dm/zh-cn/start/tool-dm-disql.html https://blog.csdn.net/qq_37358909/article/details/113343515 具体启动脚本名可能版本不同有所差异&#xff0c;注意判断 [rootlocalhost root] cd /home/dmdba/dmdbms/bin [rootloca…