目录
最重要的:查看SQL的执行计划,优化业务逻辑
explain sql语句;
列裁剪和分区裁剪
列裁剪就是在查询时只读取需要的列,这样可以避免全列扫描
分区裁剪就是只读取需要的分区,这样可以避免全表扫描
谓词下推
其基本思想是将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。在HiveSQL中,就是将where谓词逻辑都尽可能提前执行
本地模式(local mode)
在数据量较小的情况下,hive本地模式可提高查询效率。
原因是一般情况下,hive查询是需要向类似yarn集群去申请执行资源,但对较小的数据集来说,为查询而 触发任务执行所消耗的时间 可能会比实际执行查询的要多的多,而本地模式可以在单台机器上处理所有的任务,这样执行的总时间可以明显被缩短。
-- 开启Hive的本地模式
set hive.exec.mode.local.auto=true;
-- 设置本地模式的最大输入数据量,当输入数据量小于这个值时采用本地模式的方式,默认为134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
-- 设置本地模式的最大输入文件个数,当输入文件个数小于这个值时采用本地模式的方式,默认为 4
set hive.exec.mode.local.auto.input.files.max=10;
-- 还有就是,job的reduce数必须为0或者1,才会真正使用本地模式
并行执行
Hive 会将一个查询转化成一个或者多个阶段。这样的阶段可以是 MapReduce 阶段、抽样阶段、合并阶段、 limit 阶段。默认情况下,Hive 一次只会执行一个阶段。不过,某个特定的 job 可能包含众多的阶段,最典型的就是多个子查询union all,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个 job 的执行时间缩短。
-- 控制在同一个sql中的不同的job是否可以同时运行。默认是False
set hive.exec.parallel=true;
-- 同一个sql允许并行任务的最大线程数。默认是8
set hive.exec.parallel.thread.number=16;
-- 单个任务并发的最大reduce数,0或负数没有限制。默认是0
set mapreduce.job.running.reduce.limit = 800;
-- 单个任务并发的最大map数,0或负数没有限制。默认是0
set mapreduce.job.running.map.limit = 1000;