这是我参与「第四届青训营 」笔记创作活动的第七天,今日学习了《Spark的原理及实践》,在刚开始的预习资料中,了解了Spark的一些基础知识,在课堂上,又对SparkCore,SparkSQL,进行了原理解析,用两个例子讲解了目前业界的挑战与实践,结合资料以及课堂,对一部分做了一些简记,如下:
Spark
Apache SparkTM是一个多语言引擎,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。
1.Spark 特点:
- 统一引擎,支持多种分布式场景
- 多语言支持:SQL,Python,R,java/Scala
- 可读写丰富数据源:
- 内置 DataSource :Text,Parquet/ORC,JSON/CSV,JDBC
- 自定义DataSource:实现 DataSource V1/V2 API,HBASE/Mongo/ElasticSearch/...,A community index of third-party packages for Apache Spark
- 丰富灵活的API/算子
- 支持K8S/YARN/Mesos 资源调度 Spark 运行架构 & 部署方式
2.Spark运行架构和工作原理:
-
Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过驱动程序(Driver Program)中的SparkContext对象进行协调,SparkContext对象能够与多种集群资源管理器(Cluster Manager)通信,一旦与集群资源管理器连接,Spark会为该应用在各个集群节点上申请执行器(Executor),用于执行计算任务和存储数据。Spark将应用程序代码发送给所申请到的执行器,SparkContext对象将分割出的任务(Task)发送给各个执行器去运行。
-
需要注意的是
- 每个Spark application都有其对应的多个executor进程。Executor进程在整个应用程序生命周期内,都保持运行状态,并以多线程方式执行任务。这样做的好处是,Executor进程可以隔离每个Spark应用。从调度角度来看,每个driver可以独立调度本应用程序的内部任务。从executor角度来看,不同Spark应用对应的任务将会在不同的JVM中运行。然而这样的架构也有缺点,多个Spark应用程序之间无法共享数据,除非把数据写到外部存储结构中。
- Spark对底层的集群管理器一无所知,只要Spark能够申请到executor进程,能与之通信即可。这种实现方式可以使Spark比较容易的在多种集群管理器上运行,例如Mesos、Yarn、Kubernetes。
- Driver Program在整个生命周期内必须监听并接受其对应的各个executor的连接请求,因此driver program必须能够被所有worker节点访问到。
- 因为集群上的任务是由driver来调度的,driver应该和worker节点距离近一些,最好在同一个本地局域网中,如果需要远程对集群发起请求,最好还是在driver节点上启动RPC服务响应这些远程请求,同时把driver本身放在离集群Worker节点比较近的机器上。
3.Spark 内存管理
-
Spark 作为一个基于内存的分布式计算引擎,Spark采用统一内存管理机制。重点在于动态占用机制。
- 设定基本的存储内存(Storage)和执行内存(Execution)区域,该设定确定了双方各自拥有的空间的范围,UnifiedMemoryManager统一管理Storage/Execution内存
- 双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间
- 当Storage空闲,Execution可以借用Storage的内存使用,可以减少spill等操作, Execution内存不能被Storage驱逐。Execution内存的空间被Storage内存占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
- 当Execution空闲,Storage可以借用Execution内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
-
user memory存储用户自定义的数据结构或者spark内部元数据
-
Reserverd memory:预留内存,防止OOM,
-
堆内(On-Heap)内存/堆外(Off-Heap)内存:Executor 内运行的并发任务共享 JVM 堆内内存。为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,Spark 可以直接操作系统堆外内存,存储经过序列化的二进制数据。减少不必要的内存开销,以及频繁的 GC 扫描和回收,提升了处理性能。
4.业界挑战与实践
- Shuffle 稳定性问题以及解决方案
- SQL 执行性能问题以及解决方向