用DISTRIBUTE BY和Sort by关键字代替Order by
对列使用分区
正常情况下,MapReduce启动的JVM在完成一个task之后就退出了,但是如果任务花费时间很短,又要多次启动JVM的情况下(比如对很大数据量进行计数操作),JVM的启动时间就会变成一个比较大的消耗。在这种情况下,可以使用jvm重用的参数:
set mapred.job.reuse.jvm.num.tasks = 5;
他的作用是让一个jvm运行多次任务之后再退出。这样一来也能节约不少JVM启动时间。
创建一个桶表 create table t4 (name string,age int,id int) CLUSTERED BY (id) SORTED BY (id) INTO 10 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 可以自动控制reduce的数量从而适配bucket的个数,当然,用户也可以自主设置mapred.reduce.tasks去适配bucket个数,推荐使用'set hive.enforce.bucketing = true' set hive.enforce.bucketing=true;
查看执行计划
数据倾斜分两种,group by引起的倾斜和join引起的倾斜。
group by造成的倾斜有两个参数可以解决
join引起的倾斜
set hive.optimize.skewjoin = true;
当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,非常消耗资源,设置参数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
在map处理之前将多个小文件合并。合并文件数由mapred.max.split.size限制的大小决定。
如果一个job大部分时间花在任务处理上,说明名可能是map个数太少了,并行度不高,这时可以考虑增加map个数
直接调整mapred.map.tasks这个参数是没有效果的。
set hive.map.aggr=true
主要是设置reduce个数
方法一:
set mapred.reduce.tasks=10
方法二:
set mapred.reduce.tasks=-1
(默认)
set hive.exec.reducers.bytes.per.reducer=256000000
(每个reduce任务处理的数据量,当mapred.reduce.tasks=-1时,这个参数生效)
hive中的索引是一个比较鸡肋的功能,hive中一般做扫描操作,而索引主要用于精确查找。
索引可以加快group by的速度
目的:是通过加快获取单个 task 的结果以及进行侦测将执行慢的 TaskTracker 加入到黑名单的方式来提高整体的任务执行效率
对于需要消耗大量资源的任务不建议推测执行,因为推测执行会让整个系统资源竞争更严重
$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>
set hive.exec.compress.intermediate=true; # 设置用snappy压缩,hive也有一个默认压缩方法DefaultCodec set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; set hive.intermediate.compression.type=BLOCK;
set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set mapred.output.compression.type=BLOCK:
hive.groupby.skewindata=true;
set hive.groupby.mapaggr.checkinterval=100000;
优化思想是尽量让job并行