hive调优

Hive(数据仓库)Hive 调优 10.hive调优 10.1 Fetch抓取 Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM score;在这种情况下,Hive可以简单地读取score对应的存储目录下的文件,然后输出查询结果到控制台。通过设置hive.fetch.task.conversion参数,可以控制查询语句是否走MapReduce. 案例实操: 1)把hive.fetch.... 阅读详情

12.hive调优

12.1 Fetch抓取

Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM score;在这种情况下,Hive可以简单地读取score对应的存储目录下的文件,然后输出查询结果到控制台。通过设置hive.fetch.task.conversion参数,可以控制查询语句是否走MapReduce.

案例实操:

1)把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。

set hive.fetch.task.conversion=none;

select * from score;
select s_score from score;
select s_score from score limit 3;

2)把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。

set hive.fetch.task.conversion=more;

select * from score;
select s_score from score;
select s_score from score limit 3;

###10.2 本地模式

大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。

案例实操:

1)开启本地模式,并执行查询语句

set hive.exec.mode.local.auto=true; 
select * from score cluster by s_id;

2)关闭本地模式,并执行查询语句

set hive.exec.mode.local.auto=false; 
select * from score cluster by s_id;

###10.3 MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会在Reduce阶段完成join,容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

1)开启MapJoin参数设置:

(1)设置自动选择Mapjoin

set hive.auto.convert.join = true; 

(2)大表小表的阈值设置(默认25M以下认为是小表):

set hive.mapjoin.smalltable.filesize=25123456;

###10.4 Group By

默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。

开启Map端聚合参数设置

(1)是否在Map端进行聚合,默认为True

set hive.map.aggr = true;

(2)在Map端进行聚合操作的条目数目

 set hive.groupby.mapaggr.checkinterval = 100000;

(3)有数据倾斜的时候进行负载均衡(默认是false)

  set hive.groupby.skewindata = true;

当选项设定为 true,生成的查询计划会有两个MR Job。

第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;

第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

###10.5 Count(distinct)

数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换:

select count(distinct s_id) from score;
select count(s_id) from (select id from score group by s_id) a;

虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。

###10.6 笛卡尔积

尽量避免笛卡尔积,即避免join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。

###10.7 动态分区调整

往hive分区表中插入数据时,hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。使用Hive的动态分区,需要进行相应的配置。

Hive的动态分区是以第一个表的分区规则,来对应第二个表的分区规则,将第一个表的所有分区,全部拷贝到第二个表中来,第二个表在加载数据的时候,不需要指定分区了,直接用第一个表的分区即可

####10.7.1 开启动态分区参数设置

(1)开启动态分区功能(默认true,开启)

set hive.exec.dynamic.partition=true;

(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)

set hive.exec.dynamic.partition.mode=nonstrict;

(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。

set  hive.exec.max.dynamic.partitions=1000;

(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。

set hive.exec.max.dynamic.partitions.pernode=100

(5)整个MR Job中,最大可以创建多少个HDFS文件。

​ 在linux系统当中,每个linux用户最多可以开启1024个进程,每一个进程最多可以打开2048个文件,即持有2048个文件句柄,下面这个值越大,就可以打开文件句柄越大

set hive.exec.max.created.files=100000;

(6)当有空分区生成时,是否抛出异常。一般不需要设置。

set hive.error.on.empty.partition=false;

####10.7.2 案例操作

需求:将ori中的数据按照时间(如:20111231234568),插入到目标表ori_partitioned的相应分区中。

(1)准备数据原表

create table ori_partitioned(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) 
PARTITIONED BY (p_time bigint) 
row format delimited fields terminated by '\t';

load data local inpath '/export/servers/hivedatas/small_data' into  table ori_partitioned partition (p_time='20111230000010');

load data local inpath '/export/servers/hivedatas/small_data' into  table ori_partitioned partition (p_time='20111230000011');

(2)创建目标分区表

create table ori_partitioned_target(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) PARTITIONED BY (p_time STRING) row format delimited fields terminated by '\t'

(3)向目标分区表加载数据

如果按照之前介绍的往指定一个分区中Insert数据,那么这个需求很不容易实现。这时候就需要使用动态分区来实现。

INSERT overwrite TABLE ori_partitioned_target PARTITION (p_time)
SELECT id, time, uid, keyword, url_rank, click_num, click_url, p_time
FROM ori_partitioned;

注意:在SELECT子句的最后几个字段,必须对应前面**PARTITION (p_time)**中指定的分区字段,包括顺序。

(4)查看分区

show partitions ori_partitioned_target; 

12.8 并行执行

Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。

​ 通过设置参数hive.exec.parallel值为true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。

set hive.exec.parallel = true;

当然,得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。

12.9 严格模式

Hive提供了一个严格模式,可以防止用户执行那些可能意向不到的不好的影响的查询。

​ 通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。

set hive.mapred.mode = strict; #开启严格模式
set hive.mapred.mode = nostrict; #开启非严格模式

1)对于分区表,在where语句中必须含有分区字段作为过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。

2)对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。

3)限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。

12.10 JVM重用

JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。

Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。

我们也可以在hive当中通过

set  mapred.job.reuse.jvm.num.tasks=10;

这个设置来设置我们的jvm重用

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

12.11 推测执行

在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生,Hadoop采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。

设置开启推测执行参数:

set mapred.map.tasks.speculative.execution=true
set mapred.reduce.tasks.speculative.execution=true
set hive.mapred.reduce.tasks.speculative.execution=true;

关于调优这些推测执行变量,还很难给一个具体的建议。如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,那么启动推测执行造成的浪费是非常巨大大。

Hive 调优 摘要:hive调优 阅读详情

相关推荐

hive优化之参数调优

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 hive优化之参数调优 1、hive参数优化之默认启用本地模式 启动hive本地模式参数,一般建议将其设置为true,即时刻

xingdianp的博客 4070

Hive参数性能调优

yarn.nodemanager.resource.memory-mb 65536 --设置nodemanager分配给yarn的可用内存 yarn.nodemanager.resource.cpu-vcores 40 --设置nodemanager分配给yarn的可用虚拟CPU yarn.nodemanager.vmem-pmem-ratio 2.1 --虚拟内存比例 yarn.scheduler.maximum-allocation-mb 65536 .

黑曼巴 9193

Hive 调优总结,让 Hive 调优想法不再碎片化

根据 MapReduce 运行全流程,对每个环节进行调优 MapReduce 运行流程图 MapReduce 运行流程关键环节及相关参数 文件输入:对文件进行切片,可设置切片大小,可设置是否合并小文件 Map:Map 数量 = 输入文件切片数量 Map 文件输出:是否合并设置,合并为多大,什么情况下会合并 Reduce: hive 自动计算 reduce 个数 或者 显式指定 reduce 个数 Reduce 文件输出:是否合并,合并为多大,什么情况下合并 最终文件压缩:job 之间

javalingyu的博客 2648

Hive 性能调优大全

Hive 性能调优大全

ytp552200ytp的博客 5701

Hive调优

Hive调优总结:1. 改硬件.2. 开启或者增大某些设置(配置). 负载均衡, 严格模式(禁用低效SQL), 动态分区数...3. 关闭或者减小某些设置(配置). 严格模式(动态分区), 推测执行...4. 减少IO传输. Input(输入)/Output(输出), 列存储orc, 压缩协议snappy, join优化。

weixin_65265621的博客 1119

Hive性能调优指导 --项目优化(指导书)

详细的Hive性能调优指导 推荐收藏学习

编程技术、独立开发、技术资讯以及编程感悟等内容 1800

Hive的十四种调优方式:

Hive的十四种调优方式: 第一种调优方式:fetch(hive可以避免MapReduce)对于hive可以简单地读取employee对应的储存目录下的文件,然后输出查询结果到控制台.修改hive.fetch.task.conversion默认是more,老版本为minimal,修改为more即可 第二种:本地模式(在hive输入数据量是非常小的情况下,可以通过本地模式处理单台机器上所有的任务,...

weixin_43662454的博客 1389

[hive] hive的调优手段总结

hive调优 1 fetch抓取 Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算 在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。 [hive-site.xml]...

朱同学的博客 557

hive 调优总结

hive调优是比较大的专题,需要结合实际的业务,数据的类型,分布,质量状况等来实际的考虑如何进行系统性的优化,hive底层是mapreduce,所以hadoop调优也是hive调优的一个基础,hvie调优可以分为几个模块进行考虑,数据的压缩与存储,sql的优化,hive参数的优化,解决数据的倾斜等。 一,数据的压缩与存储格式 对分析的数据选择合适的存储格式与压缩方式能提高hive的分析效率: ...

YI依仔的博客 3万+

Hive常见调优总结

基础设置 队列选择 yarn队列分配,选择合适的队列进行运行,避免都在同一个繁忙的队列中运行。 SET mapreduce.job.queuename=xx; 控制mapper&reducer数目 合理控制文件切分的各种参数,使Mapper和Reducer数目达到一个合适的值,可以加快处理速度。 // HiveInputFormat文件格式 # 文件分割最大大小 set mapreduce.input.fileinputformat.split.maxsize=536870912; # 文件分割最

进击的数据小白 1428

STM32异常与中断过程详解

1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来

luobeihai的博客 1万+

Hive调优相关总结

写在前 我们都知道Hive默认的执行引擎是MR,在没有对Hive执行引擎改造之前(如HDP的TEZ,Hive on Spark项目),我们对Hive的调优依然只能围绕Hive本身支持的如存储格式,压缩,参数,SQL语句等方面的优化做出考虑。 存储与压缩 关于Hive存储格式和压缩方式的选择和使用,这里就不再做介绍,请参考以前博客存储格式和压缩方式 Hive 调优参数 因为Hive的默认执行引擎为MR,所以基于Hive的参数调优,主要还是MR的参数调优以及Hive客户端的一些设置 1.开启Hi

Realoyou的博客 6万+

qcom bypass node介绍

介绍qcom bypass node,以及如何让其生效

haodada1226的博客 2043

Sql调优+Hive调优+Spark调优

select * from a join (select 列1,列2...,if(id is null,concat(10,rand()),id)id from b)b on a.id=b.id;3.桶表 join 桶表,且表A的桶的数量,是表B的桶的数量的整数值,则可以用分桶字段 替代 关联字段,即: on a.id=b.id=>on a.分桶字段=b.分桶字段;默认情况下,1个分区=1个ReduceTask任务=1个最终结果文件,如果要调整ReduceTask数量,就手动调整分区数量。

Taker256的博客 1364

Halcon-AOI外观缺陷检测系列

Halcon-AOI外观缺陷检测系列

Jumy_S的博客 1667

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

围炉夜敲的博客 1万+

Hive函数与调优

文章目录Hive函数与调优函数系统内置函数自定义函数1.UDF函数2.UDTF函数调优开启map阶段输出压缩开启reducer阶段的数据压缩文件存储格式测试存储和压缩企业级调优Fetch抓取本地模式表的优化1.小表、大表join2.大表join大表3.MapJoin(小表join大表)4.Group By5.Count(Distinct)去重统计6.笛卡尔积7.行列过滤8.动态分区调整合理设置Ma...

takeuherat的博客 557

遗传算法驱动吃豆人进化:从零构建AI游戏智能体

遗传算法是一种模拟自然选择过程的优化技术,其核心原理是通过选择、交叉和变异等操作,在解空间中迭代搜索最优解。该技术为解决复杂优化问题提供了强大工具,尤其在游戏AI、机器人控制和参数调优等场景中价值显著。在游戏AI领域,遗传算法常被用于训练智能体自主决策,例如在经典游戏《吃豆人》中,通过定义智能体的“基因”(如神经网络权重)和“适应度”(如游戏得分),可以引导其进化出躲避幽灵、高效吃豆等策略。本项目结合Pygame框架与神经网络,构建了一个完整的遗传算法训练沙盒,详细展示了如何通过适应度函数设计和参数调优,实

weixin_30467199的博客 273

Hive应用 | Hive性能调优

Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大、数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构优化、参数优化以及Hive SQL优化三个方面考虑。

xinghaoyan的专栏 1050

Virtuoso 中的tech file 详细说明

工艺文件(Techfile)是集成电路设计中的核心配置文件,定义了从晶圆制造到版图验证全流程所需的工艺规则和图层属性。在Cadence Virtuoso平台中,Techfile作为连接设计与制造的桥梁,主要包含以下内容: 图层体系定义 金属层、介质层、多晶硅层等物理图层的编号、名称和显示属性 图层用途(DRAW、MASK等)及图层-用途组合(LPP)的优先级 设计规则约束 几何尺寸规则(最小线宽/间距) 包围和延伸规则 密度规则和特殊工艺规则(如天线效应) 器件定义 MOS管、电阻等器件的图层构成 电学参数

u013620135的博客 8128

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

【Hive入门】Hive性能调优之资源配置:深入解析执行引擎参数调优

合理的资源配置是Hive性能调优的基础,本文将深入探讨如何通过调整MapReduce、Tez和Spark三种执行引擎的内存与并发参数来优化Hive查询性能。

IT成长日记的博客 1874

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

算法大师! 1604
上一篇: HIVE数据压缩技术和存储压缩技术
下一篇: 使用docker部署rabbitMQ
精诚所至金石为开
博客等级 码龄8年 12粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值