hive调优的方法(总结实战篇)

说明:本文参考尚硅谷hive教材

1.Fetch 抓取

Fetch 抓取是指, Hive 中对某些情况的查询可以不必使用 MapReduce 计算。例如:SELECT * FROM employees;在这种情况下, Hive 可以简单地读取 employee 对应的存储目录下的文件,然后输出查询结果到控制台。在 hive-default.xml.template 文件中 hive.fetch.task.conversion 默认是 more,老版本 hive默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、 limit 查找等都不走mapreduce。

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

hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;


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

hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;


2.本地模式

Hive 可以通过本地模式在单台机器上处理所有的任务。 对于小数据集,执行时间可以明显被缩短。

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

案例实操:

1)开启本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select * from emp cluster by deptno;
Time taken: 1.328 seconds, Fetched: 14 row(s)
2)关闭本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=false;
hive (default)> select * from emp cluster by deptno;
Time taken: 20.09 seconds, Fetched: 14 row(s)

3.表的优化

3.1 小表、大表 Join

将 key 相对分散,并且数据量小的表放在 join 的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用 map join 让小的维度表(1000 条以下的记录条数) 先进内存。在 map 端完成 reduce实际测试发现:新版的 hive 已经对小表 JOIN 大表和大表 JOIN 小表进行了优化。小表放在左边和右边已经没有明显区别。

案例实操:

1. 需求
测试大表 JOIN 小表和小表 JOIN 大表的效率
2.建大表、小表和 JOIN 后表的语句

// 创建大表
create table bigtable(id bigint, time bigint, uid string,
keyword string, url_rank int, click_num int, click_url string)
row format delimited fields terminated by '\t';
// 创建小表
create table smalltable(id bigint, time bigint, uid string,
keyword string, url_rank int, click_num int, click_url string)
row format delimited fields terminated by '\t';
// 创建 join 后表的语句
create table jointable(id bigint, time bigint, uid string,
keyword string, url_rank int, click_num int, click_url string)
row format delimited fields terminated by '\t';

3.分别向大表和小表中导入数据

hive (default)> load data local inpath
'/opt/module/data/bigtable' into table bigtable;
hive (default)>load data local inpath
'/opt/module/data/smalltable' into table smalltable;

4.关闭 mapjoin 功能(默认是打开的)
set hive.auto.convert.join = false;
5.执行小表 JOIN 大表语句

insert overwrite table 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值