抓取
Hive中对于某些情况的查询可以不必使用MapReduce计算。例如SELECT,Hive可以简单读取对应的存储目录的文件信息。
可以设置一些参数,全局查找、字段查找、limit查找等都不使用MapReduce。或者执行查询语句都执行MapReduce。
本地模式
在Hive处理的输入数据量很少时,Hive可以通过本地模式在单台机器上处理所有的任务,因此,对于小数据集,执行时间明显缩短。通过设置参数,开启和关闭此优化。
表的优化
小表、大表Join
大小表连接使用MapReduce的Map Join,前提是小表数据能够都读入内存。
INSERT OVERWRITE TABLE jointable
SELECT b.id,b.time,b.uid,b.url,s.num,...
FROM smalltable s
LEFT ON bigtable b
ON b.id = s.id
不指定MapJoin或不符合MapJoin的条件,Hive解析器会把join操作转换成Common Join,即Reduce Join,容易发生数据倾斜。
大表大表连接
大表大表用ReduceJoin。有时候join超时是某些key对应数据太多,相同key发送给相同reduce端上,导致内存不够。
- 很多情况,这些key对应的数据是异常数据,因此我们需要在SQL语句中过滤,比如过滤掉NULL值的数据,以减少reduce端的数据,加快速度。
- 或者为这些NUll值分配随机数,以便均匀分布到各个reduce端,避免数据倾斜情况。
Group By
默认情况下,Map阶段同一Key数据分发给同一个reduce会造成数据倾斜。但是很多操作并不需要都在Reduce端完成,我们可以在Map端进行聚合操作,最后Reduce汇合最终结果就好。
通过设置参数,以开启Map端聚合操作。
Count(Distinct)去重统计
数据量小的时候无所谓,数据量大的情况,由于Count Distinct操作需要用一个Reduce端来完成,会造成数据量太大,整个任务Job完成时间旧且困难。
我们可以通过Group By再count来替代原先去重统计
SELECT COUNT(id) FROM (
SELECT id FROM bigtable group by id) a;
MapReduce优化
- 合理设置Map数
- 小文件合并
- 复杂文件增加Map数
- 合理设置Reduce数
推测执行
在分布式集群环境下, 因为程序 Bug(包括 Hadoop 本身的 bug), 负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有 50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生, Hadoop 采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果