Hive 优化篇干货 整理
Hive 优化 ?
Hive SQL本质就是MapReduce
1.任务层:在小数据量的时候我们可以开启本地模式(单台机器可以处理所有的任务。对于小数据集可以明显缩短)、
因为跑MR的话启动时间会花费很长一段时间
(2)hive.fetch.task.conversion设置成 more,然后执行查询语句,如下查询方式都不会执行 mapreduce 程序。
2.存储和压缩层:存储格式和数据压缩(ORC 、数据压缩可以减少磁盘IO和网络IO,从而加快数据的传输)
3.参数层:Reduce 个数的设置。
Reduce个数设置+表中为空值的(key)+随机数子,使的数据均匀的分布在不同的Reduce上、节省了资源的开销。
- SQL层优化:设置自动选择 Mapjoin,如果不指定 MapJoin 或者不符合 MapJoin 的条件,那么 Hive 解析器会将 Join 操作转换成 Common Join,即:在 Reduce 阶段完成 join。容易发生数据倾斜。可以用 MapJoin 把小表全部加载到内存在 map 端进行 join,避免 reducer 处理。
开启Map join 功能 set hive.auto.convert.join = true;
5.架构优化:搜索引擎的优化
6.动态分区:开启动态分区的功能,设置为严格模式、根据数据量设置分区数量。如果是默认的话会报错。
数据倾斜怎么解决的?
默认情况下,Map 阶段同一 Key 数据分发给一个 reduce,当一个 key 数据过大时就倾斜了。
1.开启 Map 端聚合参数设置
2.在 Map 端进行聚合操作的条目数目
3.有数据倾斜的时候进行负载均衡(默认是 false)
hive.groupby.skewindata = true
当选设定为true,生成的查询计划会生成两个MapreduceJOb,第一个MapreduceJob中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group by有可能分配到不同的Reduce中,从而达到负载均衡的目的。
第二个Mapreduce Job 在根据预处理的结果按照group by分布到reduce 中(这个过程会保证相同的group by被分到同一个reduce 中),最后完成聚合操作。
4.开启并行执行。
5.开启严格模式。(默认是非严格模式)
外部表:只删除元数据、不删表数据
内部表:删除表时会删除元数据及表数据。
分区表:分区可以理解为分类,通过分类把不同的数据放到不同的路径下。分类的标准是分区字段、可以是一个、或者多个。
分区表的意义在于优化查询、查询时尽量选择分区字段。如果不使用分区字段,就会全表扫描。
关于优化点 后期还有我会添加进来。暂时就这些。。
【转载注明出处,尊重原创 】