Spark

主流框架比较
| 功能指标 | Storm | Spark | Flink |
|---|---|---|---|
| 处理模式 | native | micro-batching | native |
| 消息保障 | 至少一次 | 有且一次 | 有且一次 |
| 实时性 | 低延迟,亚秒级 | 高延迟,秒级 | 低延迟,亚秒级 |
| 吞吐量 | 低 | 高 | 高 |
| 流量控制 | 不支持 | 支持 | 支持 |
| 容错方式 | record ack | rdd based check point | check point |
主要原理
-
Apache Storm
- 在Storm中,需要一个实时的计算结构,称为拓扑。
- 拓扑结构提交给集群。
- 主节点给工作节点分配代码,工作节点负责执行代码。
- 拓扑结构包含spout和bolt:
- spout发送tuple元组形式的数据流。
- bolt负责转换数据流。
-
Apache Spark
- Spark Stream,核心Spark API的扩展,按时间间隔对数据流进行分段切分。
- Spark针对连续数据流的抽象称为DStream,是小批量处理的RDD。
- RDD是弹性分布式数据集,可用通过任意函数和窗口计算进行转换,实现并行操作。
-
Apach Flink
- 针对流数据+批处理的计算框架。
- 批数据看作流数据的特例,延迟性较低,能够保证消息传输不丢失不重复。
Spark调度流程
- SparkContext通过RDD对象构建DAG图。
- DAGScheduler把DAG划分stage,stage以taskset为单位提交给TaskScheduler。
- TaskScheduler把task发给集群中的Worker的Executor。
- 哪个task先完成就用哪个task的结果。
- TaskScheduler都会向DAGScheduler汇报状态,stage运行失败TaskScheduler可能会通知DAGScheduler重新提交数据。
- Work接收到的是task,执行task的是进程中的线程,多个线程处理多个数据分片,执行task,读取或存储数据。
如何划分stage
- 从当前job的最后一个算子往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入到该stage中。
- 宽依赖:1个父RDD分区对应1个子RDD分区。
- 窄依赖:1个父RDD分区对应N个子RDD分区。
Spark算子
- 转换算子(延迟执行)
- map
- flatMap
- ReduceByKey
- 行动算子(触发执行)
- count:返回数据集中的元素数。
- take(n):返回数据集前n个元素的集合。
- collect:将计算结果回收到Driver端。
- 控制算子
- cache:将RDD的数据持久化到内存中。
- persist:指定持久化的级别。
- checkpont:持久化RDD到磁盘,切断RDD之间的依赖关系。
数据倾斜
- 后果
- 分布式程序运行的速度由最慢的task决定。
- 过多的数据在同一个task中执行,撑爆executor,造成OOM。
- 原因
- 数据问题
- key本身分布不均匀
- key的设置不合理
- 使用问题
- shuffle时的并发度不够
- 计算方式有误
- 数据问题
- 解决方法
- 数据问题
- 过滤空值或无效数据
- 异常数据过滤出来单独处理,最后与正常数据的处理结果union
- key添加随机值,操作后去掉随机值
- spark使用不当
- 提高shuffle并行度
- map join代替reduce join避免shuffle
- 数据问题
你知道的越多,你不知道的越多。

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。
浙公网安备 33010602011771号