归纳苹果,Facebook大规模部署的Spark-用户界面详细执行操作。

本文深入探讨Apache Spark的Web UI,展示了如何通过它来理解Spark作业的执行过程。Spark的统一内存管理机制使得存储和执行内存共享,Web UI提供了作业、阶段、存储和执行器的详细信息,帮助优化大数据应用的性能。
摘要由CSDN通过智能技术生成

作者:王畅 整理编辑: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任务调度机制及源码分析

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值