Hive 优化篇干货 整理

Hive 优化 ?

Hive SQL本质就是MapReduce
1.任务层:在小数据量的时候我们可以开启本地模式(单台机器可以处理所有的任务。对于小数据集可以明显缩短)、
因为跑MR的话启动时间会花费很长一段时间

(2)hive.fetch.task.conversion设置成 more,然后执行查询语句,如下查询方式都不会执行 mapreduce 程序。

2.存储和压缩层:存储格式和数据压缩(ORC 、数据压缩可以减少磁盘IO和网络IO,从而加快数据的传输)

3.参数层:Reduce 个数的设置。
Reduce个数设置+表中为空值的(key)+随机数子,使的数据均匀的分布在不同的Reduce上、节省了资源的开销。

  1. 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.开启严格模式。(默认是非严格模式)

外部表:只删除元数据、不删表数据
内部表:删除表时会删除元数据及表数据。
分区表:分区可以理解为分类,通过分类把不同的数据放到不同的路径下。分类的标准是分区字段、可以是一个、或者多个。

分区表的意义在于优化查询、查询时尽量选择分区字段。如果不使用分区字段,就会全表扫描。

关于优化点 后期还有我会添加进来。暂时就这些。。

【转载注明出处,尊重原创 】

【作者水平有限,如有错误欢迎指正 .】

在这里插入图片描述

原创文章 61 获赞 79 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_46163590/article/details/106098548