大数据面试题 —— Spark数据倾斜及其解决方案

目录

  • 1 调优概述
  • 2 数据倾斜发生时的现象
  • 3 数据倾斜发生的原理
  • 4 如何定位导致数据倾斜的代码
    • 4.1 某个 task 执行特别慢的情况
    • 4.2 某个 task 莫名其妙内存溢出的情况
  • 5 查看导致数据倾斜的 key 的数据分布情况
  • 6 数据倾斜的解决方案
    • 6.1 使用 Hive ETL 预处理数据
    • 6.2 过滤少数导致倾斜的 key
    • 6.3 提高 shuffle 操作的并行度
    • 6.4 两阶段聚合(局部聚合+全局聚合)
    • 6.5 将 reduce join 转为 map join
    • 6.6 采样倾斜 key 并分拆 join 操作
    • 6.7 使用随机前缀和扩容 RDD 进行 join

1 调优概述


有的时候,我们可能会遇到大数据计算中一个最棘手的问题 —— 数据倾斜,此时 Spark 作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决
不同类型的数据倾斜问题,以保证 Spark 作业的性能。

2 数据倾斜发生时的现象


绝大多数 task 执行得都非常快,但个别 task 执行极慢。比如,总共有 1000 个
task,997 个 task 都在 1 分钟之内执行完了,但是剩余两三个 task 却要一两个
小时。这种情况很常见。原本能够正常执行的 Spark 作业,某天突然报出 OOM(内存溢出)异常,观察异常栈,是我们写的业务代码造成的。这种情况比较少见。

3 数据倾斜发生的原理


数据倾斜的原理很简单:在进行 shuffle 的时候,必须将各个节点上相同的 key
拉取到某个节点上的一个 task 来进行处理,比如按照 key 进行聚合或 join 等操
作。此时如果某个 key 对应的数据量特别大的话,就会发生数据倾斜。比如大部分 key 对应 10 条数据,但是个别 key 却对应了 100 万条数据,那么大部分 task
可能就只会分配到 10 条数据,然后 1 秒钟就运行完了;但是个别 task 可能分配
到了 100 万数据,要运行一两个小时。因此,整个 Spark 作业的运行进度是由运
行时间最长的那个 task 决定的。

因此出现数据倾斜的时候,Spark 作业看起来会运行得非常缓慢,甚至可能因为
某个 task 处理的数据量过大导致内存溢出。

下图就是一个很清晰的例子:hello 这个 key,在三个节点上对应了总共 7 条数
据,这些数据都会被拉取到同一个 task 中进行处理;而 world 和 you 这两个 key
分别才对应 1 条数据,所以另外两个 task 只要分别处理 1 条数据即可。此时第
一个 task 的运行时间可能是另外两个 task 的 7 倍,而整个 stage 的运行速度也
由运行最慢的那个 task 所决定。

在这里插入图片描述

4 如何定位导致数据倾斜的代码


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

4.1 某个 task 执行特别慢的情况


首先要看的,就是数据倾斜发生在第几个 stage 中

  • 如果是用 yarn-client 模式提交,那么本地是直接可以看到 log 的,可以在 log 中找到当前运行到了第几个stage;
  • 如果是用 yarn-cluster 模式提交,则可以通过 Spark Web UI 来查看当前运行到了第几个 stage。

补充知识:driver 主要负责管理整个集群的作业任务调度,executor 是一个JVM进程,专门用于计算的节点。在 yarn-client 模式下,driver运行在客户端,在 yarn-cluster 模式下,driver运行在yarn集群。

此外,无论是使用 yarn-client 模式还是 yarn-cluster 模式,我们都可以在
Spark Web UI 上深入看一下当前这个 stage 各个 task 分配的数据量,从而进一
步确定是不是 task 分配的数据不均匀导致了数据倾斜。

比如下图中,倒数第三列显示了每个 task 的运行时间。明显可以看到,有的 task
运行特别快,只需要几秒钟就可以运行完;而有的 task 运行特别慢,需要几分
钟才能运行完,此时单从运行时间上看就已经能够确定发生数据倾斜了。此外,
倒数第一列显示了每个 task 处理的数据量,明显可以看到,运行时间特别短的
task 只需要处理几百 KB 的数据即可,而运行时间特别长的 task 需要处理几千
KB 的数据&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神之浩劫2下载教程 MOBA新游神之浩劫2在哪下载/怎么下载

《神之浩劫2Smite 2》重新定义了MOBA游戏的征服模式,为玩家带来更多的互动和进展。最近的开发者深度挖掘展示了游戏地图的全新设计,既简化了基本操作,又丰富了游戏选择。游戏中的敌人也有了新的进展方式。例如,击败火巨人和金之怒…

vue 脚手架 创建vue3项目

创建项目 命令:vue create vue-element-plus 选择配置模式:手动选择模式 (上下键回车) 选择配置(上下键空格回车) 选择代码规范、规则检查和格式化方式: 选择语法检查方式 lint on save (保存就检查) 代码文件中有代码不符合 l…

如何运用结构化思维来规划个人发展

结构化思维不仅在工作中非常有用,在日常生活中同样可以发挥巨大作用。无论是解决家庭琐事、规划个人发展,还是做出重要决策,结构化思维都能帮助我们更有条理地思考和行动。 一、解决生活中的问题 生活中总会遇到各种各样的问题&#xff0…

力扣HOT100 - 131. 分割回文串

解题思路&#xff1a; class Solution {List<List<String>> res new ArrayList<>();List<String> pathnew ArrayList<>();public List<List<String>> partition(String s) {backtrack(s,0);return res;}public void backtrack(Str…

vue知识

一、初始vue Vue核心 Vue简介 初识 (yuque.com) 1.想让Vue工作&#xff0c;就必须创建一个Vue实例&#xff0c;且要传入一个配置对象 2.root容器里的代码依然符合html规范&#xff0c;只不过混入了一些特殊的Vue语法 3.root容器里的代码被称为【Vue模板】 4.Vue实例和容器…

Web-SpringBootWeb

创建项目 后面因为报错&#xff0c;所以我把jdk修改成22&#xff0c;仅供参考。 定义类&#xff0c;创建方法 package com.start.springbootstart.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotati…

手机运营商二要素验证接口:确保业务操作安全可靠

手机运营商二要素验证接口是一种通过与电信运营商合作的方式&#xff0c;检验手机用户的手机号码与姓名是否一致的服务。这个接口可以广泛应用于各种需要用户实名认证的场景&#xff0c;例如电商、游戏、直播以及金融等行业。 这个接口的作用非常重要&#xff0c;它可以帮助企…

简要说说软分叉和硬分叉。

前言 一、软分叉 二、硬分叉 三、用途 总结 前言 软分叉和硬分叉是区块链技术中的两个重要概念&#xff0c;它们通常与加密货币的网络升级有关。下面我将分别解释这两个概念&#xff0c;并提供一些例子来帮助理解。下面是方便理解软分叉和硬分叉的图 一、软分叉 软分叉是一…

QT程序通过GPIB-USB-HS转接线控制数字万用表

1、硬件准备 1.1、数字万用表 型号 &#xff1a;Agilent 34401A 前面图示&#xff1a; 后面图示&#xff1a;有GPIB接口 1.2、GPIB-USB-HS转接线 2、GPIB协议基础了解 2.1、引脚 8条数据线&#xff1a;DIO1 ~ DIO8 5条管理线&#xff1a;IFC、ATN、REN、EOI、SRQ 3条交握线…

C# Web控件与数据感应之 ListControl 类

目录 关于数据感应 ListControl 类类型控件 范例运行环境 数据感应通用方法 设计 实现 调用示例 数据源 调用 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;诸如 System.Web.UI.WebControls 里…

基于FPGA的数字信号处理(2)--什么是定点数?

在实际的工程应用中&#xff0c;往往会进行大量的数学运算。运算时除了会用到整数&#xff0c;很多时候也会用到小数。而我们知道在数字电路底层&#xff0c;只有「高电平1」和「低电平0」的存在&#xff0c;那么仅凭 0和1 该如何表示小数呢&#xff1f; 数字电路中&#xff0…

鸿蒙原生应用元服务开发-Web加载本地页面

将本地页面文件放在应用的rawfile目录下&#xff0c;开发者可以在Web组件创建的时候指定默认加载的本地页面 &#xff0c;并且加载完成后可通过调用loadUrl()接口变更当前Web组件的页面。 在下面的示例中展示加载本地页面文件的方法&#xff1a; 将资源文件放置在应用的resou…

Arcpy入门学习笔记(三):数据属性的读取

Arcpy入门学习笔记&#xff08;三&#xff09;&#xff1a;数据属性的获取 文章目录 Arcpy入门学习笔记&#xff08;三&#xff09;&#xff1a;数据属性的获取常用的属性Describe对象属性&#xff08;部分&#xff09;数据集属性&#xff08;部分&#xff09;表属性&#xff0…

锂电池SOH预测 | 基于LSTM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

[docker] 多容器项目 - PHP+MySQL+Nginx+utility containers

[docker] 多容器项目 - PHPMySQLNginxutility containers 这个项目总共会配置 6 个容器&#xff0c;主要还是学习一下 docker 的使用和配置&#xff0c;目标是&#xff1a; 本机不安装 PHP、Nginx 安装部分全都交给 docker 容器实现 可以运行一个 Laravel 网页项目 修改本机…

基于遗传算法的TSP算法(matlab实现)

一、理论基础 TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题&#xff0c;即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长&#xff0c;到目前为止还未找到一个多项式时间的有效算法。TSP问题可描述为&#xff1a;已知n个城市相互之间的距离&…

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …

开源代码分享(26)-考虑预测不确定性的综合能源调度优化

参考文献&#xff1a; [1]崔杨,周慧娟,仲悟之,等.考虑源荷两侧不确定性的含风电电力系统低碳调度[J].电力自动化设备,2020,40(11):85-93.DOI:10.16081/j.epae.202009019. 1.基本原理 考虑碳交易机制能够有效提高风电消纳量&#xff0c;但是随着风电并网容量的增大&#xff0c…

【安卓13】谷歌桌面Launcher3屏蔽全部应用里面的部分app

1、需求 我们在做谷歌桌面时&#xff0c;移植了一些我们自己的应用&#xff0c;但是有些应用是服务型的app&#xff0c;不需要显示在主页&#xff0c;要隐藏掉 2、解决方案 方法1&#xff1a; 解决办法很简单&#xff0c;阅读源码发现&#xff0c;谷歌桌面添加全部应用的源…

使用yolo识别模型对比两张图片并标记不同(2)

上篇文章有漏洞&#xff0c;在这里补充下&#xff0c;比如要识别第二张图相对于第一张图的违建是否拆除了 第一步旋转对其后&#xff0c;图片会有黑色的掩码&#xff0c;如果旋转角度大的话&#xff0c;没识别出来的框可能不是已经拆除了&#xff0c;而是因为黑色掩码遮挡&…