这是我参与「第四届青训营 」笔记创作活动的的第5天
Spark原理与实践
常见大数据处理链路
Spark生态/特点
统一引擎,支持多种分布式场景 多语言支持 可读写丰富数据源 丰富灵活的API/算子 支持K8S/YARN/Mesos资源调度
Spark 是一个用来实现快速而通用的集群计算的平台,官网上的解释是:Apache Spark™是用于大规模数据处理的统一分析引擎。 Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理等,对外提供了十分丰富的API接口, 除了提供基于 Python、 Java、 Scala 和 SQL 的简单易用的API 以及内建的丰富的程序库以外, Spark 还能和其他大数据工具密切配合使用。例如,Spark 可以运行在 Hadoop 集群上,访问包括 Cassandra 在内的任意 Hadoop 数据源。
RDD五要素
RDD依赖
描述父子RDD之间的依赖关系。 窄依赖:父RDD的每个partition至多对应有个子RDD分区。 宽依赖:父RDD的每个partition都可能对应多个子RDD分区。
根据调度算法对多个TaskSet进行调度,对于调度到的TaskSet,会将Task调度到相关Executor上面执行,Executor 提供。
内存管理
UnifiedMemoryManager统一管理多个并发Task的内存分配
每个Task获取的内存区间为1/(2*N)~1/N
每个MapTask生成一个Shuffle数据文件和一个index文件
shuffle write的文件被NodeManager中的Shuffle Service托管,供后续ReduceTask进行shuffle fetch,如果Executor空闲,DRA可以进行回收。
AQE
作业运行过程中,根据前面运行完的Stage的MapStatus中实际的partition大小信息,可以将多个相邻的较小的partition进行动态合并,由一个Task读取进行处理 AQE运行过程中动态获取准确Join的leftChild/rightChild的实际大小,将SMJ转换为BHJ AQE根据MapStatus信息自动检测是否有倾斜,将大的partition拆分成多个Task进行Join
Runtime Filter
Runtime Filter减少了大表的扫描,shuffle的数据量以及参加Join的数据量,所以对整个集群IO/网络/CPU有比较大的节省。
Shuffle稳定性问题
大规模作业下,开源ESS的实现机制容易带来大量随机读导致的磁盘IOPS瓶颈、Fetch请求积压等问题,进而导致运算过程中经常会出现Stage重算甚至作业失败,进而引起资源使用的恶性循环,严重影响SLA。