Hive调优技巧

1.Fetch抓取

set hive.fetch.task.conversion=more(默认)
1

Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算。
该属性设置为 more 以后,在全局查找、字段查找、limit 查找等都不走 MapReduce。 设置为none后所有类型的查找语句都要走MapReduce;

2.本地模式

set hive.exec.mode.local.auto=true(开启本地模式)
1

Hive 可以通过本地模式在单台机器上 处理所有的任务。对于小数据集,执行时间可以明显被缩短
1.开启本地模式后需要设置local mr的最大输入数据量,当数据量小于这个值时采用local mr的方式

set hive.exec.mode.local.auto.inputbytes.max=134217728(默认)
1

2.开启本地模式后需要设置local mr的最大输入文件个数,当数据量小于这个值时采用local mr的方式

set hive.exec.mode.local.auto.input.files.max=4(默认)
1

3.表的优化

3.1小表join大表 (小表需要在左边.)

注: 新版的 hive 已经对小表 JOIN 大表和大表 JOIN 小表进行了优化。小表放在左边和右边已经没有明显区别

3.2大表join大表

当一个表内有许多空值时会导致MapReduce过程中,空成为一个key值,对应的会有大量的value值, 而一个key的value会一起到达reduce造成内存不足;所以要想办法过滤这些空值.
1.通过查询所有不为空的结果

   insert overwrite table jointable select n.* from
   (select * from nullidtable where id is not null ) n left join ori o on n.id = o.id;
12

2.查询出空值并给其赋上随机数,避免了key值为空

insert overwrite table jointable
select n.* from nullidtable n full join ori o on
case when n.id is null then concat(‘hive‘, rand()) else n.id end = o.id;
123

注:此方法可以解决数据倾斜的问题

3.3MapJoin

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

设置MapJoin

set hive.auto.convert.join = true(默认)
1

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

 set hive.mapjoin.smalltable.filesize=25000000;
1

3.4Group BY

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

开启Map端聚合参数设置
是否在Map段进行聚合,默认为true

hive.map.aggr = true
1

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

hive.groupby.mapaggr.checkinterval = 100000
1

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

hive.groupby.skewindata = true
1

注: 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以 保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

3.5Count(Distinct)去重统计

Count Distinct是使用了一个mapreduce ,当数据较少时无影响当数据较大时 只使用一个MapReduce将很难完成job。这是需要用到分组 Group BY 会使用2个MapReduce完成因为设置了 set mapreduce.job.reduces = 5; 所以第一个MapReduce的过程是通过一个map和5个reduce来完成这样减轻了reduce的负载, 虽然会多用一个 Job 来完成,但在数据量大的情况下,这个绝对是值得的。

3.6行列过滤

  • 列处理: 在select中,只拿需要的列,尽量使用分区过滤,少用select*
  • 行处理: 在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在where后面那么就会先全表关联,之后再过滤。

实例:
1.测试先关联两张表,再用 where 条件过滤

hive (default)> select o.id from bigtable bjoin ori o on o.id = b.idwhere o.id <= 10;
1

2.通过子查询后,再关联表

hive (default)> select b.id from bigtable b join (select id from ori where id <= 10 ) o on b.id = o.id;
1

3.7.动态分区

关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用 Hive 的动态分区,需要进行相应的配置。
首先要设置的属性

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;
123456

模拟动态分区

 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;
12

4.数据倾斜

4.1合理设置Map数

设置切片值

set mapreduce.input.fileinputformat.split.maxsize=???
1

4.2小文件进行合并

在 map 执行前合并小文件,减少 map 数:CombineHiveInputFormat 具有对小文件进行
合并的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。

set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
1

4.3复杂文件增加Map数

 set mapreduce.job.maps =???
1

4.4合理设置Reduce数

1.调整reduce的个数方法一
每个Reduce处理的数据默认是256MB

hive.exec.reducers.bytes.per.reducer=256000000
1

每个任务最大的reduce数,默认为1009

hive.exec.reducers.max=1009
1

计算reduce数的公式

N=min(参数2,总输入数据量/参数1)
1

2.调整reduce个数的方法二

set mapreduce.job.reduces=???
1

3.reduce个数不是越多越好

  • 过多的启动和初始化 reduce 也会消耗时间和资源;
  • 另外,有多少个 reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;在设置 reduce 个数的时候也需要考虑这两个原则:处理大数据量利用合适的 reduce 数;使单个 reduce 任务处理数据量大小要合适;

4.5并行执行

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

set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个 sql 允许最大并行度,默认为 8。

原文地址:https://blog.51cto.com/14309075/2415633

时间: 2024-11-02 01:28:16

Hive调优技巧的相关文章

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

101个MySQL的调优技巧(1)

MySQL是一个功能强大的开源数据库. 随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限. 这里是101条调节和优化MySQL安装的技巧. 一些技巧是针对特定的安装环境的,但这些思路是通用的. 我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中--在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是

20个Linux服务器性能调优技巧

Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要目的是高效处理非交互式进程,响应时间并不是那么重要,相反,能够长时间处理高负载才是最关键的. Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级.Linux服务器有各种用途

[转]20个你不得不知的Linux服务器性能调优技巧

Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要目的是高效处理非交互式进程,响应时间并不是那么重要,相反,能够长时间处理高负载才是最关键的.Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级. Linux服务器有各种用途

Hive调优实战

Hive优化总结 ---by 食人花 优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜. 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的.map reduce作业初始化的时间是比较长的. 3.对su

11 个简单的 Java 性能调优技巧

大多数开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识.好吧,不能说这是完全错误的.优化应用程序以获得最佳性能不是一件容易的事情.但是,这并不意味着如果你不具备这些知识,就不能做任何事情.这里有11个易于遵循的建议和最佳实践可以帮助你创建一个性能良好的应用程序. 大部分建议是针对Java的.但也有若干建议是与语言无关的,可以应用于所有应用程序和编程语言.在讨论专门针对Java的性能调优技巧之前,让我们先来看看通用技巧. 1.在你知道必要之前不要优化 这可能是最重要的性能调整技巧之一.你

11 个简练的 Java 性能调优技巧

想要让你的项目一直高性能运作吗?以下有一些技巧你可以拿去消除缓存瓶颈,还有一些其他的性能调优建议. 大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论.好吧,这也不完全错.优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味着你没有相关的知识就什么也做不了.这里有一些易于遵循的建议和最佳实践可以帮助你创建一个性能良好的应用程序. 这些建议的大部分都是针对 Java 语言的.但是也有一些是跟语言无关的,你可以运用到任意的应用和程序中.在我们学习特定的 Java

Hive调优-萌贝树母婴无骗子

1 Fetch 抓取 Hive调优-萌贝树母婴无骗子,Fectch 抓取是指对某些情况下的查询不必使用 MapReduce 计算将 hive.fetch.task.conversion 设置成 more,在全局查找.字段查找.limit查找等都不走 MapReduce2 本地模式 Hive调优-萌贝树母婴无骗子,多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的,不过,有时 Hive 的输入数据量是非常小的,在这种情况下,为查询触发执行任务消耗的时间可能会比

iOS开发25个性能调优技巧

1. 用ARC管理内存 ARC(Automatic Reference Counting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你管理retain和release的过程,所以你就不必去手动干预了. 下面是你会经常用来去创建一个View的代码段: 1 2 3 4 UIView *view = [[UIView alloc] init];  // ...  [self.view addSubview:view];  [view