Hive优化

原文链接:https://www.cnblogs.com/sandbank/p/6408762.html

本文主要参考文献:

 

1. limit 调整以语句快速出结果

很多情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。有一个配置属性可以开启,用于对数据源进行抽样,从而避免执行整个查询语句。

  • hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能
  • hive.limit.row.max.size --- 设置最小的采样容量
  • hive.limit.optimize.limit.file --- 设置最大的采样样本数

缺点:有可能部分数据永远不会被处理到

 

2. Join优化

(1)使用相同的连接键

当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

 (2)使得表从小到大join 或者 用语句标记最大表

  • Hive假定查询中最后的一个表是大表。在对每行Join时它会将其它表缓存起来,然后扫描最后那个表进行计算。因此需要保证连接查询中的表的大小是从左到右依次增加的。
  • 或者直接标记最大表:/*streamtable(table_name) */

(3)若有小表可以载入内存,可以执行map-side Join

如果所有表中只有一张表是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行连接过程(称为map-side JOIN),因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。

  • Hive v0.7版本之前:/*+ MAPJOIN(table_name) */
  • Hive v0.7版本及之后:
--(废弃了以上标记方式,但以上标记方式仍然有效。 )

--是否自动转换为mapjoin
hive.auto.convert.JOIN=true
--小表的最大文件大小,默认为25000000,即25M
set hive.mapjoin.smalltable.filesize = 25000000;
--是否将多个mapjoin合并为一个
set hive.auto.convert.join.noconditionaltask = true;
--多个mapjoin转换为1个时,所有小表的文件大小总和的最大值。
set hive.auto.convert.join.noconditionaltask.size = 10000000;

(4)尽量尽早地过滤数据

减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。

 

3. 本地模式

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章