Hive插入多个分区时OOM故障解决记录

一、故障情景

基于Hive的数据仓库中需要做一张累积快照表,记录了客户发生各个行为的具体日期,比如激活日期、注册日期、申请日期、创建订单日期等等。

这张表需要以激活日期作为分区时间,便于业务查询。

激活日期将近500个日期,在一次性将所有数据全量插入目标分区的时候所有reduce报OOM。

二、解决过程

首先增加reduce端的内存,set mapreduce.reduce.java.opts = -Xmx3072m;set mapreduce.reduce.memory.mb = 3072;最后将内存设置到集群最高内存,仍然报OOM。

再分析源数据的分类,发现源数据存在以前的测试数据,这样会造成有的分区日期只有一条数据,有的分区天数有几十万数据,数据存在严重的倾斜。

解决方法有两种。

第一种在HQL末尾加上distribute by和sort by,或者cluster by。如下:
insert overwrite table loan_f_milestone partition(day)
select *,
to_date(atv_tim)
from loan_f_milestone_tmp12
distribute by to_date(atv_tim)
sort by to_date(atv_tim)
--cluster by to_date(atv_tim)

distribute by按照指定的字段将数据划分到不同的输出reduce中,可以保证每个reduce处理的数据范围不重叠,每个分区内的数据是没有排序的。

sort by保证一个reduce内的数据按照指定字段排序。

cluster by除了有distribute by的功能,还有sort by的功能,所以最终的结果是每个reduce处理的数据范围不重叠,而且每个reduce内的数据按照指定字段排序,而且可以做到全局排序。

所以第二种方式是设置set hive.optimize.sort.dynamic.partition=true;会将动态分区字段全局排序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Hive基础语法 1、创建表 – 用户表 CREATE[EXTERNAL外部表]TABLE[IF NOT EXIS...
    辉格食品阅读 6,495评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,860评论 19 139
  • Hive数据倾斜总结 倾斜的原因: 使map的输出数据更均匀的分布到reduce中去,是我们的最终目标。由于Has...
    Helen_Cat阅读 10,305评论 1 11
  • 一、join优化 ** Join查找操作的基本原则:** 应该将条目少的表/子查询放在 Join 操作符的左边。原...
    Alijie阅读 14,436评论 0 7
  • 前言 算是对在滴滴实习的这段时间Hive的笔记吧,回学校也有段时间了,应该整理整理了,肯定不会巨细无遗,作为一种学...
    mrlevo520阅读 6,807评论 0 25

友情链接更多精彩内容