当前位置: 首页 > news >正文

大数据项目中数据倾斜

一、数据倾斜包含:hadoop数据倾斜,hive中数据倾斜、spark数据倾斜

【hadoop中的数据倾斜表现】

1、有一个多几个 Reduce 卡住,卡在 99.99%,一直不能结束。
2、各种 container 报错 OOM
3、异常的 Reducer 读写的数据量极大,至少远远超过其它正常的 Reducer
4、伴随着数据倾斜,会出现任务被 kill 等各种诡异的表现。

【hive 中数据倾斜】

一般都发生在 Sql 中 group by 和 join on 上,而且和数据逻辑绑定比较深。

【Spark 中的数据倾斜】

Spark 中的数据倾斜,包括 Spark Streaming 和 Spark Sql,表现主要有下面几种:
1、Executor lost,OOM,Shuffle 过程出错;
2、Driver OOM;
3、 单个 Executor 执行时间特别久,整体任务卡在某个阶段不能结束;
4、 正常运行的任务突然失败;

二、数据倾斜产生的原因

我们以 Spark 和 Hive 的使用场景为例。
他们在做数据运算的时候会涉及到,count distinct、group by、join on 等操作,这些都会触发 Shuffle 动作。一旦触发 Shuffle,所有相同 key 的值就会被拉到一个或几个 Reducer 节点上,容易发生单点计算问题,导致数据倾斜。
一般来说,数据倾斜原因有以下几方面:
1、key分布不均匀
在这里插入图片描述
2、建表时考虑不周
例如有两张表
user(用户信息表):userid,register_ip
ip(IP 表):ip,register_user_cnt
这可能是两个不同的人开发的数据表。如果我们的数据规范不太完善的话,会出现一种情况:
user 表中的 register_ip 字段,如果获取不到这个信息,我们默认为 null;但是在 ip 表中,我们在统计这个值的时候,为了方便,我们把获取不到 ip 的用户,统一认为他们的 ip 为 0。两边其实都没有错的,但是一旦我们做关联了,这个任务会在做关联的阶段,也就是 sql的 on 的阶段卡死。

3、业务数据激增
比如订单场景,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两
个城市的订单量增长了 10000%,其余城市的数据量不变。
然后我们要统计不同城市的订单情况,这样,一做 group 操作,可能直接就数据倾斜了。

【数据倾斜解决思路】

很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理,异常值的过滤等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。

1、业务逻辑
我们从业务逻辑的层面上来优化数据倾斜,比如上面的两个城市做推广活动导致那两个城市数据量激增的例子,我们可以单独对这两个城市来做 count,单独做时可用两次 MR,第一次打散计算,第二次再最终聚合计算。完成后和其它城市做整合。

2、程序层面
比如说在 Hive 中,经常遇到 count(distinct)操作,这样会导致最终只有一个 Reduce 任务。
我们可以先 group by,再在外面包一层 count,就可以了。比如计算按用户名去重后的总用户量:
(1)优化前 只有一个 reduce,先去重再 count 负担比较大:
select name,count(distinct name)from user;
(2)优化后
// 设置该任务的每个 job 的 reducer 个数为 3 个。Hive 默认-1,自动推断。
set mapred.reduce.tasks=3;
// 启动两个 job,一个负责子查询(可以有多个 reduce),另一个负责 count(1):
select count(1) from (select name from user group by name) tmp;

3、调参方面
Hadoop 和 Spark 都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。

4、从业务和数据上解决数据倾斜
很多数据倾斜都是在数据的使用上造成的。我们举几个场景,并分别给出它们的解决方案。
⚫ 有损的方法:找到异常数据,比如 ip 为 0 的数据,过滤掉
⚫ 无损的方法:对分布不均匀的数据,单独计算
⚫ 先对 key 做一层 hash,先将数据随机打散让它的并行度变大,再汇集
⚫ 数据预处理

定位导致数据倾斜代码

Spark 数据倾斜只会发生在 shuffle 过程中。
这里给大家罗列一些常用的并且可能会触发 shuffle 操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition 等。
出现数据倾斜时,可能就是你的代码中使用了这些算子中的某一个所导致的。

相关文章:

  • Kafka Consumer源码讲解
  • svg中 path标签的d属性
  • 什么样的数字IC后端工程师能拿到高薪Offer?
  • 计算机组成原理_DRAM和SRAM
  • 两个有序序列的中位数
  • 浅析Android UI——View 的绘制
  • 一文看懂25个神经网络模型,神经网络神经元模型
  • 神经网络模型训练过程,神经网络模型应用实例
  • NR PDCCH(二) SearchSpace
  • Vue2(十二):Vuex环境搭建、Vuex工作原理、几个配置项、多组件共享数据、Vuex模块化
  • CREO图文教程:三维设计案例之齿轮参数化设计(渐开线+拉伸+轴阵列)图文教程之详细攻略
  • 【JavaEE进阶系列 | 从小白到工程师】Collections工具类的常用方法
  • Python 标准库之 fileinput 和 文件迭代器
  • C++征途 --- map/multimap容器
  • php 手机营业厅业务管理系统
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • es6(二):字符串的扩展
  • HTML中设置input等文本框为不可操作
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java 多线程基础, 我觉得还是有必要看看的
  • MySQL数据库运维之数据恢复
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PermissionScope Swift4 兼容问题
  • Zsh 开发指南(第十四篇 文件读写)
  • - 概述 - 《设计模式(极简c++版)》
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试之CSS3新特性
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 系统认识JavaScript正则表达式
  • 用Canvas画一棵二叉树
  • 正则学习笔记
  • 最简单的无缝轮播
  • Spring Batch JSON 支持
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(function(){})与(function($){....})(jQuery)的区别
  • (52)只出现一次的数字III
  • (十) 初识 Docker file
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • **CI中自动类加载的用法总结
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net FrameWork总结
  • .NET Standard 的管理策略
  • .NET 回调、接口回调、 委托
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net6使用WebSocket与前端进行通信
  • .NET关于 跳过SSL中遇到的问题
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET企业级应用架构设计系列之结尾篇
  • .NET企业级应用架构设计系列之应用服务器