1. 动态分区插入
set hive.exec.dynamici.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table xxx.xxx partition (pline_form, os_type, dt)
2. 动态插入的分区数大于100
SET hive.exec.max.dynamic.partitions=2000;
SET hive.exec.max.dynamic.partitions.pernode=2000;
3. 修改最小文件merge大小
set hive.merge.mapredfiles=true;
set hive.merge.smallfiles.avgsize=268435456;
4. 修改reduce task数
set mapred.reduce.tasks=2099;
5. 并行执行
即控制对于一个sql来说同时可以运行的job的最大值.该参数默认为8,此时最大可以同时运行8个job
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=10;
找了个job比较多的sql,task id是1430403,是这个任务中的最后一个sql,是n个sql一起的union操作
通过修改参数hive.exec.parallel和hive.exec.parallel.thread.number测试了下不同情况的执行速度
其中hive.exec.parallel.thread.number表示同时运行的job的个数
不开并行:2533.722 seconds
开并行,并行度为8:266.82 seconds
开并行,并行度为16:194.33 seconds
开并行,并行度为32:133.117 seconds
当并行度为32的时候,速度提升了将近20倍,但是会占用更多的map和reduce资源
6. MapJoin机制
mapjoin的适用场景如关联操作中有一张表非常小,不等值的链接操作.即:
在二个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能。这样我们就把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。
hive 0.12版本后默认hive.auto.conver.join=true,即默认开启优化.
set hive.auto.convert.join=false;
7. 修改队列
set mapreduce.job.queuename=root.yarn.test;
8. 其它参数
set spark.executor.memory=16g;
set spark.yarn.executor.memoryOverhead=6144m;