图的最大价值是它会推动我们去注意到那些我们从未预料到的东西。
– John Tukey
Spark 1.4中对Spark UI进行改进,更加突出可视化的效果。我们来看一下他的主要的改动,主要包含三个方面:
- Spark事件的时间线视图
- 执行的DAG图
- Spark Streaming 的可视化统计数据
这一篇主要会将前面的2块,最后的一块请见下一篇
Spark事件的时间线视图
从早前的版本开始Spark events就已经是Spark API的一部分了。在最新的版本里面,Spark UI会在时间线上显示这些events,让events的相对的顺序和交织能够一目了然。
时间线视图在三个层次上有效:所有的job,单个job以及单个stage
在默认展示页上,时间线显示一个应用中包含所有作业的Spark events。见下图
events的顺序在这里是非常简单的。在所有的executors都注册上来以后,应用并行运行了4个job,其中一个失败了其他的都成功了。然后,当所有的job都完成以后,应用退出了。executors也都被移除了。让我们点击其中一个job
此作业运行word count统计3个文件,并在最后join结果。从时间轴看,很显然,3个word count并行运行,因为它们不依赖于对方。然而,最后的join依赖于3个stage的结果,并因此需要等待3个stage结束才能开始。让我们进一步看看里面的一个阶段。
这个stage有20个partition(不是全部显示)传播横跨4台机器。每个条代表stage的单个任务。从这个时间视图,我们可以得到有关这个stage的几点启示。首先,整个机器的partition分布相当不错。其次,大多数的task执行时间是大于网络或I / O的开销,因为我们shuffle的数据非常少。第三,我们可以通过分配给executor更多的core来提高并行的程度;目前看来,每个执行器可同时执行不超过两个任务。
我想借此机会展示在Spark中使用时间视图的另一个特点:动态分配。该特征允许Spark基于负载动态的缩放executor的数量,这样集群资源得到更有效的共享。让我们来看看时间视图上的表现。
首先要注意的是,应用在job过程中获得executors,而不是提前保留它们。然后,在第一个job结束后不久,用于该作业的executors变为空闲并返回到集群中去。这就允许同一集群中运行的其他应用在其间来使用他们,从而增加群集利用率。只有当一个新的job进来的时候,我们的Spark应用程序才需要全新的一组executors来运行它。
能够通过时间线视图来查看Spark events对确定应用程序中的瓶颈非常有用。接着下一步就能够把一个特定的task或者stage映射到Spark操作上去,找到原因。
执行的DAG图
第二个增加到Spark中的可视化是每一个job的执行的DAG。在Spark中,job与一个组织在有向无环图(DAG)中的RDD的链关联在一起, 看起来像下面这样:
这是一个简单的word count job。首先,它执行了一个textFile的操作来读取在HDFS上的输入文件,然后flatMap操作会split每一行成为独立的单词,然后把他们映射成(word,1)这样的pair,最后使用reduceByKey操作来对word的数量求和。
蓝色框指的是用户在他/她的代码调用Spark操作。在这些框里的点代表对应操作下创建的RDDs。该操作本身是由它们所在的stage来划分的。
从这个可视化中我们能有所发现。首先,它的Spark的流水线优化并不是由shuffle阶段来分割的。尤其是,从HDFS读取输入partition后,每个执行程序直接在task中执行flatMap和map,避免了与其他的stage产生影响。
其次,RDDs其中之一被缓存在第一个stage(绿色高亮)。由于操作包括了从HDFS读,缓存了这个RDD意味着将来在此RDD关联计算的时候可以从存储器而不是从HDFS来快速的访问这部分原始文件的子集。
DAG可视化的复杂的job上会有最明显的价值。举个例子,在MLlib的交替最小二乘(ALS)执行计算两个因子矩阵迭代的近似结果。这涉及到一系列的map,join,groupByKey等操作。
值得注意的是,在ALS ,在正确的地方缓存对于性能来说至关重要,因为该算法重用在每个迭代中前一次计算的结果。随着DAG可视化,用户和开发人员现在可以一眼找出RDDs是否正确缓存,如果没有,也很快明白为什么一个实现的速度很缓慢。
和时间线视图一样,DAG允许用户点击进入一个stage并展开其内部的详细信息。见下图。
在stage视图,所有属于此阶段的RDDs的细节会自动展开。现在用户可以快速找到具体的RDDs信息而不必用鼠标在上面悬停来获取信息寻找要的点。
最后,我想强调一下DAG可视化和 SparkSQL之间的一个初步的集成。对比更接近物理实体层面的Spark操作,Spark SQL用户显然更熟悉一些高级操作,因此一些高级操作更需要被可视化。其结果类似将一个SQL查询计划映射到底层执行的DAG。
Spark Streaming的可视化部分也在1.4中集成了,不过会在另一个独立的介绍中放出。
在不久的将来,Spark UI会理解更高级别的库的语义,从而提供更多相关的细节。Spark SQL将会有自己独立的标签。而Spark core,当你鼠标悬停在RDD上的时候一些额外的信息类似partition的数量,调用点,缓存百分比都会在DAG上展示。