spark任务,使用 repartition 对数据进行了重新分区,但任务输入数据大小仍存在不均衡

news2024/9/20 13:41:36

目录

目录

确认 Spark 任务重新分区后的数据不均衡

1. 检查分区大小

2. 使用 DataFrame API 检查分区

3. 使用 Spark UI 查看分区情况

4. 使用日志记录分区信息

可能原因

1. 数据分布不均衡

2. 分区策略

3. 数据预处理

解决方案

1. 检查数据分布

2. 使用 coalesce 减少分区

3. 自定义分区器

4. 数据预处理优化

结论


做了一个操作,发现数据不均衡:

sp_bp_pic_df = chengren_sp_bp_link_df.select("pic_large_url_list", "pic").dropDuplicates(["pic_large_url_list", "pic"]).repartition(300).cache()

确认 Spark 任务重新分区后的数据不均衡

要确认 Spark 任务在使用 repartition 对数据进行了重新分区后,任务输入数据大小仍存在不均衡,可以通过以下步骤进行验证和分析:

1. 检查分区大小

使用 RDD.glom() 方法可以查看每个分区的数据量。glom() 方法将每个分区的数据转换为一个列表,从而可以检查每个分区的大小。

# 获取每个分区的大小
partition_sizes = sp_bp_pic_df.rdd.glom().map(len).collect()

# 打印每个分区的大小
for i, size in enumerate(partition_sizes):
    print(f"Partition {i}: {size} records")

2. 使用 DataFrame API 检查分区

可以通过 DataFrame API 来检查每个分区的数据量,确保数据分布均匀。

# 获取每个分区的大小
partition_sizes = sp_bp_pic_df.rdd.mapPartitionsWithIndex(
    lambda idx, it: [(idx, len(list(it)))], preservesPartitioning=True).collect()

# 打印每个分区的大小
for idx, size in partition_sizes:
    print(f"Partition {idx}: {size} records")
3. 使用 Spark UI 查看分区情况

在运行 Spark 作业时,可以通过 Spark UI 查看每个任务的输入数据大小和分区情况。

  1. 打开 Spark UI

    • 运行 Spark 作业时,Spark UI 通常会在本地机器的 4040 端口(或其他端口)启动。可以通过浏览器访问 http://localhost:4040 查看 Spark UI。
  2. 查看 Stages 页面

    • 在 Spark UI 中,点击 "Stages" 标签,可以查看所有阶段的详细信息,包括每个阶段的任务数量、输入输出大小等。
  3. 查看 Tasks 页面

    • 在每个阶段的详细信息页面中,可以查看每个任务的输入数据大小。如果某些任务的输入数据大小明显大于其他任务,说明数据分布不均衡。
4. 使用日志记录分区信息

可以在代码中添加日志记录,输出每个分区的数据量,以便在日志中查看分区情况。

 
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 获取每个分区的大小并记录日志
partition_sizes = sp_bp_pic_df.rdd.mapPartitionsWithIndex(
    lambda idx, it: [(idx, len(list(it)))], preservesPartitioning=True).collect()

for idx, size in partition_sizes:
    logger.info(f"Partition {idx}: {size} records")

可能原因

尽管您已经使用 repartition 对数据进行了重新分区,但任务输入数据大小仍存在不均衡的情况。这可能由以下几个原因引起:

1. 数据分布不均衡

即使在重新分区后,数据分布仍可能不均衡。例如,如果某些键的频率远高于其他键,重新分区也可能无法完全平衡数据。

2. 分区策略

repartition 使用随机分区策略,可能会导致某些分区的数据量仍然较大。如果数据本身存在倾斜,随机分区可能无法解决问题。

3. 数据预处理

在 repartition 之前进行的操作(如 dropDuplicates)可能会影响数据的分布,导致某些分区的数据量较大。

解决方案

为了进一步优化数据分布,可以尝试以下几种方法:

1. 检查数据分布

首先,检查数据的分布情况,以确定是否存在数据倾斜。可以通过以下代码查看每个分区的数据量:

from pyspark.sql import Row

# 获取每个分区的大小
partition_sizes = sp_bp_pic_df.rdd.glom().map(len).collect()

# 打印每个分区的大小
for i, size in enumerate(partition_sizes):
    print(f"Partition {i}: {size} records")
2. 使用 coalesce 减少分区

如果数据量较小,可以尝试使用 coalesce 减少分区数量,以提高数据的均匀分布:

 

sp_bp_pic_df = sp_bp_pic_df.coalesce(100).cache()

3. 自定义分区器

如果数据存在显著的倾斜,可以使用自定义分区器来更好地平衡数据。例如,可以使用 hash 分区器:

from pyspark.sql.functions import hash

# 添加一个分区键
sp_bp_pic_df = sp_bp_pic_df.withColumn("partition_key", hash(col("pic_large_url_list")))

# 按分区键进行重新分区
sp_bp_pic_df = sp_bp_pic_df.repartition(300, "partition_key").drop("partition_key").cache()
 
4. 数据预处理优化

在进行 repartition 之前,尽量减少不必要的操作(如 dropDuplicates)对数据分布的影响。可以在重新分区后进行这些操作:

# 先重新分区,再去重
sp_bp_pic_df = chengren_sp_bp_link_df.repartition(300, "pic_large_url_list", "pic").dropDuplicates(["pic_large_url_list", "pic"]).cache()

结论

尽管已经使用 repartition 进行了分区,但任务输入数据大小仍可能不均衡。通过检查数据分布、使用自定义分区器、优化数据预处理等方法,可以进一步优化数据分布,减少任务输入数据大小的不均衡,提高作业的整体性能和效率。

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

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

相关文章

Elasticsearch:Node.js ECS 日志记录 - Pino

在我的上一篇文章 “Beats:使用 Filebeat 从 Python 应用程序中提取日志” 里,我详述了如何使用 Python 来生成日志,并使用 Filebeat 来收集日志到 Elasticsearch 中。在今天的文章中,我来详细描述如何使用 Node.js 来生成 ECS 相…

ubuntu18修改文件打开数

Ubuntu18永久修改 最大文件打开数和最大线程数 1、查看操作系统: cat /etc/os-release2、查看当前用户设置: ulimit -a 或者: ulimit -nopen files 是当前最大文件打开数量 max user processes是当前最大线程数量 3、永久修改配置&#x…

音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析

一、引言 FFmpeg源码对AnnexB包装的H.264码流解码过程中,通过ff_h2645_extract_rbsp函数拿到该H.264码流中的某个NALU的NALU Header RBSP后(具体可以参考:《FFmpeg源码:ff_h2645_extract_rbsp函数分析》)&#xff0c…

7月5日,自然保护地总体规划智能编制系统,线上宣讲会(腾讯会议:638-228-003)

7月5日(本周五)下午2:30,国家林草局林草调查规划院胡理乐研究员,介绍自然保护地总体规划智能编制系统,欢迎大家线上参加!(腾讯会议号:638-228-003) 系统主要特色&#x…

内存与硬盘(笔记)

文章目录 1. 内存① 笔记② 相关软件 2. 硬盘① 笔记② 相关软件 3. 区别:4. 推荐 1. 内存 ① 笔记 ① 笔记本的内存条和台式机的内存条是不互通的 ② 我们常说的内存其实指的是运行内存(前台后台同时能运行多少APP) ③ 下图来自京东: 解析&#xff1…

ShardingSphereConnection@4691d] will not be managed by Spring

boot整合分库分表后启动执行,提示链接不被spring管理, 应该看自己需要, 解决:

(十一) Docker compose 部署 Mysql 和 其它容器

文章目录 1、前言1.1、部署 MySQL 容器的 3 种类型1.2、M2芯片类型问题 2、具体实现2.1、单独部署 mysql 供宿主机访问2.1.1、文件夹结构2.1.2、docker-compose.yml 内容2.1.3、运行 2.2、单独部署 mysql 容器供其它容器访问(以 apollo 为例)2.2.1、文件…

近红外光谱脑功能成像(fNIRS):2.实验设计、指标计算与多重比较

一、实验设计的策略与方法 近红外光谱成像(INIRS)作为一种非侵入性脑功能成像技术,为研究大脑活动提供了一种高效、生态效度高的方法。然而,为了充分利用INIRS技术并确保实验结果的准确性和可靠性,研究者必须精心设计实…

【密码学】流密码的基本概念

在介绍流密码之前,我们先来弄明白一个基础前置知识点——异或运算。 一、异或运算(XOR) 运算规则:相同为0,不同为1 特点:一个比特进行两次异或运算,可以恢复成原来的比特。 明文:110…

【沐风老师】3DMAX建筑体块生成插件BuildingBlocks使用方法详解

BuildingBlocks建筑体块生成插件使用方法详解 听说你还在手动建配景楼?有了BuildingBlocks这个插件,一分钟搞定喔! 3DMAX建筑体块生成插件BuildingBlocks,用于快速自定义街道及生成配景楼区块。 【适用版本】 3dMax2019及更高版…

DataExcelServer局域网文件共享服务器增加两个函数

1、PFSUM合并指定路径下单元格ID的值 PFSUM("/103采购/8月采购名细","amount") 第一个参数为路径,第二个参数为单元格的ID 2、PFQuery 查询路径下 单元格ID值的列表 PFQuery("/103采购/8月采购名细","amount") 查询/103采…

LLM- 注意力机制

一:什么是注意力机制,以及产生背景? (1):RNN模型[RNN模型]的缺点:下图是例如RNN模型解决机器翻译的例子,从这个例子可以看到Encoder最后一个向量(eos)送给了…

经常用借呗和花呗对征信有影响吗?

说起支付宝里的花呗和借呗,大伙儿肯定都不陌生,它们俩就像是支付宝里的信用贷款双胞胎,名字相近,性格却大相径庭。现在,这俩兄弟都乖乖地接入了央行的征信大家庭,你的每一次使用,都会被记录得清…

Oracle AWR报告快速分析工具

一、背景 详细大家都遇到过需要分析Oracle AWR报告的场景,分析AWR对于专业DBA不是什么问题,但是对于一些业务后台研发确实有些困难,很多业务研发人员看的就是条目太多,无从下手。 不过最近我在使用墨天轮浏览国产信创数据库时&am…

红外光气体检测:1.分子振动与红外吸收、检测系统的基本模型和红外敏感元件

分子振动与红外吸收 分子偶极矩的变化频率与分子内原子振动状态有关:μqd,其中μ是偶极矩,q是电荷,d是正负电荷中心距离。 分子在…

【AI大模型】赋能儿童安全:楼层与室内定位实践与未来发展

文章目录 引言第一章:AI与室内定位技术1.1 AI技术概述1.2 室内定位技术概述1.3 楼层定位的挑战与解决方案 第二章:儿童定位与安全监控的需求2.1 儿童安全问题的现状2.2 智能穿戴设备的兴起 第三章:技术实现细节3.1 硬件设计与选择传感器选择与…

如何在Excel中对一个或多个条件求和?

在Excel中,基于一个或多个条件的求和值是我们大多数人的常见任务,SUMIF函数可以帮助我们根据一个条件快速求和,而SUMIFS函数可以帮助我们对多个条件求和。 本文,我将描述如何在Excel中对一个或多个条件求和? 在Excel中…

【详细教程】PowerDesigner导出表结构word文档

📖【详细教程】PowerDesigner导出表结构word文档 ✅第一步:新建报告✅第二步:配置导出的参数✅第三步:导出 ✅第一步:新建报告 ✅第二步:配置导出的参数 如果你只需要导出纯粹的表结构,那么下面…

html——VSCode的使用

快捷键 快速生成标签:标签名tab 保存文件:CtrlS 设置自动保存【文件】→【自动保存】 快速查看网页效果:右击→Open in Default Browser 快捷键:altb 注意:必须安装了open in brows…

【C语言】return 关键字详解

在C语言中,return是一个关键字,用于从函数中返回值或者结束函数的执行。它是函数的重要组成部分,负责将函数的计算结果返回给调用者,并可以提前终止函数的执行。 主要用途和原理: 返回值给调用者: 当函数执…