学游者

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

spark的一些信息总结:Apache Spark is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.

使用场景1:统计字段多少,可以用单key算子

使用场景1:对key的记录(消费金额、商品售卖记录,设备记录等等)做聚合统计,可以用key-value算子

优化点:先集合在计算(计算会触发shuffle),尽量减少shuffle

spark 和 hadoop区别

模块 spark hadoop 备注
作用 计算框架 计算+存储
方式 中间结果存放在内存,性能高 中间结果需要落地,保存到磁盘 Spark只有shuffle才会才会将中间数据存放磁盘中,spark代码优化的重点也是减少shuffle
容错 过弹性分布式数据集RDD来实现高效容错 mapreduce的容错只能重新计算
场景 数据量不是很大的情景 单次分析的数据量“很大”的情景 一般spark就行

组件

组件 说明
master 管理集群和节点,不参与计算
worker 计算节点,进程本身不参与计算,和master汇报
Driver 运行程序的main方法,创建spark context对象 一般是程序发起端
spark context 控制整个application的生命周期,包括dagsheduler和task scheduler等组件
client 用户提交程序的入口

Spark运行方式

模式 说明 备注
Local 运行在一台机器上,测试用
Standalone Spark自身的一个调度系统 用于跑测试用例
Yarn 采用Hadoop的资源调度器。 国内大量使用。
Mesos 国内很少使用。

Spark概念和一些注意点

注意点 说明
执行流程 1、任务提交和初始化:主要解析代码、申请资源
2、构建DAG(有向无环图):就是一种执行链
3、执行:
- 1、DAGScheduler:将 DAG 拆分为多个 Stage,按顺序提交 Stage 到 TaskScheduler
- 2、TaskScheduler:将每个 Stage 的 Task 分配给 Executor(优先将 Task 调度到数据所在的节点(如 HDFS 块位置))
- 3、Executor 执行 Task: Shuffle 阶段,Mapper Task 写中间数据到磁盘,Reducer Task 读取
- 4、结果返回
重点接口 1、4040: spark-shell任务端口
2、7077:内部通讯端口
3、8080: 查看任务执行情况端口
4、18080: 历史服务器
任务参数 1、executor-cores: 每个executor使用的内核数,默认为1,官方建议2-5个
2、num-executors:启动executors的数量,默认为2
3、executor-memory: executor内存大小,默认1G
4、driver-cores: driver使用内核数,默认为1
5、driver-memory: driver内存大小,默认512M
RDD 1、是executor的执行单元,包涵了一组不可变数据
2、 逻辑上是一个hdfs文件,在抽象上是一种元素集合,包含了数据
3、分为多个分区,每个分区分布在集群中的不同结点上,可以并行计算
4、数据默认存放在内存中,内存资源不足时,spark会自动将RDD数据写入磁盘
宽依赖/窄依赖 宽依赖:父子RDD之间是多对多(一对多/多对一)
窄依赖:父子RDD之间是一对一
避免数据倾斜 1、分出partitioner后,每个分区数据大小不均匀
2、选用合适的key,或者自己定义相关的partitioner,通过加盐或者哈希值来拆分这些key,从而将这些数据分散到不同的partition去执行
容错机制 1、RDD Lineage(血统)
- 重建数据:通过记录 RDD 的转换历史(如 map → filter),在节点故障时重新计算丢失的分区。
- 检查点(Checkpoint):将关键 RDD 持久化到可靠存储(如 HDFS),避免 Lineage 过长。
2、Task 重试
- 失败重试:默认重试 4 次(通过 spark.task.maxFailures 配置)
- 推测执行:对慢节点启动备份 Task(spark.speculation=true)

api:

接口 说明 是否触发 Shuffle
转义算子:将RDD转成新的RDD
单Value
map 建一类数据变更为宁外一类数据,每次处理一个数据
mapPartitions 每次处理一个分区数据 优先使用
mapPartitionsWithIndex 分区数据 → 处理后分区数据(带分区索引)
flatMap
glom 分区数据 → 数组(每个分区的元素合并为一个数组)
groupBy
filter
sample 数据 → 随机采样子集
distinct 数据 → 去重后的数据
coalesce 分区数 → 减少分区数(如 100 → 10) coalesce根据传入的参数来判断是否发生shuffle
repartition 分区数 → 调整分区数(可增可减),底层调用的就是coalesce方法:coalesce(numPartitions, shuffle = true) 一定会发生shuffle,增大rdd的partition数量使用repartition,减少partition数量时使用coalesce
sortBy 数据 → 全局有序数据
pipe 数据 → 通过外部命令处理后的数据
双Value 多RDD的集合操作转换算子
intersection 返回两个 RDD 中均存在的元素
union 合并两个 RDD 的所有元素
subtract 返回主 RDD 中存在但副 RDD 中不存在的元素
key-Value
partitionBy
reduceByKey 预聚合操作 触发shuffle:优先采用reduceByKey,先局部聚合,减少shuffle的次数
groupByKey 没有预聚合
aggregateByKey
foldByKey
combineByKey
sortByKey
mapValues
join
cogroup
执行算子:将RDD计算出结果
reduce / reduceByKey 聚合所有元素(需满足结合律)
collect 返回所有元素到 Driver 端
count 统计 RDD 元素总数
first 返回第一个元素
take 返回前 N 个元素
takeOrdered 返回排序后的前 N 个元素
aggregate 自定义聚合(初始值 + 两函数)
fold 类似 reduce,但支持初始值
countByKey 统计每个 Key 的出现次数
save(saveAsTextFile) 将数据保存到文件系统
foreach 对每个元素执行副作用操作
posted on 2025-02-18 15:49  学游者  阅读(18)  评论(0)    收藏  举报