基于 Spark 实现 COS 海量数据处理

上周在组内分享了一下这个主题, 我觉得还是摘出一部分当文章输出出来
分享主要包括三个方面: 1. 项目背景 2.Spark 原理 3. Spark 实战
项目背景
主要是将海量日志进行多维度处理;
项目难点
1、数据量大(压缩包数量 6TB,60 亿条数据);
2、在 cos 上的目录不固定;
3、计算方式复杂,各种过滤、聚合、汇总逻辑;
4、处理时间有限,需在 4h 内完成;
基于上述的项目背景和难点, 最终决定采用 Spark,首先数据量大及计算方式复杂, 如果使用传统的服务方式, 需要大量的服务器资源, 而目录不固定, 使数据读取变的复杂, 且普通服务不太可能在 4h 内处理完毕; 综合考虑决定使用 Spark。
那么就要讲讲Spark 是什么, 以及在这些挑战中的优势了
Apache Spark
快速、通用、可扩展的大数据引擎;
优势:
1、快速: Spark 可以中集群中并行处理数据, 重复利用多台机器的计算能力,显著提高处理速度, 对于我们的大数据量场景尤为重要;
2、易于使用的 API, 支持 Java、Python、Scala API; Spark 原生只支持 Scala 和 Java,仅中外围包装通过 PySpark 中间件实现对 Python 语言的支持;
3、通用:提供多种计算模型,如: 批处理、交互式查询(Spark SQL)、实时流处理、机器学习、图计算等,可以灵活应对复杂的计算需求;
4、灵活: 支持多种数据源,如 HDFS、COS、Kafka、HBase 像我们的数据存储在 COS 上, 是可以直接读取 COS 目录, 且对于不确定路径, 可以直接使用* 代替,Hadoop-COS实现了以腾讯云 COS 作为底层文件系统运行上层计算任务的功能,支持使用Hadoop、Spark以及Tez等处理存储在腾讯云COS对象存储系统上的数据,地址如下:
https://github.com/tencentyun/hadoop-cos
Spark 架构
在这里插入图片描述
前面了解了 Spark 是什么, 这里讲一下 Spark 的架构
1、Driver是spark应用程序入口,是spark核心,负责spark集群的链接和资源管理。
2、ClusterManager负责所有Executor的资源管理和调度,Spark可以与多种集群管理器配合使用, 比如yarn k8s。

3、Executor 负责具体作业计算任务。

当我们提交一个任务开始执行时,是如何作业的:

1、启动 Driver 程序,会解析编写的程序,并序列化字节级别代码, 通过 SparkSession 的一个成员变量: SparkContext 向Cluster Manager 发出命令,Cluster Manager 会将当前的资源情况分配合适的资源给 Driver。

2、 Drvier 的字节级别代码会分发至将要执行的 Executor 上, 这些计算过程实际上是在每个节点本地计算并完成,每个spark会在集群中有一个或多个Executor,Executor 之间也可能会有数据的传输,比如一些聚合函数执行。

3、一旦整个执行过程完成,Driver 收集所有 Executor 返回的结果, 结束整个作业,同时像 ClusterManager 释放资源。

4、在整个过程中,Cluster Manager 扮演了资源管理和任务调度的关键角色。它确保了 Spark 作业能够高效地利用集群资源,调度任务到合适的 Executor 上执行,从而实现分布式计算的优势。

通过这种方式, Spark 可以高效利用集群资源, 实现大规模数据的分布式处理

Spark 核心组件

在这里插入图片描述
1、Spark Core是Spark基础,提供内存计算能力, 是分布式处理大数据的基础,它将分布式数据抽象为弹性分布式数据集(RDD),并为运行在其上的上层组件提供 API。所有 Spark 的上层组件都建立在 Spark Core 的基础之上。

2、Spark Streaming 是一个用于处理动态数据流的 Spark 组件。它能够开发出强大的交互和数据查询程序。在处理动态数据流时,流数据会被分割成微小的批处理,这些微小批处理将会在 Spark Core 上按时间顺序快速执行。

3、Spark SQL 是一个用于处理结构化数据的 Spark 组件。它允许使用 SQL 语句查询数据。Spark 支持多种数据源,包括 Hive 表、Parquet 和 JSON 等。

Spark 核心数据结构

在这里插入图片描述
前面我们带过 rdd, rdd 全称为弹性分布式数据集, 是 spark 的核心数据结构,一个不可变的分布式对象集合,

虽然名字带了分布式,但是在使用的时候,是感受不到分布式,就跟操作本地数据集一样操作在分布式存储中的数据。

RDD 特性有三种:

1、弹性

容错分两部分: 1> 机器层面的容错, 节点出错自动重试, 2>RDD层面的容错;也就是血统, rdd 的依赖关系, 有宽依赖和窄依赖, 可以通过血统信息重新计算丢失的分区,而不需要重新计算整个RDD;但是当计算逻辑复杂时,就会引起依赖链过长,重算代价就很高,可以适当使用rdd检查点;

2、分布式

数据分布在集群的多个节点上,RDD的分区(partition)是指将数据集划分成多个部分,以便在集群中的不同节点上并行处理。分区数与集群中的节点数无关,很可能集群中的单个节点有几个数据分区。

3、不可变性

Rdd只能基于在稳定物理存储中的数据集和其他已有的rdd上执行确定性操作来创建。

RDD 支持操作
在这里插入图片描述
rdd支持两种

1、转换,从现有数据集创建一个新的数据集:如map将数据集每个元素传递给函数,返回一个新的分布式数据集表示结果。

RDD的所有转换都是惰性的, 也就是说并不会直接计算,他们只是记住这些应用到基础数据集(比如一个文件)的转换动作, 只有当发生一个要求返回结果给Driver的动作, 才会真正执行; 比如map创建一个新数据集,并在reduce中使用,最终只返回reduce的结果给Driver,而不是整个大的新数据集。

这样Spark就可以了解所有执行的算子, 从而设定并优化执行计划。

2、动作: 如reduce 将所有元素叠加起来,将最终结果返回给Driver

转换算子返回的还是RDD,但是行动算子返回的是非RDD类型值,比如整数,或者无返回值

RDD 依赖关系

1、窄依赖

每一个parent RDD的Partition最多被子RDD的一个Partition使用

2、宽依赖(也称Shuffle依赖)

多个子RDD的Partition会依赖同一个parent RDD的Partition

Shuffle 是指在分布式计算过程中,数据在不同的分区之间重新分配的过程。Shuffle 通常发生在需要跨分区进行数据交换的操作中,例如 groupByKey、reduceByKey、join 等。这些操作需要将数据从一个分区移动到另一个分区,以便进行合并或聚合

在书上截的一个图, 还是很清晰的:
在这里插入图片描述
RDD 逻辑计算图
在这里插入图片描述
这里结合我们的项目背景: 万象图片请求数据, 对海量日志进行多维度处理、计算、分析,我们来了解一下 rdd 的逻辑计算

我们的日志都是以压缩包的方式,json 的格式存储在 cos 上; 首先从 cos读取出来的数据也就是第一步创建 RDD,其中解析 json,确定 key 以及 filter 过滤逻辑, 是 RDD 的转换操作;

转换完成后,进行按桶粒度聚合或者统计,是action动作,生成运算结果, 转换和执行在Executor上操作的;

每个Executor处理其中的一部分RDD,最终将执行结果又写回 COS 上;

RDD 缓存

在这里插入图片描述
Spark 速度非常快的原因之一就是 RDD 缓存。

我们看右侧的这个图, 以场景来说明:

RDD0 过滤生成RDD1, 在RDD1基础上, 进行不同的聚合计算, 常规情况下, 要做两次filter;

首先进行了RDD0→RDD1→RDD2的计算作业,那么计算结束时,RDD1就已经缓存在系统中了。在进行RDD0→RDD1→RDD3的计算作业时,由于RDD1已经缓存在系统中,因此RDD0→RDD1的转换不会重复进行,计算作业只须进行RDD1→RDD3的计算就可以了,因此计算速度可以得到很大提升

所以在不同操作中在内存中持久化(或缓存)一个RDD后,每个节点就将计算的分片结果保存在内存中,对次数据集进行的其他操作中重用。

缓存有可能丢失, 或者基于内存的数据由于内存不足被删除, RDD的缓存机制,保证了即使缓存丢失也能保证计算的正确执行。

Spark 配置及调优
在这里插入图片描述
先讲资源配置:

Executor.memory: 设置过大, 部分任务分配到资源等待, 设置过小,频繁gc,影响性能;

Executor-cores: 每个Executor可以使用的cpu核心数每个Executor可以并行执行多个任务,核心数越多,Executor的并行处理能力越强。
在这里插入图片描述
在代码中的一些使用: 数据处理优化;

数据分区设置: 分区数决定了数据集被划分成多少个部分,影响到并行度和任务调度。过多: 上下文频繁切换;过少,并行度不足,任务处理数据量大,影响作业完成时间;

那么如何合理设置分区数:

分区数应根据数据量和集群的计算资源来设置。一个常见的经验法则是每个分区的数据量在 128MB 到 256MB 之间。在实际运行中,监控作业的执行情况,观察任务的执行时间、资源利用率等指标,根据实际情况进行调整。

数据倾斜:数据倾斜会导致某些任务处理数据量过大, 以reduceByKey 和groupByKey 为例:

1> 内存使用

groupByKey 会将所有具有相同键的值聚集到一个列表中,这可能会导致大量的数据在内存中存储,尤其是当某个键的值非常多时。这可能会导致内存溢出或性能下降。

reduceByKey 在每个分区内先进行局部聚合(即在每个分区内对相同键的值进行合并),然后再将结果发送到 reducer。这种方式减少了需要传输的数据量,从而降低了内存使用和网络传输的开销。

2> 网络传输

groupByKey 会将所有相同键的值发送到同一个节点,这可能会导致大量的数据在网络中传输。

reduceByKey 通过在每个分区内进行局部合并,减少了需要在网络中传输的数据量,从而提高了性能。

缓存: 将常用数据进行缓存,缓存有几种形式, 比如都放内存中, 可以选择节省空间的级别,序列化对象等多种级别。
在这里插入图片描述
1> 比如在使用filter算子后,通常数据会被打碎成很多个小分区,这会影响后面的执行操作,可以先对后面的数据用coalesce算子进行一次合并。

2>像在实际处理cos 文件, 文件只有几十 k,但是十几万的数据, 光遍历读 COS 就需要 1h+, 处理加工只需要 30min;

到这里, 就结束了!

附录 COS 使用 demo:

https://cloud.tencent.com/document/product/436/79146

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

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

相关文章

Unity3D 屏幕点击特效

实现点击屏幕任意位置播放点击特效。 屏幕点击特效 需求 现有一个需求,点击屏幕任意位置,播放一个点击特效。 美术已经做好了特效,效果如图: 特效容器 首先,画布是 Camera 模式,画布底下有一个 UIClic…

MCU编程

MCU 编程基础:概念、架构与实践 一、什么是 MCU 编程? MCU(Microcontroller Unit,微控制器) 是将 CPU、内存、外设(如 GPIO、UART、ADC)集成在单一芯片上的小型计算机系统。MCU 编程即针对这些…

Go语言--语法基础6--基本数据类型--数组类型(1)

Go 语言提供了数组类型的数据结构。 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的 原始类型例如整型、字符串或者自定义类型。相对于去声明number0,number1, ..., and number99 的变量,使用数组形式 numbers[0], …

左神算法之给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个 2. 解释 略 3. 思路 直接用hashSet进行存储,查这个值加上k后的值是否在数组中 4. 代码 public class Problem01_SubvalueEqualk {…

自回归(AR)与掩码(MLM)的核心区别:续写还是补全?

自回归(AR)与掩码(MLM)的核心区别:用例子秒懂 一、核心机制对比:像“续写”还是“完形填空”? 维度自回归(Autoregressive)掩码语言模型(Masked LM)核心目标根据已生成的token,预测下一个token(顺序生成)预测句子中被“掩码”的token(补全缺失信息)输入输出输入…

后端开发两个月实习总结

前言 本人目前在一家小公司后端开发实习差不多两个月了,现在准备离职了,就这两个月的实习经历写下这篇文章,既是对自己实习的一个总结,也是给正在找实习的小伙伴以及未来即将进入到后端开发这个行业的同学的分享一下经验。 一、个…

Python基础(​​FAISS​和​​Chroma​)

​​1. 索引与查询性能​ ​​指标​​​​FAISS​​​​Chroma​​​​分析​​​​索引构建速度​​72.4秒(5551个文本块)91.59秒(相同数据集)FAISS的底层优化(如PQ量化)加速索引构建,适合批…

Windows下memcpy_s如何在Linux下使用

Windows下代码如下 memcpy_s(pLine->ppBuf[i], m_ColorLineByte, pIn nOffset, m_ColorLineByte); 方案 1:使用标准 memcpy 手动检查(最通用) // 检查参数有效性 if (pLine->ppBuf[i] nullptr || pIn nullptr || m_ColorLi…

2025年数学算法与自动化控制国际会议(ICMAAC 2025)

2025年数学算法与自动化控制国际会议(ICMAAC 2025) 2025 International Conference on Mathematical Algorithms and Automation Control 一、大会信息 会议简称:ICMAAC 2025 大会地点:中国长沙 审稿通知:投稿后2-3日…

C语言数组介绍 -- 一维数组和二维数组的创建、初始化、下标、遍历、存储,C99 变长数组

目录 1. 一维数组 1.1 数组的概念 1.2 一维数组的创建 1.3 一维数组的初始化 1.4 数组的类型 1.5 数组下标 1.5.1 数组元素的遍历 1.5.2 数组的输入 1.6 一维数组在内存中的存储 1.7 sizeof 计算数组元素个数 2. 二维数组 2.1 二维数组的创建 2.2 二维数组的初始…

SpringAI + DeepSeek大模型应用开发 - 进阶篇(上)

三、SpringAI 2. 哄哄模拟器 2.1 提示词工程 提示词工程(Prompt Engineering):通过优化提示词,使大模型生成尽可能理想的内容,这一过程就叫提示词工程。 (1)清晰明确的指令 谈谈人工智能 …

Spring Boot实现异常处理

Spring Boot 提供了多种灵活的方式实现异常处理,以下是核心方案和最佳实践: 一、基础异常处理方案 1. ControllerAdvice ExceptionHandler(全局处理) ControllerAdvice public class GlobalExceptionHandler {// 处理特定异常&…

【目标检测】IOU的概念与Python实例解析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官网地址&#xff1a;vue-print-nb - npm 1.安装 npm install vue-print-nb --save 2.导入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置参数 4.页面使用 <div id"printDiv">打印内容</div><el-button v-print&…

Matplotlib快速入门

目录 基本使用 解决中文乱码 一个坐标系绘制多个图像 多个坐标系绘制 基本使用 什么是Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进&#xff0c;交互式方式实现数据可视化 为什么要学习matplotlib 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解…

扣料不允许‘货物移动’

遇到了报错&#xff0c;不允许货物移动 以为又是和之前一样是订单已经关闭&#xff0c;看是领错料还是财务误关的原因&#xff0c;但是co03一看订单状态并没有关闭 原因就是这个CRTD 订单只是创建了&#xff0c;但是没有下达 找个正常的看看&#xff1a; 一般订单创建和下达都…

【AI】全新AI测试系列之二--------AI自动化测试,提高测试效率

目录 一、自动化测试 1、与手动测试对比 2、自动化测试流程 二、自动化测试环境搭建 三、web自动化使用AI的两种方式 1、利用DeepSeek快速生成脚本 2、pycharm集成通义灵码 四、通义灵码实战 1、使用提示词生成代码 2、使用pytest框架 前言&#xff1a;上一章节只要是…

npm包冲突install失败

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一个命令行选项&#xff0c;主要用于解决依赖冲突问题。当安装依赖时&#xff0c;npm默认会严格检查peer dependencies&#xff08;对等依赖&#xff09;的版本兼容性&#xff0c;可能导致安装失败。启用此选…

68、数据访问-crud实验-删除用户完成

68、数据访问-crud实验-删除用户完成 以下是完成“数据访问-CRUD实验-删除用户”功能的一般步骤&#xff0c;以常见Web应用框架&#xff08;如Spring Boot MyBatis-Plus、Django、Ruby on Rails&#xff09;为例&#xff1a; #### 准备工作 - **数据库表设计**&#xff1a;确…

实现 TurtleBot3 多点轨迹跟踪导航

系统架构 move_base本身不支持一次性发送多个目标点并自动按顺序导航,使用nav_msgs/Path消息类型发布多个路径点,然后让机器人按顺序依次到达每个路径点。 发布一个包含多个路径点的Path消息(可选,用于在RVIZ中显示路径)。按顺序将每个路径点作为MoveBaseGoal发送给move_…