常见Hive调优策略

Hive是否执行mapreduce

因为有些sql语句是不需要走mapreduce的。比如:select *、limit。

#在配置文件中hive-site.xml设置
<name>hive.fetch.task.conversion</name>
<value>more</value>

Hive表创建的调优

  1. 是否创建分区表。(加快查询速率)
  2. 是否创建外部表。(多个部门使用时可以保证表的安全)
  3. 选择什么样的存储格式。(textFile,ORCFile,Parquet)
    • textFile:行存储格式
    • ORCFile:列存储格式(但是数据量太大,会被分会多个块)
    • Parquet:行存储格式,但是压缩性能更好

Hive中JOIN语句的调优

首先需要知道默认情况下,join操作是在reduce端进行的,因为通常情况下,要连接的表中的数据会分布在不同的map中处理,这样造成了即使同一个key对应的value可能存在不同的map中,所以必须要等到reduce中去连接。

  1. map join
    在有一个表为小表的情况下,可以把小表所有数据一次性读到每个map节点的内存中,然后进行join关联操作。这样省去了reduce操作运行的效率也会高很多。

数据倾斜

  1. 引起数据倾斜的操作
    • Join,group by
  2. 本质原因
    key值分布不均匀,导致某些reduce的处理的数据量远远大于平均值。
  3. 表现
    任务进度长时间保持在一个值,查看监控页面的时候,发现只有一个或几个reduce子任务未完成。
  4. 解决方式
    • 大小表join:用map join,在map端完成join
    • 大大表join:对空值的key变成一个随机字符串,这样相同的空值key就分不到了不同的reduce中。
    • 讲倾斜的数据提出出来单独处理,最后union回去。
    原文作者:心_的方向
    原文地址: https://www.jianshu.com/p/59789b20c50f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞