作者:王畅 整理编辑:Carol
Spark
Apache Spark被广泛认为是大数据行业的未来。自从Apache Spark进入大数据市场以来,它就获得了很多认可。如今,苹果,Facebook,Netflix和Uber等大多数尖端公司已经大规模部署了Spark。在Spark核心数据处理引擎之上,还有用于SQL,机器学习,图形计算和流处理的库,应用程序开发人员和数据科学家将Spark集成到其应用程序中,以**快速地大规模查询,分析和转换数据。**为了更好地了解Spark如何执行Spark / PySpark作业,这些用户界面集派上了用场。
在这篇文章中,我们将了解Spark如何通过使用Spark Web UI中的不同部分来执行此操作。
了解spark统一内存管理机制
作为一个 JVM 进程,executor 的内存(堆内内存)管理建立在 JVM 的内存管理之上,此外spark还引入了堆外内存(不在JVM中的内存),在spark中是指不属于executor的内存。
一、内存划分
Spark 1.6 之后引入的统一内存管理机制,与旧版的静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域:
execution内存可借用storage内存中未使用的部分,被借用的storage内存需要等到执行内存的释放方能归还。
storage部分可以借用execution内存,但是 execution 内存的空间被存储内存占用后,是可让对方将占用的部分转存到硬盘,然后“归还”借用的空间。
执行内存(Execution Memory)
主要用于存放Shuffle、Join、Sort、Aggregation等计算过程中的临时数据。
存储内存(Storage Memory)
主要用于spark中数据(RDD)的缓存(cache) 以及 广播数据(broadcast)。
用户内存(User Memory)
主要用于存储RDD 转换操作所需要的数据,例如RDD依赖等信息。
预留内存(Reserved Memory)
系统预留内存,会用来存储Spark内部对象。
二、内存大小分配
usableMemory = (excutorMemory-reservedMemory)
spark.memory.fraction
(Storage 和 Execution 共用内存占可用内存的比例,默认为0.6)
excutionMemory + storageMemory = usableMemory * spark.memory.fraction
spark.memory.storageFraction
(Storage内存占 Storage 和 Execution 共用内存比例,默认0.5)
storageMemory = usableMemory * spark.memory.fraction
* spark.memory.storageFraction
excutionMemory = usableMemory * spark.memory.fraction
*(1- spark.memory.storageFraction)
spark WebUI
应用在创建SparkContext的同时也就创建了web UI 来展示应用的各种信息。Web UI带有以下选项卡(由于它们是按需延迟创建的,因此可能无法一次显示所有选项卡。
一、作业 (job)
Completed Jobs
已完成Job的基本信息,如想查看某一个Job的详细情况,可点击对应Job进行查看。
Active Jobs
正在运行的Job的基本信息。
Event Timeline
在application应用运行期间,Job和Exector的增加和删除事件进行图形化的展现。这个就是用来表示调度job何时启动何时结束,以及Excutor何时加入何时移除。我们可以很方便看到哪些job已经运行完成,使用了多少Excutor,哪些正在运行。
(Job属性列表)
在Jobs页面点击进入某个Job之后即进入JobDetail页面,可以查看某一Job的详细信息。
( job页面信息展示)
Staus
展示Job的当前状态信息。
Active Stages
正在运行的stages信息,点击某个stage可进入查看具体的stage信息。
Pending Stages
排队的stages信息,根据解析的DAG图stage可并发提交运行,而有依赖的stage未运行完时则处于等待队列中。
Completed Stages
已经完成的stages信息。
Event Timeline
展示当前Job运行期间stage的提交与结束、Executor的加入与退出等事件信息。
DAG Visualization
当前Job所包含的所有stage信息(stage中包含的明细的tranformation操作),以及各stage间的DAG依赖图。DAG也是一种调度模型,在spark的作业调度中,有很多作业存在依赖关系,所以没有依赖关系的作业可以并行执行,有依赖的作业不能并行执行。
( job页面信息展示)
二、阶段 (stage)
JobDetail页面中的Stage属性列表:
2. 在Job Detail页点击进入某个stage后,可以查看某一stage的详细信息:
Input Size/Records(表中的Input)
输入的数据字节数大小/记录条数。
Shuffle Write(表中的Shuffle Write)
为下一个依赖的stage提供输入数据,shuffle过程中通过网络传输的数据字节数/记录条数。
DAG Visualization
当前stage中包含的详细的tranformation操作流程图。
Metrics
当前stage中所有task的一些指标(每一指标项鼠标移动上去后会有对应解释信息)统计信息。
Event Timeline
展示在每个Executor上各个task的各个阶段的时间统计信息,可以清楚地看到task任务时间是否有明显倾斜,以及倾斜的时间主要是属于哪个阶段,从而有针对性的进行优化。
Aggregated Metrics by Executor
将task运行的指标信息按excutor做聚合后的统计信息,并可查看某个excutor上任务运行的日志信息。
Tasks
当前stage中所有任务运行的明细信息,是与EventTimeline中的信息对应的文字展示(可以点击某个task查看具体的任务日志)。
(stageDetail信息展示图)
三、存储 (storage)
storage页面能看出application当前使用的缓存情况,可以看到有哪些RDD被缓存了,以及占用的内存资源。如果job在执行时持久化(persist)/缓存(cache)了一个RDD,那么RDD的信息可以在这个选项卡中查看。
点击某个RDD可查看该RDD缓存的详细信息即进入Storage Detail页面,包括缓存在哪个Executor中,使用的block情况,RDD上分区的信息以及存储RDD的主机的地址。
四、环境 (environment)
Environment选项卡提供有关Spark应用程序(或SparkContext)中使用的各种属性和环境变量的信息。用户可以通过这个选项卡得到非常有用的各种Spark属性信息,而不用去翻找属性配置文件。
(环境信息展示)
运行时信息:仅包含运行时属性,例如Java和Scala的版本。
Spark属性:列出应用程序属性,例如“spark.app.name”和“ spark.driver.memory”
Hadoop属性:显示相对于Hadoop和YARN的属性。注意:“spark.hadoop ”之类的属性未在此部分中显示,而是在“spark属性”中显示。
系统属性显:示有关JVM的更多详细信息。
类路径条目:列出从不同来源加载的类,这对于解决类冲突非常有用。
五、执行器 (executors)
Executors选项卡提供了关于内存、CPU核和其他被Executors使用的资源的信息。这些信息在Executor级别和汇总级别都可以获取到。一方面通过它可以看出来每个excutor是否发生了数据倾斜,另一方面可以具体分析目前的应用是否产生了大量的shuffle,是否可以通过数据的本地性或者减小数据的传输来减少shuffle的数据量。
Summary
该application运行过程中使用Executor的统计信息。
Executors
每个Excutor的详细信息(包含driver),可以点击查看某个Executor中任务运行的详细日志。
堆外内存未开启:默认情况下不开启
StorageMemory = (excutorMemory-ReservedMemory) * spark.memory.fraction
堆外内存开启时:spark.memory.offHeap.enabled = true
StorageMemory = (excutorMemory-ReservedMemory) * spark.memory.fraction
+ spark.memory.offHeap.size
注意:
1. Spark的 Executor 端通过 Runtime.getRuntime.maxMemory 拿到的内存其实没
这么大,例如 excutorMemory = 18G ,实际 systemMemory=17179869184 字节。
2. Spark UI 是通过除于1000 的三次方将字节转换成GB,而不是 1024 的三次方。
(executors 信息展示图)
参考文献
1.https://www.iteblog.com/archives/2342.html
2 https://www.pianshen.com/article/7410736178/
3《Spark GraphX实战》
下方扫码推荐进一步阅读:
技术27期:Spark任务调度机制及源码分析