Hive调优

Hive调优

  • 简介
  • Hive on MapReduce优化
    • 建表时要进行分区、分桶、拆分
    • 优化SQL(能不shuffle就不shuffle,能在map端提前处理的不要reduce处理)
    • 合并小文件
    • map阶段和reduce阶段的输出尽量采用snappy数据压缩和(parquet、orcfile)存储格式
    • 避免数据倾斜
    • Hive要Fetch抓取、本地模式、严格模式、并行执行、jvm重用、推测执行
      • Fetch抓取
      • 本地模式
      • 严格模式
      • 并行执行
      • jvm重用
      • 推测执行
    • 在脚本中运行
  • Hive on Spark优化
    • yarn
    • spark
    • hive配置
    • 预启动YARN容器

简介

Hive底层的计算引擎可以是MapReduce,也可以是Spark,也可以是Tez。

Hive on MapReduce优化

建表时要进行分区、分桶、拆分

分区目的是不满足条件的数据不加载、可以加快查询的速度。
分桶是更为细粒度的数据范围划分。
一个很大的表做分析的时候,不是每个字段都需要用到,可以考虑拆分表,生成子表,减少传输数据量。

优化SQL(能不shuffle就不shuffle,能在map端提前处理的不要reduce处理)

where条件在map端执行而不是在reduce端执行。
尽量不要使用union(去掉重复的记录,并集)而是使用union all然后在用group by去重。
不要使用count(distinct cloumn),使用子查询。
用in来代替join。
消灭子查询内的group by、count(distinct)、max、min,可以减少job的数量。
使用map join代替reduce join。

合并小文件

需要在map输入端设置小文件的合并。

map阶段和reduce阶段的输出尽量采用snappy数据压缩和(parquet、orcfile)存储格式

采用压缩,可以减少传输的数据量,减少磁盘空间。
合适的存储格式具有很好的压缩性能。

避免数据倾斜

原因可能是key分布不均匀,业务数据本身的特性,建表时考虑不周,某些SQL语句本身就有数据倾斜。

Hive要Fetch抓取、本地模式、严格模式、并行执行、jvm重用、推测执行

Fetch抓取

Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM 表名;在这种情况下,Hive可以简单地读取表对应的存储目录下的文件,然后输出查询结果到控制台。

本地模式

Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

严格模式

可以防止用户执行那些可能意向不到的不好的影响的查询。
例如:order by后需要limit,不允许笛卡尔积。

并行执行

多个job一起执行。

jvm重用

小文件启动过程耗费资源,执行时间又很短,解决办法是jvm的重用。

推测执行

当剩几个任务执行特别慢,会启动一个和他一样的新的任务,看哪个先执行完,另一个被kill掉。

在脚本中运行

目的是并行执行多个job。

Hive on Spark优化

yarn

增大yarn集群能使用的核数、增大集群能使用的内存。

spark

增大executor内存,但过多会导致垃圾回收的开销增加。
增大driver内存,driver的内存大小并不直接影响性能,但是job的运行也不能受限于driver的内存。
增大每个节点的executor数量。
并行度,同时运行多个任务,使executor得到充分利用。

hive配置

类似于Hive on MapReduce的配置。
map join代替reduce join可以提高性能等等。

预启动YARN容器

集群刚启动资源还没有完全上线,如果提交job只会用到一小部分的资源进行任务的计算,解决办法是预热一段时间。

你可能感兴趣的:(hive)