2018-05-30

1 . jion 的时候把大表放后面

2. join on 使用相同连接键位 ,避免产生多个mapreduce

3. 尽早的过滤数据,避免数据倾斜

4.尽量原子化操作

5.用insert into替换union all 可以节约 50% 

6.order by & sort by 

order by : 对查询结果进行全局排序,消耗时间长。需要 set hive.mapred.mode=nostrict

sort by : 局部排序,并非全局有序,提高效率。

7.设置hive 并发执行

set hive.exec.parallel=true,可以开启并发执行。

set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。

8. hive Map 端优化

set mapred.max.split.size=100000000;

 set mapred.min.split.size.per.node=100000000; 

set mapred.min.split.size.per.rack=100000000;  

-- 前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 执行前进行小文件合并 2)增加map数

当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

set mapred.reduce.tasks=?

2 Reduce阶段优化

调整方式:

-- set mapred.reduce.tasks=?

-- set hive.exec.reducers.bytes.per.reducer = ?

一般根据输入文件的总大小,用它的estimation函数来自动计算reduce的个数:reduce个数 = InputFileSize / bytes per reducer

hive 数据倾斜 

1)、key分布不均匀

2)、业务数据本身的特性

3)、建表时考虑不周

4)、某些SQL语句本身就有数据倾斜

hive.map.aggr=true

Hive 总结 : 尽量使用 join on 连接多个表生成多个语句 ,大表放在最后面连接执行,今早的过滤数据 ,合并小文件增加task 线程数 ,并发执行增加线程数 ,严格模式不允许执行 分区表没有指定分区 使用order by 没有是limit 语句,join 时没有On

2. 并发执行:

hive.exec.parallel=true ,默认为false

hive.exec.parallel.thread.number=8

3.Strict Mode:

hive.mapred.mode=true,严格模式不允许执行以下查询:

分区表上没有指定了分区

没有limit限制的order by语句

笛卡尔积:JOIN时没有ON语句

你可能感兴趣的:(2018-05-30)