Hive 作业优化
1、Join原则
将条目少的表/子查询放在 Join的左边。 原因是在 Join 操作的 Reduce 阶段,位于 Join左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出的几率。
当一个小表关联一个超大表时,容易发生数据倾斜,可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。
如:SELECT /*+ MAPJOIN(user) */ l.session_id, u.username from user u join page_views l on (u. id=l.user_id) ;
2、笛卡尔积
当Hive设定为严格模式(hive.mapred.mode=strict)时,不允许在HQL语句中出现笛卡尔积。
当无法躲避笛卡尔积时,采用MapJoin,会在Map端完成Join操作,将Join操作的一个或多个表完全读入内存。
MapJoin的用法是在查询/子查询的SELECT关键字后面添加/*+ MAPJOIN(tablelist) */提示优化器转化为MapJoin 。
其中tablelist可以是一个表,或以逗号连接的表的列表。tablelist中的表将会读入内存,应该将小表写在这里
3、控制Map数
同时可执行的map数是有限的。
•通常情况下,作业会通过input的目录产生一个或者多个map任务
•主要的决定因素有: input的文件总个数,input的文件大小。
•举例
a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(block为128M,6个128m的块和1个12m的块),从而产生7个map数
b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数
两种方式控制Map数:即减少map数和增加map数
减少map数可以通过合并小文件来实现,这点是对文件数据源来讲。
增加map数的可以通过控制上一个job的reduer数来控制,见5.
4、设置合理reducer个数
•reducer个数的设定极大影响执行效率
•不指定reducer个数的情况下,Hive分配reducer个数基于以下:
参数1:hive.exec.reducers.bytes.per.reducer(默认为1G)
参数2 :hive.exec.reducers.max(默认为999)
•计算reducer数的公式
•N=min(参数2,总输入数据量/参数1)
set mapred.reduce.tasks=13;
•reduce个数并不是越多越好
同map一样,启动和初始化reduce也会消耗时间和资源;有多少个reduce,就会有多少个输出文件。
Reducer数过多:
生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题。
Reducer过少:
影响执行效率。
•什么情况下只有一个reduce
很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;
1、 除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外
2、没有group by的汇总
3、用了Order by。
5、合并MapReduce操作
• Multi-group by:当从同一个源表进行多次查询时用。
•Multi-group by是Hive的一个非常好的特性,它使得Hive中利用中间结果变得非常方便
•FROM log
insert overwrite table test1 select log.id group by log.id
insert overwrite table test2 select log.name group by log.name
• 上述查询语句使用了Multi-group by特性连续group by了2次数据,使用不同的group by key。这一特性可以减少一次MapReduce操作。
6 、LEFT SEMI JOIN
是 IN/EXISTS 子查询的一种更高效的实现。
Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
可以被重写为:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
只能在 ON 子句中设置过滤条件。
7、Hive注意事项
- 只支持INSERT/LOAD操作,无UPDATE和DELTE
- 0.10之前版本没有索引
- 不支持HAVING操作。
- 不支持where子句中的子查询
- Join只支持等值关联
- Hive中string类型没有长度限制
Not用法:
关系数据库:
… where username not like(in) ..
Hive
… where not username like(in)..
转自:https://blog.csdn.net/youfashion/article/details/72862453
Hive 作业优化的更多相关文章
- hive作业的优化策略
Mapreduce自身的特点: 1.IO和网络负载大:优化策略:减少IO和网络负载. 2.内存负载不大.优化策略:增大内存使用率: 3.CPU负载不大.优化策略:增大CPU使用率: (hive的优化应 ...
- Hive性能优化
1.概述 继续<那些年使用Hive踩过的坑>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先 ...
- 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)
一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...
- Hive性能优化上的一些总结
https://blog.csdn.net/mrlevo520/article/details/76339075 1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据 ...
- Hive 常用优化参数
常用调优测试语句 : ①显示当前hive环境的参数值: set 参数名; 如: hive> set mapred.map.tasks;mapred.map.tasks; ②设置hi ...
- Hive性能优化(全面)
1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次 ...
- Hive SQL 优化面试题整理
Hive优化目标 在有限的资源下,执行效率更高 常见问题: 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce 执行计划 ...
- Hive篇---Hive使用优化
一.前述 本节主要描述Hive的优化使用,Hive的优化着重强调一个 把Hive SQL 当做Mapreduce程序去优化 二.主要优化点 1.Hive运行方式:本地模式集群模式 本地模式开启本地模式 ...
- Spark集群之yarn提交作业优化案例
Spark集群之yarn提交作业优化案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.启动Hadoop集群 1>.自定义批量管理脚本 [yinzhengjie@s101 ...
随机推荐
- mysql 查看表结构方法
留给自己备查: mysql 导出为 csv 文件时如果直接使用导出命令是无法导出表结构的, 因此我们需要能够查询表结构的方法: 方法如下: 1.desc(描述)命令 desc tablename;de ...
- 训练指南 UVALive - 3989(稳定婚姻问题)
ayout: post title: 训练指南 UVALive - 3989(稳定婚姻问题) author: "luowentaoaa" catalog: true mathjax ...
- 母亲的牛奶(milk) (BFS)
问题 A: 母亲的牛奶(milk) 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 8[提交][状态][讨论版] 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C ...
- ubuntu 16.04.1 LTS zabbix-agent安装
$ wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+xeni ...
- [BZOJ4772]显而易见的数论(数论)
4772: 显而易见的数论 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 76 Solved: 32[Submit][Status][Discuss ...
- 【C语言】 Linux下编译提示pow未定义引用
如下代码: #include <stdio.h> // 调用基本输入输出函数库 #include <math.h> #define PI 3.14 // 定义常量 float ...
- windows server 2012将计算机图标添加到桌面(图文教程)(转)
windows server 2012系统安装完以后桌面默认只有回收站一个图标,如何将window常用的图标(计算机.控制面板.网络.用户文件)的图标添加到桌面呢,下面为作者本人亲测.操作简单至极. ...
- Mysql5.6.x版本半同步主从复制的开启方法
介绍 先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制. 主库实际上并不关心从库是否把数据拉完没有, ...
- linux 关闭端口
第一步查看那些程序在使用该端口 netstat -anp或者netstat -tulnp 第二步杀死进程 kill -9 xxx,杀死某个进程 killall 进程名
- javascript快速入门22--Ajax简介
Ajax是什么? 首先,Ajax是什么?一个很酷的新兴词汇!仅仅是某种早就有了的技术的一种新说法而已! Ajax是指一种创建交互式网页应用的网页开发技术.要谈到网页应用程序,则必须从WEB的历史来讲: ...