钻牛角尖系列(二)Hive调优与思考

写在前面: 我是「nicedays」,一枚喜爱做特效,听音乐,分享技术大数据开发猿。这名字是来自world order乐队的一首HAVE A NICE DAY。如今,走到现在很多坎坷和不顺,如今终于明白nice day是需要自己赋予的。
白驹过隙,时光荏苒,珍惜当下~~
写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 大数据与机器学习感兴趣,可以关注我的动态 https://blog.csdn.net/qq_35050438,让我们一起挖掘数据与人工智能的价值~

Hive调优

一:避免Hive进行MapReduce

  • select * from xxx
  • where中过滤条件仅为分区字段

执行下面命令,可以让Hive尝试使用本地模式执行操作:

set hive.exec.mode.local.auto=true;

二: JOIN优化:

  • 多表join时,如果on子句连接键相同,那么将最大的表放在最后,Hive会尝试将其他表缓存起来,扫描最后 那个表进行计算

三:设置合理的reduce数:

MapReduce 程序中,reducer 个数的设定极大影响执行效率,这使得 Hive 怎样决定 reducer 个数成为一个关键问题。遗憾的是 Hive 的估计机制很弱,不指定 reducer 个数的情况下,Hive 会猜测确定一个 reducer 个数,基于以下两个设定:

  • hive.exec.reducers.bytes.per.reducer(默认为 256000000
  • hive.exec.reducers.max(默认为 1009)
  • mapreduce.job.reduces=-1(设置一个常量 reducetask 数量)

计算 reducer 数的公式很简单: N=min(参数 2,总输入数据量/参数 1) 通常情况下,有必要手动指定 reducer 个数。考虑到 map 阶段的输出数据量通常会比输入有 大幅减少,因此即使不设定 reducer 个数,重设参数 2 还是必要的。

依据 Hadoop 的经验,可以将参数 2 设定为 0.95*(集群中 datanode 个数)。

四:优化Hive数据倾斜问题:

数据倾斜产生原因:

  • key分布不均匀。
  • map端数据倾斜,输入文件太多且大小不一 。
  • reduce端数据倾斜,分区器问题。
  • 业务数据本身的特征。

业务场景解决:


空值数据过多,全部移到一个reduce端处理

解决办法:给空值变成字符串+随机数


不同数据类型关键字段关联,未处理的类型全部都分到一个reducer中

解决办法:将数据类型转成一致


key值过于集中,很多key值分到一个reduce中

解决办法:将key值集中的数据新生成一张小表存入内存,再使用mapjoin,在map端完成reduce


调节hive配置参数:

  • 设置hive.map.aggr=true

    —map端部分聚合,相当于Combiner

  • 设置hive.groupby.skewindata=true

    —有数据倾斜时,查询计划生成两个mr job, 第一个job先进行key随机分配处理,先缩小数据量。第二个job再进行真正的group by key处理


五:JVM重用:

解决小文件和task特别多的场景

修改hadoop的mapred-site.xml文件进行设置

<property>
    <name>mapred.job.reuse.jvm.num.tasks</name>
    <value>10</value>
</property>

使得jvm实例在同一个job中重新使用N次,减少JVM启动造成的开销。

猜你喜欢

转载自blog.csdn.net/qq_35050438/article/details/107187366