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 | 对每个元素执行副作用操作 | 是 |
浙公网安备 33010602011771号