在过去,Spark UI一直是用户应用程序调试的帮手。而在最新版本的Spark 1.4中,咱们很高兴地宣布,一个新的因素被注入到Spark UI——数据可视化。在此版本中,可视化带来的提高主要包括三个部分:算法
Spark events时间轴视图缓存
Execution DAG网络
Spark Streaming统计数字可视化函数
咱们会经过一个系列的两篇博文来介绍上述特性,本次则主要分享前两个部分——Spark events时间轴视图和Execution DAG。Spark Streaming统计数字可视化将在下一篇博文中解释。性能
Spark events时间轴视图 优化
从Spark 初期版本至今,Spark events一直是面向用户API的一部分。在最新的1.4版本,Spark UI将会把这些events在一个时间轴中显示,让用户能够一眼区别相对和交叉顺序。.net
时间轴视图能够覆盖3个等级:全部Job,指定的某个Job,以及指定的某个stage。在下图中,时间轴显示了横跨一个应用程序全部做业中的Spark events。调试
这里的events顺序相对简单,在全部 executors 注册后,在应用程序并行运行的4个job中,有一个失败,其他成功。当全部工做完成,并在应用程序退出后,executors一样被移除。下面不妨点击关注其中的一个job:orm
该job在3个文件中作word count,最后join并输出结果。从时间轴上看,很明显, 3个 word count stages 并行运行,由于它们不互相依赖。同时,最后一个阶段须要依赖前3个文件word count的结果,因此相应阶段一直等到全部先行阶段完成后才开始。下面着眼单个stage:图片
这个stage被切分为20个partitions,分别在4台主机上完成(图片并无彻底显示)。每段表明了这个阶段的一个单一任务。从这个时间轴来看,咱们能够获得这个stage上的几点信息。
首先,partitions在机器中的分布状态比较乐观。其次,大部分的任务执行时间分配在原始的计算上,而不是网络或I/ O开销。这并不奇怪,由于传输的数据不多。最后,咱们能够经过给executors分配更多的核心来提高并行度;从目前来看,每一个executors能够 同时执行不超过两个任务。
借此机会展现一下Spark经过该时间轴得到的另外一个特性——动态分配。该特性容许Spark基于工做负载来动态地衡量executors 的数量,从而让集群资源更有效地共享。不妨看向下张图表:
首先要注意的是,这个应用程序是在工做的过程当中得到executors ,而不是预先分配好。在第一个job结束后,用于该job的executors将闲置并返回到集群。所以在这个期间,同集群中运行的其余应用程序能够得到 这些资源,从而增长集群资源利用率。只有当一个新的job执行时,Spark应用程序才会获取一组新的executors 来运行它。
在一个时间轴中查看Spark events的能力有助于肯定应用程序瓶颈,从而在调试过程当中进行更有针对性的优化。
Execution DAG
在新版本的Spark中,第二个可视化聚焦DAG执行的每一个做业。在Spark中,job与被组织在DAG中的一组RDD依赖性密切相关,相似下图:
这个job执行一个简单的word cout。首先,它执行一个textFile从HDFS中读取输入文件,而后进行一个flatMap操做把每一行分割成word,接下来进行一个map操 做,以造成form(word,1)对,最后进行一个reduceByKey操做总结每一个word的数值。
可视化的蓝色阴影框对应到Spark操做,即用户调用的代码。每一个框中的点表明对应操做下建立的RDDs。操做自己由每一个流入的stages划分。
经过可视化咱们能够发现不少有价值的地方。首先,根据显示咱们能够看出Spark对流水线操做的优化——它们不会被分割。尤为是,从HDF S读取输入分区后,每一个executor随后即对相同任务上的partion作flatMap和map,从而避免与下一个stage产生关联。
其次,RDDs在第一个stage中会进行缓存(用绿色突出表示),从而避免对HDFS(磁盘)相关读取工做。在这里,经过缓存和最小化文件读取能够得到更高的性能。
DAG可视化的价值在复杂jobs中体现的尤其明显。好比下图中的ALS计算,它会涉及到大量的map、join、groupByKey操做。
值得注意的是,在ALS中,缓存准确性将对性能产生的影响很是大,由于该算法在每次迭代中会重度使用以前步骤产生的结果。现在经过DAG可视化,用户和开发人员能够一目了然地查明RDDS是否被恰当地缓存,若是没有,能够快速理理解实现缓慢的缘由。
与时间轴视图同样,DAG可视化容许用户点击进入一个stage进行更详细地观察。下图描述了ALS中一个独立的stage。
在stage视图中,属于这个数据分析stage的全部RDDS细节被自动展开。当前,用户能够快速地找到具体的RDDS信息,而没必要job页面经过悬停各个点来猜想和检查。
最后,在这里突出一下DAG可视化和 SparkSQL之间的一个初步的集成。对比更接近物理实体层面的Spark操做,Spark SQL用户显然更熟悉一些高级操做,所以一些高级操做更须要被可视化。其结果相似将一个SQL查询计划映射到底层执行的DAG。
与SparkStreaming的整合在Spark 1.4版本中一样有所实现。
在不久的未来,Spark UI能够更理解一些更高级别的函数库语义,以提供更多相关细节。 同时,Spark SQL将与Spark Streaming同样得到相似的标签。而在Spark Core中,当用户查看RDD时,相似partitions数量、调用点、缓存率都将会被可视化。