Hive优化(面试宝典)

news/2024/11/14 20:11:10/文章来源:https://www.cnblogs.com/bjynjj/p/18546680

Hive优化

1.1 hive的随机抓取策略

理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们
省略掉了这个过程,把切片split的过程提前帮我们做了。
set hive.fetch.task.conversion=none;
(一旦进行这么设置,select字段名也是需要进行mapreduce的过程,默认是more)

Fetch抓取的模式
可以通过 set hive.fetch.task.conversion查看,有以下3种模式:none:所有涉及hdfs的读取查询都走mapreduce任务;
mininal:在进行简单的select *,简单的过滤或涉及分区字段的过滤时走mr;
more:在mininal模式的基础上,增加了针对查询语句字段进行一些别名的计算操作。
以下HQL,mininal模式与more模式下都不会走mr任务:
SELECTsale_ord_id,store_id
FROMtest_table
where dt = '2021-01-01'limit 10;以下HQL,mininal模式会走mr任务,more模式不会:
SELECTsale_ord_id,store_id,if(store_id > 20,1,0) as store_id_new
FROMtest_table
where dt = '2021-01-01'limit 10;

查看怎么将一个sql转化成一个MR任务的
explain sql语句
例如:
explain select count() from stu_dy1_1;
更加详细的查看,例如:
**explain extended select count(
) from students2;**
当你输入一个sql语句的时候,hive会将对其关键字进行截串,截完串之后,变成
都是一些TOK开头的一些东西,然后经过这样的抽象语法树,再转成具体的查询块,
最后变成逻辑查询计划

1.2 本地运行模式

大多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的。不过,
有时 Hive 的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能
会比实际 job 的执行时间要多的多。对于大多数这种情况, Hive 可以通过本地模式在单台机
器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以通过设置 hive.exec.mode.local.auto 的值为 true ,来让 Hive 在适当的时候自动
启动这个优化。本地模式运行比集群模式块很多,33秒的任务降到2秒
更改为本地模式:
hive> set hive.exec.mode.local.auto=true
注意:
hive> set hive.exec.mode.local.auto.inputbytes.max=134217728     ---> 128M
(默认值就是128)
表示加载文件的最大值,若大于该配置仍然会以集群的方式去运行。
97万行数据,50MB
当我们开发或者测试阶段,可以去使用本地模式进行运行,默认是集群模式
但是,这里有个问题,当我们去更改为本地模式的时候,在8088的页面上就看不到
任务的执行情况了。测试:select count(*) from emp group by deptno;

1.3 并行计算

通过设置以下参数开启并行模式(默认是false)
set hive.exec.parallel=true;注意:hive.exec.parallel.thread.number
(一次SQl计算中允许并行执行的job个数最大值,默认是8个)举例:
select t1.n1,t2.n2 from (select count(ename) as n1 from emp) t1,(select count(dname) as n2 from dept) t2;
注意,有时候开启并行计算运行时间并没有不开启的快,那是因为,资源的问题。
需要两套资源,资源申请会浪费点时间,最多可以并行8个,默认是8个。
所以,并行的越多,不一定是越快,因为它涉及到一个资源申请的策略。

1.4 严格模式(理解为增加一些限制)

1.什么是Hive的严格模式
​ hive中的一种模式,在该模式下禁止一些不好SQL的执行。

2.Hive的严格模式不允许哪些SQL执行
2.1 禁止分区表全表扫描
分区表往往数据量大,如果不加分区查询会带来巨大的资源消耗 。例如以下分区表
SELECT DISTINCT(planner_id) FROM fracture_ins WHERE planner_id=5;

​ 报错如下:
​ FAILED: Error in semantic analysis: No Partition Predicate Found for Alias “fracture_ins” Table "fracture_ins

​ 解决如下:
​ SELECT DISTINCT(planner_id) FROM fracture_ins WHERE planner_id=5 AND hit_date=20120101;

2.2 禁止排序不加limit
​ 排序最终是要都进到一个Reduce中操作,防止reducer额外执行很长一段时间
​ SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id;
​ 出现如下错误
​ FAILED: Error in semantic analysis: line 1:56 In strict mode,limit must be specified if ORDER BY is present planner_id
​ 解决方案就是增加一个limit关键字:
​ hive> SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id LIMIT 100000;

2.3 禁止笛卡尔积
​ 笛卡尔积是什么: A={a,b}, B={0,1,2},则 A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

​ SELECT * FROM fracture_act JOIN fracture_ads;
​ 解决方法
​ SELECT * FROM fracture_act JOIN fracture_ads WHERE fracture_act.planner_id = fracture_ads.planner_id;

3.Hive的严格模式怎样开启

// 查看当前严格模式的状态
set hive.mapred.mode;
// 设置为严格模式
set hive.mapred.mode=strict;
// 设置为非严格模式
set hive.mapred.mode=nonstrict;
注意,这里的严格模式和动态分区的那个严格模式半毛钱关系没有)
通过设置以下参数开启严格模式:
set hive.mapred.mode=strict;
(默认为:nonstrict非严格模式)查询限制:
1、对于分区表,必须添加where对于分区字段的条件过滤
2、order by 语句必须包含limit输出限制
3、限制执行笛卡尔积的查询
这些限制是帮助我们提高查询效率的。

1.5 Hive排序(掌握distribute by和sort by) 回顾

order by 对于查询结果做全排序,只允许有一个reduce处理
(注意:它会把我们所有的字段或者查询结果全部放在一个reduce里进行处理
当数据量较大时候,有可能reduce执行不完,所以,我们以后把这个给弃用掉)**   sort by 对于单个reduce进行排序 但是我们将每个reduce里面进行排序,没有考虑到
每个reduce之间的排序。所以我们引出下一个
**   distribute by 分区排序,通常结合sort by一起使用
(distribute by column sort by column asc|desc)cluster by 相当于distribute by + sort by  (注意,虽然是两个结合,但是我们也不去用它
原因很简单,cluster by不能通过asc desc的方式指定排序方式规则)

1.6 Hive join数据倾斜(相当重要,记住这块,面试到hive数据倾斜稳过)

1、小表join小表 不管他

2、小表join大表 map-join

3、大表join大表 map-side

考虑会不会发生reduce,并且考虑reduce压力是否大(是否会出现某个reduce数据量庞大的情况)

join计算的时候,将小表(驱动表)放在join的左边
Map join:在Map端完成join
两种实现方式:
1、sql方式,在sql语句中添加Mapjoin标记(mapjoin hint)
语法糖
select /*+MAPJOIN(A)*/ * from A join B on (A.key=B.key);
>>语法:
select /*+MAPJOIN(smallTable)*/ smallTable.key bigTable.value from smallTable join bigTable on smallTable.key=bigTable.key;
2、自动开启mapjoin
通过修改以下配置启用自动的mapjoin:
set hive.auto.convert.join=true;
(注意:该参数为true的时候,Hive自动对左边的表统计量,如果
是小表,就加入到内存,即对小表使用Mapjoin)相关配置参数hive.mapjoin.smalltable.filesize;(默认25M,大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行。)hive.ignore,mapjoin.hint;(默认值:true;是否忽略mapjoin hint的标记)hive.auto.convert.join.noconditionaltask;(默认值:true;将普通的join转换为mapjoin时,是否将多个mapjoin转化为一个mapjoin)hive.auto.convert.join.noconditionaltask.size;(将多个mapjoin转化为一个mapjoin时,这个表的最大值)
3、尽可能使用相同的连接键,如果不同,多一个join就会多开启一个mapreduce,执行速度变得慢。
4、大表join大表(当两个都是大表的时候,只能发生reduce了,但是这里有两个优化策略)(面试的时候说,加分)a: 空key过滤:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的 reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。但是这个的前提条件是异常数据,但是我们一般拿到的数据都是经过ETL数据清洗过后的,一般影响不大,面试的时候可以说。b: 空key转换:有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋随机的值,使得数据随机均匀地分不到不同的 reducer上。(加盐)但是我们一般拿到的数据都是经过ETL数据清洗过后的,规则数据,一般影响不大,面试的时候可以说。
5、Map-Side聚合
通过设置以下参数开启在Map端的聚合
set hive.map.aggr=true;(一定要进行开启,虽然进行了两个mapreduce,但是当数据倾斜发生的时候,很多时候会根本跑不出结果,卡死在99%或者100%,慢总比出不来结果要好)!!!!!!!
相关配置参数hive. groupby mapaggr. checkinterval;map端 igroup by执行聚合时处理的多少行数据(默认:10000hive.map.aggr.hash.min.reduction;比例(若聚合之后的数据100大该0.5,map端聚合使用的内存的最大值hive.mapaggr.hashforce.flush.memory.threshold;map端做聚合操作是has表的最大可用内容,大于该值则会触发fushhive.groupby.skewindata-是否对 GroupBy产生的数据倾斜做优化,默认为false(十分重要!!!)
6、数据倾斜,尽可能地让我们的数据散列到不同的reduce里面去,负载均衡(Hbase中热点数据)

1.7 合并小文件

1、hadoop不适合存储小文件
2、MR不适合处理小文件
3、Hive不适合处理小文件Hive优化
合并小文件
文件数目小,容易在文件存储端造成压力,给hdfs造成压力,影响效率
设置合并属性是否合并map输出文件: hive.merge.mapfiles=true是否合并reduce输出文件: hive.merge.mapredfiles=true合并文件的大小: hive.merge.size.per.task=256*1000*1000
去重统计
数据量小的时候无所谓,数据量大的情况下,由于 COUNT DISTINCT操作需要用一个 Reduce Task来完成,
这一个 Reduce需要处理的数据量太大,就会导致整个JOb很难完成,一般 COUNT DISTINCT使用先 GROUP BY再COUNT的方式替换

1.8 控制map和reduce的数量(一般情况下我们不去动它)

控制Hive中Map以及 Reduce的数量
Map数量相关的参数
mapred.max.split.size;一个split的最大值,即每个map处理文件的最大值
mapred.min.split.size.per.node个节点上split的最小值
mapred.min.split.size.per.rack一个机架上spit的最小值
Reduce数量相关的参数
mapred.reduce.tasks;强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer每个reduce任务处理的数据量
hive.exec.reducers.max每个任务最大的reduce数

1.9 JVM重用

当我们的小文件个数过多,task个数过多,需要申请的资源过多的时候,我们可以先申请一部分资源,全部执行完毕后再释放,
比我们申请一个释放一个要快。
通过 set mapred.job.reuse.jvm.num.tasks=n;来设置
(n为task插槽个数)
缺点:
设置开启后,task插槽会一直占用资源,无论是否有task进行,直到所有的task,
即整个job全部执行完毕后,才会释放所有的task插槽,所以我们要合理地设置这个n
(比如,我们设置申请了10个,但是现在来了6个,剩下4个插槽会在job全部执行完毕之前一直占用资源)

mapreduce叫懒加载,当执行任务需要资源的时候再去申请资源

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

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

相关文章

java 反序列化 cc4 复现

java 反序列化 cc4 复现复现环境:jdk<=8u65,commonsCollections=4.0 CommonsCollections4.x版本移除了InvokerTransformer类不再继承Serializable,导致无法序列化.但是提供了TransformingComparator为CommonsCollections3.x所没有的,又带来了新的反序列化危险. cc4的执行命令…

ICMP 重定向攻击

ICMP 重定向攻击原理 ICMP (Internet Control Message Protocol) :Internet 控制报文协议,用于在 IP 主机和 路由器之间传递控制消息(控制消息指网络是否通、主机是否可达、路由器是否可用等)ICMP 重定向 在某些特定情况下,路由器在检测到主机使用非优化路由时,会向主机发送…

java 反序列化 cc3 复现

java 反序列化 cc3 复现版本要求:jdk版本<=8u65,common-collections版本<=3.2.1 在很多时候,Runtime会被黑名单禁用.在这些情况下,我们需要去构造自定义的类加载器来加载自定义的字节码. 类加载机制 双亲委派 这里直接粘别人的了.实现一个自定义类加载器需要继承 ClassLo…

使用Tailwind CSS的几个小Tips

前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别。它的工作原理是扫描所有 HTML 文件、JavaScript 文件以及任何模板中的 CSS 类名,然后生成相应的样式代码并写入到一个静态 CSS 文件中。Tailwind CSS 快速、灵活、可靠、没有运行时负担。自从接…

给朋友写的爬Steam游戏评论的爬虫

详见配图如果你需要的话,可以从这里下载(包括程序、说明和演示视频): https://pan.baidu.com/s/1lN-DNTB7pVXan94hCsqYUQ?pwd=72mg(本来想传蓝奏云的,但是蓝奏云不支持传图片和视频,而且单文件大小有限制,弄起来会比百度云盘还麻烦)

apisix~限流插件的使用

参考:https://i4t.com/19399.html https://github.com/apache/apisix/issues/9193 https://github.com/apache/apisix/issues/9830 https://apisix.apache.org/docs/apisix/plugins/limit-conn/ https://blog.frankel.ch/different-rate-limits-apisix/在 Apache APISIX 中,限…

项目冲刺11.14

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第六篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

研途无忧Alpha冲刺第二天

Alpha冲刺dya2 研途无忧-冲刺日志(第二天) 进度表成员 完成的任务 完成的任务时长 剩余时间马鑫 小研帮部分页面的前端设计、部分工作安排与调整、冲刺日志的撰写 4h 14h王强 小研帮部分页面的前端设计、小研帮数据库的完善、相关云函数的设计 4h 14h黄昕怡 研小fu性格的切换…

K-Means聚类分析以及误差平方和SSE(Python实现)

代码介绍 使用 make_blobs 函数生成一个二维的随机数据集,包含120个样本和3个中心。生成的数据将用于后续的聚类分析。 数据生成后,通过散点图可视化这些点,展示不同的聚类中心。 定义了一个函数 calculate_sse,用于计算给定聚类数 k 时的误差平方和(SSE)。该函数使用K-M…

数字孪生如何赋能智慧能源?揭秘技术背后的核心价值

随着能源行业不断向智能化、数字化转型,数字孪生技术在智慧能源项目中扮演的角色愈发重要。数字孪生不仅带来了前所未有的资源优化和成本节约方式,还为整个能源系统的可持续运营奠定了坚实基础。那么,为什么数字孪生技术在智慧能源项目中如此不可或缺?下面我就从可视化从业…

激活函数

一、正向传播和反向传播在模型训练过程中,是同时包含正向传播和反向传播的正向传播是模型根据输入数据和当前的参数(权重和偏置)计算预测输出的过程。例如,在一个图像分类神经网络模型中,输入是图像的像素数据,经过多个隐藏层的计算,最终在输出层得到预测的类别概率分布…

centOS7 docker 安装步骤

一、安装前检查工作: 1.检查/etc/yum.repos.d/CentOS-Base.repo文件是否存在,如果不存在,从网络仓库中复制一份新的 CentOS-Base.repo 文件。 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或者使用 wget: sudo wget -O /…