博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive性能调优
阅读量:7134 次
发布时间:2019-06-28

本文共 2219 字,大约阅读时间需要 7 分钟。

hot3.png

1.limit限制调整 --因为使用limit语句时候,是先执行整个查询语句,然后再返回部分结果的 set hive.limit.optimize.enable=true; set hive.limit.row.max.size=10000; set hive.limit.optimize.limit.file=10;

2.JOIN优化 。。。

  1. 本地模式 --hive尝试使用本地模式执行查询,要不然hive会使用MapReduce来执行其他所有的查询 set hive.exec.mode.local.auto=true;

4.并行执行 set hive.exec.parallel=true;

5.严格模式 --对分区表进行查询,在where子句中没有加分区过滤的话,将禁止提交任务(默认:nonstrict) set hive.mapred.mode=strict;

注:使用严格模式可以禁止3种类型的查询: (1)对于分区表,不加分区字段过滤条件,不能执行 (2)对于order by语句,必须使用limit语句。 (3)限制笛卡尔积的查询(join的时候不使用on,而使用where的)。

6.调整mapper和reducer个数 set hive.exec.reducers.max=(集群总reduce槽位个数*1.5)/(执行中的查询的平均个数)

7.JVM重用 set mapred.job.reuse.jvm.num.tasks=10; --10为重用个数

8.索引 索引可以加快含有group by语句的查询的计算速度

9.动态分区调整 --动态分区属性:设置为true表示开启动态分区功能(默认为false) hive.exec.dynamic.partition=true;

--动态分区属性:设置为nonstrict,表示允许所有分区都是动态的(默认为strict) --设置为strict,表示必须保证至少有一个分区是静态的 hive.exec.dynamic.partition.mode=strict;

--动态分区属性:每个mapper或reducer可以创建的最大动态分区个数 hive.exec.max.dynamic.partitions.pernode=100;

--动态分区属性:一个动态分区创建语句可以创建的最大动态分区个数 hive.exec.max.dynamic.partitions=1000;

--动态分区属性:全局可以创建的最大文件个数 hive.exec.max.created.files=100000;

--控制DataNode一次可以打开的文件个数 --这个参数必须设置在DataNode的$HADOOP_HOME/conf/hdfs-site.xml文件中 <property> <name>dfs.datanode.max.xcievers</name> <value>8192</value> </property>

10.推测执行 --目的:是通过加快获取单个task的结果以及进行侦测将执行慢的TaskTracker加入到黑名单的方式来提高整体的任务执行效率

(1)修改 $HADOOP_HOME/conf/mapred-site.xml文件 <property> <name>mapred.map.tasks.speculative.execution </name> <value>true</value> </property> <property> <name>mapred.reduce.tasks.speculative.execution </name> <value>true</value> </property>

(2)修改hive配置 set hive.mapred.reduce.tasks.speculative.execution=true;

11.单个MapReduce中多个group by --多个group by操作组装到单个MapReduce任务中 set hive.multigroupby.singlemr=false;

12.虚拟列 --当hive产生了非预期的或null的时候,可以通过虚拟列进行诊断,判断哪行数据出现问题 INPUT__FILE__NAME (输入文件名) BLOCK__OFFSET__INSIDE__FILE (块内偏移量) ROW__OFFSET__INSIDE__BLOCK (行偏移量,需要设置hive.exec.rowoffset=true;启用)

  1. 其他参数调优 --开启CLI提示符前打印出当前所在的数据库名 set hive.cli.print.current.db=true;

--让CLI打印出字段名称 hive.cli.print.header=true;

--提高聚合的性能 set hive.map.aggr=true;

--对于简单的不需要聚合的类似SELECT <col> from <table> LIMIT n语句,不需要起MapReduce job,直接通过Fetch task获取数据 set hive.fetch.task.conversion=more;

转载于:https://my.oschina.net/u/2381604/blog/799448

你可能感兴趣的文章
mysql查询表的数据大小
查看>>
初识Continuation
查看>>
smooth l1
查看>>
ET–异步协程使用–TimerComponent篇
查看>>
Linux LVM学习总结——Insufficient Free Extents for a Logical Volume
查看>>
智课雅思词汇---二十一、名词性后缀acity是什么意思
查看>>
JavaWeb 返回json数据的两种方式
查看>>
(转)Java 详解 JVM 工作原理和流程
查看>>
关于如何获得数据库数据变化的情况(比定时查询方便多了)
查看>>
阿里员工都是这样排查Java问题的,附工具单(转)
查看>>
用flutter写一个精美的登录页面
查看>>
[转]Docker php extensions gd
查看>>
Java Program Mapping GB2312 to Unicode
查看>>
C语言标准中的逻辑位移和算术位移
查看>>
查看当前运行的SQL语句
查看>>
【Python】opencv显示图像
查看>>
Web配置文件(web.config)简介
查看>>
如何培养员工的团队合作精神
查看>>
POJ 1151 Atlantis (线段树)
查看>>
在sqlserver中如何根据字段名查找字段所在的表
查看>>