大数据| 青训营笔记

84 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

Spark原理与实践

常见大数据处理链路

image.png

Spark生态/特点

统一引擎,支持多种分布式场景 多语言支持 可读写丰富数据源 丰富灵活的API/算子 支持K8S/YARN/Mesos资源调度

Spark 是一个用来实现快速而通用的集群计算的平台,官网上的解释是:Apache Spark™是用于大规模数据处理的统一分析引擎。 Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理等,对外提供了十分丰富的API接口, 除了提供基于 Python、 Java、 Scala 和 SQL 的简单易用的API 以及内建的丰富的程序库以外, Spark 还能和其他大数据工具密切配合使用。例如,Spark 可以运行在 Hadoop 集群上,访问包括 Cassandra 在内的任意 Hadoop 数据源。

RDD五要素

image.png

RDD依赖

描述父子RDD之间的依赖关系。 窄依赖:父RDD的每个partition至多对应有个子RDD分区。 宽依赖:父RDD的每个partition都可能对应多个子RDD分区。

根据调度算法对多个TaskSet进行调度,对于调度到的TaskSet,会将Task调度到相关Executor上面执行,Executor 提供。

内存管理

image.png 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。