0%

spark历史服务器配置指南:追踪任务全生命周期

Spark 应用运行时,可通过 4040 端口的 Web UI 实时监控任务状态,但应用停止后该界面会关闭。为了追溯已完成任务的执行详情(如 DAG、Stage、Task 指标),需配置 Spark 历史服务器(History Server),持久化存储任务日志并提供历史查询能力。本文详细讲解历史服务器的配置步骤、启动方法及日志管理,帮助开发者完整追踪任务生命周期。

历史服务器核心作用与原理

解决的核心问题

  • 实时 UI 局限性:Spark 应用运行时的 4040 端口 UI 仅在应用存活时可用,应用停止后无法查看历史数据;
  • 日志持久化需求:生产环境需留存任务日志用于问题排查、性能优化和审计;
  • 集群监控补充:历史服务器可整合所有应用的历史数据,形成全局任务执行报表。

工作原理

  1. 日志收集:Spark 应用运行时,将事件日志(如任务启动、Stage 完成、数据 Shuffle 等)写入指定存储(HDFS 或本地文件系统);
  2. 历史服务器读取:History Server 启动后,从指定存储目录加载历史日志,解析并生成可视化 UI;
  3. Web 访问:用户通过 History Server 的 Web 界面(默认 18080 端口)查询历史任务详情。

历史服务器配置步骤

环境前置条件

  • 已安装并配置 Spark 集群(本地模式、Standalone 或 YARN 模式均可);
  • 若使用 HDFS 存储日志,需确保 HDFS 集群正常运行,且 Spark 有权限读写 HDFS 目录。

配置事件日志存储(spark-defaults.conf)

Spark 事件日志的存储路径和开关通过 spark-defaults.conf 配置,步骤如下:

复制模板文件
阅读全文 »

Spring 事务失效场景深度解析

Spring 事务基于 AOP 动态代理实现,事务失效的本质是:事务相关的 AOP 增强逻辑未被触发。本文从 “代理机制” 切入,逐一拆解 6 种常见失效场景的底层原因,并给出可落地的解决方案,尤其重点讲解 “this 调用失效” 这一难点。

事务失效的核心前提:理解 Spring 事务的 AOP 原理

在分析失效场景前,必须先明确 Spring 事务的执行流程(基于 CGLIB 代理,最常见场景):

  1. 代理类生成:Spring 为标注 @Transactional 的目标 Bean(如 UserService)生成 CGLIB 代理类(继承自目标 Bean);
  2. 外部调用触发增强:当外部代码调用代理类的方法时,代理类会先执行 事务增强逻辑(开启事务),再调用目标 Bean 的原始方法;
  3. 目标方法执行:目标 Bean 执行业务逻辑,若正常完成则代理类触发事务提交,若抛出异常则触发回滚;
  4. 内部调用绕过增强:若目标 Bean 内部通过 this 调用自身方法,this 指向目标 Bean 本身(非代理类),会直接执行原始方法,跳过代理类的增强逻辑 → 事务失效。

6 种事务失效场景与底层解析

1. 场景 1:事务方法非 public 修饰

底层原因

Spring AOP 动态代理(JDK/CGLIB)仅对 public 方法生效:

  • JDK 代理:基于接口实现,仅代理接口中的 public 方法;
  • CGLIB 代理:基于继承生成子类,非 public 方法(private/protected/default)无法被重写,代理类无法插入增强逻辑。

Spring 源码佐证(AbstractFallbackTransactionAttributeSource):

1
2
3
4
5
6
7
protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class<?> targetClass) {
// 非 public 方法直接返回 null,无事务属性
if (Modifier.isPublic(method.getModifiers()) == false) {
return null;
}
// ... 后续逻辑
}

若方法非 public,Spring 会忽略其 @Transactional 注解,不生成事务增强。

阅读全文 »

spark环境配置全指南:从本地模式到 YARN 集群部署

Spark 支持多种运行模式,从本地开发调试到分布式集群部署,满足不同场景需求。本文详细讲解 Spark 三大核心模式(本地模式、Standalone 独立集群、YARN 集群)的环境配置步骤、验证方法及参数说明,帮助开发者快速搭建 Spark 运行环境。

环境准备:前置依赖与基础配置

在配置 Spark 前,需确保基础依赖已安装并正确配置,避免因环境缺失导致部署失败。

前置依赖

依赖 版本要求 作用
Java JDK 8 或 11(推荐 8,兼容性更好) Spark 运行的基础环境
Scala 2.12.x(配合 Spark 3.x) Spark 源码基于 Scala 开发,部分 API 依赖 Scala 环境
Hadoop(可选) 3.x(如使用 HDFS 或 YARN) 提供分布式存储(HDFS)和资源管理(YARN)

Spark 安装包选择

Spark 安装包分为两种类型,根据需求选择:

  • spark-x.x.x-bin-hadoopx.x:内置 Hadoop 依赖,适合快速部署(无需单独配置 Hadoop);
  • spark-x.x.x-bin-without-hadoop:不含 Hadoop 依赖,需手动关联本地 Hadoop 环境(本文以这种为例)。

下载地址:Spark 官方下载页

基础环境变量配置

~/.bash_profile~/.zshrc 中添加环境变量:

阅读全文 »

spark入门实战:WordCount 程序全解析

WordCount(单词计数)是大数据领域的 “Hello World”,通过它可以快速理解 Spark 的核心概念和编程模型。本文以 Scala 为例,从环境准备、代码实现到执行原理,全方位讲解 Spark WordCount 程序,帮助初学者入门 Spark 分布式计算。

环境准备:版本匹配与依赖配置

Spark 对 Scala 版本有严格依赖,错误的版本组合会导致兼容性问题(如类找不到、方法异常),需提前确认版本对应关系。

版本选择原则

  • Spark 2.x 主要支持 Scala 2.11、2.12;
  • Spark 3.x 主要支持 Scala 2.12、2.13(但部分早期 3.x 版本对 2.13 支持不完善);
  • 推荐组合:Spark 3.1.1 + Scala 2.12.x(稳定性好,生态支持完善)。

maven版本对应

Maven 依赖配置

pom.xml 中添加 Spark Core 和 Scala 依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- Scala 核心库 -->  
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.13</version> <!-- 与 Spark 版本匹配 -->
</dependency>

<!-- Spark 核心依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId> <!-- _2.12 表示适配 Scala 2.12 -->
<version>3.1.1</version>
</dependency>

注意:spark-core artifactId 中的 _2.12 必须与 Scala 版本一致,否则会出现 ClassNotFoundException

WordCount 核心代码实现

WordCount 的核心逻辑是 “读取文本 → 拆分单词 → 计数聚合”,Spark 通过 RDD 算子实现分布式计算。

完整代码

阅读全文 »

spark与hadoop深度对比:从架构到场景的全方位解析

Spark 和 Hadoop 是大数据领域的两大核心技术,常被用于海量数据的存储、处理与分析。尽管两者都服务于大数据场景,但在设计理念、架构组成和适用场景上存在显著差异。本文从核心定位、架构组件、性能特性、适用场景等维度进行对比,帮助读者理解两者的区别与联系,合理选择技术方案。

核心定位与设计理念

Hadoop:分布式存储与计算的奠基者

Hadoop 是最早成熟的开源大数据框架,核心定位是 “分布式存储 + 批处理计算”,解决了海量数据的存储和离线处理问题。其设计理念源于 Google 的三篇论文:

  • GFS(Google 文件系统)HDFS(分布式存储);
  • MapReduce → Hadoop MapReduce(分布式计算);
  • BigTableHBase(分布式数据库)。

Hadoop 的核心目标是通过廉价硬件集群实现高容错的大规模数据处理,强调 “磁盘友好”“高容错性”,适合处理 PB 级离线数据。

Spark:内存计算驱动的通用引擎

Spark 诞生于 UC Berkeley AMP 实验室,核心定位是 “快速、通用的分布式计算引擎”,设计理念是 “内存优先”“多场景融合”。Spark 不局限于批处理,而是通过统一引擎支持批处理、流处理、SQL、机器学习等多种场景,强调 “计算速度”“开发效率”

阅读全文 »