Hive常用优化方法
1、join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce。
2、join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算
3、在where字句中增加分区过滤器。
4、当可以使用left semi join 语法时不要使用inner join,前者效率更高。原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。
5、如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程。设置属性即可实现,set hive.auto.covert.join=true; 用户可以配置希望被优化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用这两个配置可置入$HOME/.hiverc文件中。
7、limit调优:limit语句通常是执行整个语句后返回部分结果。set hive.limit.optimize.enable=true;
8、开启并发执行。某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。设置属性:set hive.exec.parallel=true;
9、hive提供的严格模式,禁止3种情况下的查询模式。
a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。
b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。
c:限制笛卡尔积的查询。
10、合理的设置map和reduce数量。
11、jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。
mapreduce.job.jvm.numtasks
hive与MR的常用参数设置
设置每个reduce处理的数据量
set hive.exec.reducers.bytes.per.reducer=<number>
<property>
<name>hive.exec.reducers.bytes.per.reducer</name>
<value>1000000000</value>
<description>size per reducer.The default is 1G, i.e if the input size is 10G, it will use 10 reducers.</description>
</property>
设置最大能够运行的reduce个数
set hive.exec.reducers.max=<number>
<property>
<name>hive.exec.reducers.max</name>
<value>999</value>
<description>max number of reducers will be used. If the one
specified in the configuration parameter mapred.reduce.tasks is
negative, Hive will use this one as the max number of reducers when
automatically determine number of reducers.</description>
</property>
实际reduce的个数
set mapreduce.job.reduces=<number>
<property>
<name>mapreduce.job.reduces</name>
<value>1</value>
<description>The default number of reduce tasks per job. Typically set to 99%
of the cluster's reduce capacity, so that if a node fails the reduces can
still be executed in a single wave.
Ignored when mapreduce.jobtracker.address is "local".
</description>
</property>
hive的高级调优
1、表和sql的优化-》大表拆分成小表、分区表、外部表、临时表都是属于优化的一块
-》分区表:检索更快速
-》外部表:数据安全性
-》临时表&拆分子表:简化复杂的SQL以及需求
2、SQL可以从join和过滤两方面深入
3、MR优化
-》map和reduce的个数
-》一个分片就是一个块,一个块对应一个maptask
-》Hadoop源码中有一个计算公式
min(max_split_size,max(min_split_size,block_size))
-》min_split_size默认值0(最小分片大小)
-》max取的时候取的是block_size,block_size默认是128
-》max_split_size默认值256(最大分片大小)
-》这个公式决定了map的个数
-》肯定不能直接去修改HDFS的block_size
-》一般在实际的生产环境中HDFS一旦format格式化之后,block_size大小不会去修改的
-》通过修改max_split_size和min_split_size来影响map的个数
-》并行执行
-》针对有些互相没有依赖关系的独立的job,可以选择并发的执行job
hive.exec.parallel
-》是否开启并行执行的功能
hive.exec.parallel.thread.number
-》设置并行执行的线程个数
-》一般在工作中会选择去开启该功能
-》根据实际的集群的状况和服务器的性能合理的设置线程数目
-》JVM重用
-》mapreduce.job.jvm.numtasks通过合理的测试,设置一个合理的数目
-》推测执行
-》当某个任务出现迟迟不结束的情况,那么会考虑开启推测执行,开启一个一模一样的任务去完成
-》两个任务谁先完成,就会关闭另一个
-》分为map端的推测和reduce端的推测
-》不好的地方:过多的消耗资源
mapreduce.map.speculative
mapreduce.reduce.speculative
-》额外消耗节点资源
-》可能会出现重复写入的情况,产生异常
4、hive本地模式
-》业务场景:处理小数据集的时候,速度会更快一些
-》hive.exec.mode.local.auto
-》本地模式的限制:数据的输入大小不能超过128MB
-》本地模式的限制:map数不能超过4个
-》本地模式的限制:reduce的个数不能超过1个