查看: 560|回复: 5

如何优化hive

[复制链接]
论坛徽章:
20
linux徽章
日期:2015-10-29 16:08:22高并发架构徽章
日期:2017-08-10 15:32:13Tomcat徽章
日期:2017-11-16 17:41:48zabbix徽章
日期:2017-12-25 17:34:14mysql徽章
日期:2018-01-18 18:01:34mysql徽章
日期:2018-02-01 17:47:18Oracle研习者高级
日期:2018-09-04 16:06:01spark徽章
日期:2018-10-11 15:45:58搜索引擎徽章
日期:2019-04-11 15:18:35Oracle研习者初级
日期:2017-07-11 15:59:41bash徽章
日期:2017-06-01 17:10:16linux徽章
日期:2015-10-29 16:08:58
发表于 2018-7-22 22:30 | 显示全部楼层 |阅读模式

Hive

如何优化hive
回复

使用道具 举报

论坛徽章:
9
Hadoop研习者初级
日期:2014-09-19 14:12:21比特币徽章
日期:2014-11-06 14:54:26scala徽章
日期:2014-11-06 14:55:58scala徽章
日期:2014-11-27 15:51:52搜索引擎徽章
日期:2016-08-18 11:36:51计算徽章
日期:2018-07-17 16:42:49spark徽章
日期:2018-08-24 10:52:07spark徽章
日期:2018-08-24 10:52:51Kafka徽章
日期:2019-07-18 14:38:56
发表于 2018-7-23 07:32 | 显示全部楼层

1. 本地模式(小任务):
需要满足以下条件:
  1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
  2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
  3.job的reduce数必须为0或者1
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.tasks.max=4
hive.exec.mode.local.auto=true
hive.mapred.local.mem:本地模式启动的JVM内存大小

2. 并发执行:
hive.exec.parallel=true ,默认为false
hive.exec.parallel.thread.number=8

3.Strict Mode:
hive.mapred.mode=true,严格模式不允许执行以下查询:
分区表上没有指定了分区
没有limit限制的order by语句
笛卡尔积:JOIN时没有ON语句

4.动态分区:
hive.exec.dynamic.partition.mode=strict:该模式下必须指定一个静态分区
hive.exec.max.dynamic.partitions=1000
hive.exec.max.dynamic.partitions.pernode=100:在每一个mapper/reducer节点允许创建的较大分区数
DATANODE:dfs.datanode.max.xceivers=8192:允许DATANODE打开多少个文件

5.推测执行:
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
hive.mapred.reduce.tasks.speculative.execution=true;

6.Single MapReduce MultiGROUP BY
hive.multigroupby.singlemar=true:当多个GROUP BY语句有相同的分组列,则会优化为一个MR任务

7. hive.exec.rowoffset:是否提供虚拟列

8. 分组
两个聚集函数不能有不同的DISTINCT列,以下表达式是错误的:
INSERT OVERWRITE TABLE pv_gender_agg SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_users GROUP BY pv_users.gender;
SELECT语句中只能有GROUP BY的列或者聚集函数。

回复 支持 反对

使用道具 举报

论坛徽章:
4
spark徽章
日期:2015-03-19 10:36:46算法导论徽章
日期:2016-03-16 10:46:46spark徽章
日期:2016-04-01 14:17:34spark徽章
日期:2018-08-24 10:52:07
发表于 2018-8-6 01:26 | 显示全部楼层
1、Hive整体架构优化点有哪些? 2、如何在MR阶段进行优化? 3、Hive在SQL中如何优化? 4、Hive框架平台中如何优化? https://blog.csdn.net/javastart/article/details/52387979
回复 支持 反对

使用道具 举报

论坛徽章:
14
spark徽章
日期:2018-10-11 15:45:57python徽章
日期:2019-06-06 16:18:22mysql徽章
日期:2019-05-30 17:46:20搜索引擎徽章
日期:2019-04-11 15:18:35机器学习徽章
日期:2019-02-28 15:01:04python徽章
日期:2019-02-28 15:00:57机器学习徽章
日期:2019-01-24 16:03:30Hadoop研习者初级
日期:2019-01-10 14:08:51Hadoop研习者初级
日期:2019-01-10 14:05:10算法导论徽章
日期:2018-12-06 15:36:43spark徽章
日期:2018-11-16 14:09:41机器学习徽章
日期:2018-11-09 11:07:21
发表于 2018-8-10 23:40 | 显示全部楼层
兄弟,你提的问题太宽泛了,不同的问题有不同的优化方式 ,全部回答也没个针对性
回复 支持 反对

使用道具 举报

论坛徽章:
13
数据陷阱解读徽章
日期:2016-03-10 10:18:46spark徽章
日期:2019-08-01 16:31:52区块链徽章
日期:2018-05-24 16:10:38python徽章
日期:2017-12-07 16:06:27R研习者高级
日期:2016-09-01 10:04:51spark徽章
日期:2016-07-14 11:05:11Oracle研习者初级
日期:2016-06-16 10:32:31Oracle研习者中级
日期:2016-06-02 10:27:16Hadoop研习者初级
日期:2016-05-19 11:28:49R研习者中级
日期:2016-05-19 11:14:29数据治理徽章
日期:2016-04-22 17:30:46DB2徽章
日期:2016-04-07 10:58:04
发表于 2019-5-17 23:17 | 显示全部楼层
很专业啊 ,学习了,谢谢分享。
回复 支持 反对

使用道具 举报

新浪微博达人勋 poiu72  未实名认证
论坛徽章:
23
SAS研习者初级
日期:2012-08-20 22:27:43HBase徽章
日期:2017-03-10 12:01:24Java徽章
日期:2017-06-09 15:42:21storm徽章
日期:2017-07-20 17:23:53python徽章
日期:2017-09-07 16:20:32Java徽章
日期:2018-02-08 16:11:57知识图谱徽章
日期:2018-06-15 13:47:35pyspark徽章
日期:2018-09-06 14:49:50计算徽章
日期:2019-05-09 14:32:23spark徽章
日期:2019-08-01 16:31:52Hive徽章
日期:2017-03-10 11:59:23python徽章
日期:2017-03-02 16:33:17
发表于 2019-6-9 21:50 | 显示全部楼层
1、环境方面
服务器的配置、容器的配置、环境的搭建
2、具体软件配置参数:
3、代码级别的优化:
explain 和 explain extended
explain:只对hql语句进行解释。
explain extended:对hdql语句进行解释,以及抽象表达式树的生成。
stage:相当于一个job。一个stage可以是limit、可以是一个子查询、也可以是一个group by语句等。
hive默认一次只执行一个stage,但是如果stage之间没有依赖关系,将可以并行执行。
select
union
select
任务的越复杂,hql的代码越复杂,stage越多,运行的时间就越长。

2、join
hive的查询永远是小表(小结果集)驱动大表(大结果集)
hive的on条件只支持等值连接
注意:hive是否配置了普通的join转换成map端join,以及mapjoin小表文件大小的阀值
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=25000000;

3、limit的优化
set hive.limit.row.max.size=100000;
set hive.limit.optimize.limit.file=10;
set hive.limit.optimize.enable =false/true;
(如果limit较多时建议开启)
set hive.limit.optimize.fetch.max=50000;

4、本地模式:
set hive.exec.mode.local.auto=false/true;(建议打开)
set hive.exec.mode.local.auto.inputbytes.max=134217728;
set hive.exec.mode.local.auto.input.files.max=4;

5、并行执行
set hive.exec.parallel=false/true;(建议打开)
set hive.exec.parallel.thread.number=8;

6、严格模式:
set hive.mapred.mode=nonstrict/strict;

7、map和reduce的个数:
不是mapper和reduce的个数越多越好,也不是越少越好。
将小文件合并处理:(输入类设置为:CombineTextInputFormat)
hive里通过配置将小文件合并:
mapred.max.split.size=256000000   
mapred.min.split.size.per.node=1
mapred.min.split.size.per.rack=1
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

手动设置:
设置map的个数:
set mapred.map.tasks=2;
设置reduce的个数:
set mapred.reduce.tasks=2;

set hive.exec.reducers.max=1009;

8、配置jvm的重用:(mapred-default.xml)
set mapreduce.job.jvm.numtasks =1/-1;
set mapreduce.job.reuse.jvm.num.tasks =1/-1;

9、数据倾斜:
数据倾斜是由于key的分布不均匀造成的数据往一个方向偏离的现象。
本身数据就是倾斜
JOIN语句容易造成倾斜:
count(distinct col)
group by

找到造成数据倾斜的key,然后通过hql语句避免。
set hive.map.aggr=true;
set hive.groupby.skewindata=true;(建议开启)

set hive.optimize.skewjoin=false/true;

10、索引、视图是一种hive的优化:

11、分区、分桶本身就是hive的一种优化:

12、job的数量:
一般是一个查询产生一个job,然后通常情况一个job、可以是一个子查询、一个join、一个group by 、一个limit等一些操作。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-10-19 05:20 , Processed in 0.181223 second(s), 51 queries .

关闭

扫一扫加入
本版微信群