hive 参数设置 hive动态分区参数配置

一、Hive优化的十大方法

Hive用的好,才能从数据中挖掘出更多的信息来。用过hive的朋友,我想或多或少都有类似的经历:一天下来,没跑几次hive,就到下班时间了。Hive在极大数据或者数据不平衡等情况下,表现往往一般,因此也出现了presto、spark-sql等替代品。这里重点讲解hive的优化方式,例如

一.表连接优化

二.用insert into替换union all

如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into语句,实际测试过程中,执行时间能提升50%。示例参考如下:

可以改写为:

三. order by& sort by

order by:对查询结果进行全局排序消耗时间长,需要set hive.mapred.mode=nostrict

sort by:局部排序,并非全局有序,提高效率。

四. transform+python

一种嵌入在hive取数流程中的自定义函数,通过transform语句可以把在hive中不方便实现的功能在python中实现,然后写入hive表中。示例语法如下:

如果除python脚本外还有其它依赖资源,可以使用ADD ARVHIVE。

五. limit语句快速出结果

一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。有一个配置属性可以开启,避免这种情况—对数据源进行抽样

缺点:有可能部分数据永远不会被处理到

六.本地模式

对于小数据集,为查询触发执行任务消耗的时间>实际执行job的时间,因此可以通过本地模式,在单台机器上(或某些时候在单个进程上)处理所有的任务。

可以通过设置属性hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化,也可以将这个配置写在$HOME/.hiverc文件中。

当一个job满足如下条件才能真正使用本地模式:

七.并行执行

Hive会将一个查询转化为一个或多个阶段,包括:MapReduce阶段、抽样阶段、合并阶段、limit阶段等。默认情况下,一次只执行一个阶段。不过,如果某些阶段不是互相依赖,是可以并行执行的。

会比较耗系统资源。

八.调整mapper和reducer的个数

假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数

假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数。

即如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。

map执行时间:map任务启动和初始化的时间+逻辑处理的时间。

减少map数

若有大量小文件(小于128M),会产生多个map,处理方法是:

前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并。

set hive.input.format=org.apache.hadoop.hive.ql.io.Com**neHiveInputFormat;–执行前进行小文件合并。

增加map数

当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

set mapred.reduce.tasks=?

一般根据输入文件的总大小,用它的estimation函数来自动计算reduce的个数:reduce个数= InputFileSize/ bytes per reducer

九.严格模式

十.数据倾斜

表现:

任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。长时长远大于平均时长。

原因:

解决方案:参数调节

二、怎么设置hive中map 个数

控制hive任务中的map数:

1.通常情况下,作业会通过input的目录产生一个或者多个map任务。

主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M,可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);

2.举例:

a)假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数

b)假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数

即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。

3.是不是map数越多越好?

答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,

而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。

而且,同时可执行的map数是受限的。

4.是不是保证每个map处理接近128m的文件块,就高枕无忧了?

答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,

如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。

针对上面的问题3和4,我们需要采取两种方式来解决:即减少map数和增加map数;

如何合并小文件,减少map数?

假设一个SQL任务:

Select count(1) from popt_tbaccountcopy_mes where pt=‘2012-07-04’;

该任务的inputdir/group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04

共有194个文件,其中很多是远远小于128m的小文件,总大小9G,正常执行会用194个map任务。

Map总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020

我通过以下方法来在map执行前合并小文件,减少map数:

set mapred.max.split.size=100000000;

set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000;

set hive.input.format=org.apache.hadoop.hive.ql.io.Com**neHiveInputFormat;

再执行上面的语句,用了74个map任务,map消耗的计算资源:SLOTS_MILLIS_MAPS= 333,500

对于这个简单SQL任务,执行时间上可能差不多,但节省了一半的计算资源。

大概解释一下,100000000表示100M, set hive.input.format=org.apache.hadoop.hive.ql.io.Com**neHiveInputFormat;这个参数表示执行前进行小文件合并,

前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),

进行合并,终生成了74个块。

如何适当的增加map数?

当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

假设有这样一个任务:

Select data_desc,

count(1),

count(distinct id),

sum(case when…),

sum(case when...),

sum(…)

from a group by data_desc

如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,

这样就可以用多个map任务去完成。

set mapred.reduce.tasks=10;

create table a_1 as

select* from a

distribute by rand(123);

这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。

每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。

看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方,

根据实际情况,控制map数量需要遵循两个原则:使大数据量利用合适的map数;使单个map任务处理合适的数据量;

三、hive动态分区参数配置***利用sql怎么设置

静态分区SP(static partition)

动态分区DP(dynamic partition)

静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。

二)实战演示如何在Hive中使用动态分区

1、创建一张分区表,包含两个分区dt和ht表示日期和小时

[sql] view plain copy

CREATE TABLE partition_table001

(

name STRING,

ip STRING

)

PARTITIONED BY(dt STRING, ht STRING)

ROW FORMAT DELIMITED FIELDS TERMINATED BY"\t";

2、启用hive动态分区,只需要在hive会话中设置两个参数:

相关文章

哈曼卡顿音乐琉璃3代三代使用心得反馈

哈曼卡顿音乐琉璃3代三代使用心得反馈

很多小伙伴在关注哈曼卡顿音乐琉璃3代三代怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

AppleWatch价格多少钱

AppleWatch价格多少钱

很多小伙伴在关注AppleWatch怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

梓润1080p高清会议记录仪DV摄像机摄像头高清家用监控户外随身便携式录像机穿戴背夹式口袋录像神器测评分享

梓润1080p高清会议记录仪DV摄像机摄像头高清家用监控户外随身便携式录像机穿戴背夹式口袋录像神器测评分享

很多小伙伴在关注梓润1080p高清会议记录仪DV摄像机摄像头高清家用监控户外随身便携式录像机穿戴背夹式口袋录像神器怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使...

唱吧无线麦克风小巨蛋G2升级版蓝牙音响手机K歌宝使用反馈分享

唱吧无线麦克风小巨蛋G2升级版蓝牙音响手机K歌宝使用反馈分享

很多小伙伴在关注唱吧无线麦克风小巨蛋G2升级版蓝牙音响手机K歌宝怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产...

PICO4质量怎么样

PICO4质量怎么样

很多小伙伴在关注PICO4怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

ESCASEairpods好不好用

ESCASEairpods好不好用

很多小伙伴在关注ESCASEairpods怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...