大数据面试题 —— 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.rhkb.cn/news/318562.html

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

相关文章

【Java EE】Mybatis之XML详解

文章目录 🎍配置数据库连接和MyBatis🍀写持久层代码🌸添加mapper接口🌸添加UserInfoXMLMapper.xml🌸单元测试 🌲CRUD🌸增(Insert)🌸删(Delete)🌸改(Update)🌸…

GaussDB数据库事务管理

一、引言 事务管理是数据库系统中至关重要的一部分,它确保了数据库的一致性和可靠性。在GaussDB数据库中,事务管理不仅遵循传统的ACID特性,还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念 2.1…

es环境安装及php对接使用

Elasticsearch Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的…

【小沐学Java】VSCode搭建Java开发环境

文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在桌面上…

FP16、BF16、INT8、INT4精度模型加载所需显存以及硬件适配的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

让抖音引流更简单,利用自动评论引流策略

在当前的社会环境中,抖音已经成为了许多人日常生活中不可或缺的一部分。无论是年轻人还是中老年人,都对抖音充满了热情。然而,对于一些想要通过抖音变现的人来说,他们可能会感到困惑,不知道如何操作。今天,…

rust疑难杂症

rust疑难杂症解决 边碰到边记录,后续可能会逐步增加,备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁, 有时vscode中项目比较多,如果其中某些库应用有问题&…

nginx--自定义日志跳转长连接文件缓存状态页

自定义日志服务 [rootlocalhost ~]# cat /apps/nginx/conf/conf.d/pc.conf server {listen 80;server_name www.fxq.com;error_log /data/nginx/logs/fxq-error.log info;access_log /data/nginx/logs/fxq-access.log main;location / {root /data/nginx/html/pc;index index…

golang 基础知识细节回顾

之前学习golang的速度过于快,部分内容有点囫囵吞枣的感觉,写gorm过程中有很多违反我常识的地方,我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大,之前编辑springboot的error c…

【JAVA基础之反射】反射详解

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 1.反射 1.1 概述 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接:1049.最后一块石头的重量II 视频链接:这个背包最多能装多少?L…

成都旅游攻略

第一天 大熊猫基地(55一人) 切记要去早,否则只能看到熊猫屁股 文殊院(拜文殊菩萨) 杜甫草堂(50一人) 宽窄巷子(旅游打卡拍照) 奎星楼街吃晚饭 这里的饭菜很可口 第二天 东郊记忆(成都故事.川剧变脸)主要是拍照打卡 春熙路 IFS国金中心(打卡熊猫屁屁) 太…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 : 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务,这在处理需要等待一段时间后才能执行的操作时特别有用,如发送提醒、定时任务等。文中,将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…

【C++STL详解(五)】--------list的介绍与使用

目录 前言 一、list的介绍 二、list的使用 Ⅰ.默认成员函数 1、构造函数 2、赋值重载 3、析构函数 Ⅱ、容量 1.size() Ⅲ、迭代器与遍历 1.beginend (正向迭代器) 2.rbeginrend (反向迭代器) 3.front 4.back Ⅳ、增删查改 1.push_front 2.pop_front 3.push_b…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建(推荐)vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

CUDA共享内存

GPU中有两种类型的内存: 板载内存片上内存 全局内存是较大的板载内存,延迟相对较高;共享内存是较小的片上内存,具有相对较低的延迟。共享内存的常用用途: 块内线程的通信通道全局内存数据的可编程管理缓存高速暂存存…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代,设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天,我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关! 一、HiWoo Box网关:一站式解决…

confluence 设置https代理

使用nginx反待confluence并开启https后,登录confluence会一直提示:scheme、proxyName、proxyPort设置错误。 解决办法: find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

jvm垃圾回收机制介绍

JVM(Java虚拟机)是Java程序的运行环境,它负责执行字节码文件。JVM的工作原理主要包括以下几个部分:类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码,执行引擎负…

SQL数据库

一.什么是数据库 数据库:存储数据的仓库,数据是有组织的进行存储。(database 简称DB) 数据库管理系统:管理数据库的大型软禁(DataBase Management System 简称DBMS) SQL:操作关系…