Spark基础介绍

1. Spark 核心概念
1.1 RDD(弹性分布式数据集)
  • 定义:RDD(Resilient Distributed Dataset)是 Spark 的核心抽象,是不可变、可分区、容错的分布式数据集合。
  • 特性
    • 弹性:自动进行内存和磁盘之间的数据存储切换。
    • 分布式:数据分区存储在集群的多个节点上。
    • 容错:通过 Lineage(血缘关系)重建丢失的数据分区。
  • 创建方式
    • 从 HDFS、本地文件等外部数据源创建。
    • 从现有 RDD 转换而来。
    • 并行化集合(如 sc.parallelize([1,2,3]))。
1.2 转换(Transformation)与动作(Action)
  • 转换:惰性操作,返回新的 RDD(如 mapfilterreduceByKey)。
  • 动作:触发计算并返回结果(如 collectcountsaveAsTextFile)。
  • 惰性计算:转换操作不会立即执行,只有当动作触发时才会进行计算。
1.3 共享变量
  • 广播变量(Broadcast Variables):在每个节点缓存一份只读变量,减少数据传输。
  • 累加器(Accumulators):只能通过关联操作累加,用于计数或求和等场景。
2. Spark 编程模型
2.1 SparkContext
  • Spark 应用的入口点,负责与集群管理器通信,创建 RDD、累加器和广播变量。
  • 在 Spark 2.x 后,推荐使用 SparkSession 统一处理 SQL 和 DataFrame 操作。
2.2 基本操作示例

python

运行

# Python API (PySpark) 示例
from pyspark.sql import SparkSession# 创建 SparkSession
spark = SparkSession.builder \.appName("WordCount") \.getOrCreate()# 创建 RDD
lines = spark.sparkContext.textFile("hdfs://path/to/input.txt")# 转换操作
words = lines.flatMap(lambda x: x.split(" "))
pairs = words.map(lambda x: (x, 1))
counts = pairs.reduceByKey(lambda a, b: a + b)# 动作操作
counts.saveAsTextFile("hdfs://path/to/output")# 关闭 SparkSession
spark.stop()
3. Spark SQL & DataFrame
3.1 DataFrame
  • 带 Schema 的分布式数据集,类似于关系型数据库的表。
  • 支持 SQL 查询和多种数据源(JSON、Parquet、Hive 等)。
  • 性能优化:Catalyst 优化器自动生成高效执行计划。
3.2 Spark SQL
  • 通过 SQL 或 DSL 操作结构化数据。
  • 示例:

python

运行

# 创建 DataFrame
df = spark.read.json("hdfs://path/to/data.json")# SQL 查询
df.createOrReplaceTempView("people")
results = spark.sql("SELECT name, age FROM people WHERE age > 20")# DataFrame API
results.select("name", "age").filter(df["age"] > 20).show()
4. Spark 集群架构
4.1 组件
  • Driver:运行用户程序的主进程,负责调度任务。
  • Executor:工作节点上的进程,执行具体任务并缓存数据。
  • Cluster Manager:资源调度(如 YARN、Kubernetes、Standalone)。
4.2 任务执行流程
  1. Driver 分解作业为 DAG(有向无环图)。
  2. DAG Scheduler 将 DAG 划分为多个 Stage。
  3. Task Scheduler 将任务分配给 Executor 执行。
5. Spark 部署模式
5.1 本地模式
  • 单节点运行,主要用于开发和测试。

bash

spark-submit --master local[4] my_script.py
5.2 集群模式
  • Standalone:Spark 自带的集群管理器。
  • YARN:Hadoop YARN 管理资源(常见于生产环境)。
  • Kubernetes:容器化部署(新兴趋势)。
6. 性能优化
6.1 内存管理
  • 合理配置 spark.memory.fraction(执行内存与存储内存比例)。
  • 使用序列化(如 Kryo)减少内存占用。
6.2 数据倾斜处理
  • 加盐(Salting):对 Key 增加随机前缀。
  • 广播大表 Join 中的小表。
6.3 其他优化
  • 重用 RDD:使用 cache() 或 persist()
  • 合并小文件:使用 coalesce() 减少分区数。
7. 生态系统
7.1 核心模块
  • Spark Core:基础引擎。
  • Spark SQL:结构化数据处理。
  • Spark Streaming:流处理。
  • MLlib:机器学习。
  • GraphX:图计算。
7.2 集成工具
  • Zeppelin/Notebook:交互式开发。
  • MLflow:机器学习生命周期管理。
  • Delta Lake:数据湖事务处理。
8. 应用场景
  • 批处理:ETL、报表生成。
  • 实时分析:日志监控、实时推荐。
  • 机器学习:预测模型训练。
  • 图计算:社交网络分析。

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

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

相关文章

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口,项目初始化时采用单例模式注册SqlSugarClient实例对象,前端页面采用layui布局,并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误: Execute…

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

pdf url 转 图片

背景&#xff1a;vue2.0需要把pdf转成图片&#xff0c;显示在url里面&#xff0c;使用pdfjs-dist来解决 步骤&#xff1a; 1、安装依赖包(我的项目是node12&#xff0c;安装太高版本会报错) npm i pdfjs-dist2.16.105 2、vue代码 <template><div class"main…

理解 Open vSwitch (OVS)

Open vSwitch&#xff08;简称 OVS&#xff09;是一个开源的 虚拟交换机&#xff0c;主要用于 虚拟化环境&#xff08;如 KVM、Xen、Docker&#xff09;和 软件定义网络&#xff08;SDN&#xff09;。它类似于物理交换机&#xff0c;但在软件层面实现&#xff0c;可以灵活地管理…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程&#xff0c;thread为什么成为线程呢&#xff1f;因为他实现了对线程的一个抽象管理&#xff0c;可以管理这个线程&#xff0c;启动&#xff0c;可以查看各种信息 那么协程呢&#xff1f; public fun CoroutineScop…

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…

【 Redis | 实战篇 短信登录 】

前言&#xff1a; 主要完成了基于Session实现登录&#xff0c;解决集群的Session共享问题&#xff0c;从而实现了基于Redis来实现共享Session登录 1.基于Session实现登录 1.1.发送短信验证码 步骤&#xff1a; 前端提交手机号 》校验手机号 》不符合返回错误信息&#xff0…

蓝桥杯14届国赛 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案&#xff0c;分别将他们列为两个数组 {a1,a2,...,an} 和 {b1,b2,...,bm}。两个数组的和相同。 定义一次合并操作可以将某数组内相邻的两个数合并为一个新数&#xff0c;新数的值是…

Doris和Clickhouse对比

目录 一、Doris和Clickhouse对比1. 底层架构**DorisClickHouse** 2. 运行原理DorisClickHouse 3. 使用场景DorisClickHouse 4. 优缺点对比总结 二、MPP架构和Shared-Nothing 架构对比1. 什么是 MPP 架构&#xff1f;定义特点典型代表 2. 什么是 Shared-Nothing 架构&#xff1f…

niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程

一.系统介绍 【全开源】niushop单商户V5多门店版V5.5.0版本&#xff0c;我看很多人都想要 商品称重、商家手机端等插件这套是全插件版本&#xff0c;整合起来本博主也花了不少啦~ Niushop系统是应用thinkphp6开发的完善的电商系统&#xff0c;拥有完善的商品机制&#xff0c;…

内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切

1. 内存、磁盘、CPU的区别和作用 1.1 内存&#xff08;Memory&#xff09; 作用&#xff1a; 内存是计算机的短期存储器&#xff0c;用于存储正在运行的程序和数据。它的访问速度非常快&#xff0c;比磁盘快几个数量级。在分布式计算中&#xff0c;内存用于缓存中间结果、存储…

Jenkins linux安装

jenkins启动 service jenkins start 重启 service jenkins restart 停止 service jenkins stop jenkins安装 命令切换到自己的下载目录 直接用命令下载 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下载直接安装 rpm -ivh jenkins-2.190.3-…

RabbitMQ ②-工作模式

RabbitMQ 工作模式 官方提供了七种工作模式 Simple&#xff08;简单模式&#xff09; P&#xff1a;生产者&#xff0c;发布消息到队列C&#xff1a;消费者&#xff0c;从队列中获取消息并消费Queue&#xff1a;消息队列&#xff0c;存储消息。 一个生产者&#xff0c;一个…

(2)python开发经验

文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 pyside6加载ui文件 方法1&#xff1a; 直接加载ui文件 from PySide6.QtWidgets import QAp…

【C++】互斥锁(Mutex)

在C中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是用于线程同步的重要工具&#xff0c;用于保护共享资源&#xff0c;防止多线程同时访问导致的数据竞争&#xff08;Data Race&#xff09;问题。 以下是C中互斥锁的核心用法和示例&#xff1a; 一、基本互斥锁 std::mut…

Jsoup与HtmlUnit:两大Java爬虫工具对比解析

Jsoup&#xff1a;HTML解析利器 定位&#xff1a;专注HTML解析的轻量级库&#xff08;也就是快&#xff0c;但动态页面无法抓取&#xff09; 核心能力&#xff1a; DOM树解析与CSS选择器查询 HTML净化与格式化 支持元素遍历与属性提取 应用场景&#xff1a;静态页面数据抽…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式&#xff0c;在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入&#xff0c;返回命令模…

[redis进阶六]详解redis作为缓存分布式锁

目录 一 什么是缓存 缓存总结板书: 二 使⽤Redis作为缓存 三 缓存的更新策略 1) 定期⽣成 2) 实时⽣成 四 面试重点:缓存预热,缓存穿透,缓存雪崩 和缓存击穿 1)缓存预热 2)缓存穿透 3)缓存雪崩 4)缓存击穿 五 分布式锁 板书: 1)什么是分布式锁 2)分布式锁的基…

【MySQL】数据表插入数据

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 插入数据概述1.1 插入数据的重要性1.2 插入数据的基本原则 2. 基本插入语句2.1 INSERT INTO语法2.2 插入多行数据2.3 不指定列名的插入2.4 插入NULL和默认值 3. 高级插入技术3.1 使用子查询插入数据3.2 IGNOR…