过去,Apache Spark UI 在帮助用户调试应用程序方面发挥了重要作用。在最新的 Spark 1.4 版本中,我们很高兴地宣布数据可视化浪潮已经进入 Spark UI。此版本中新增的可视化功能包括三个主要组件:

  • Spark 事件的时间线视图
  • 执行 DAG
  • Spark Streaming 统计数据的可视化

这篇博文将是由两部分组成的系列文章中的第一篇。这篇文章将涵盖前两个组成部分,并将最后一个部分保存到下一周的后续文章中。

Spark 事件的时间线视图

自 Spark 的早期版本以来,Spark 事件一直是面向用户的 API 的一部分。在最新版本中,Spark UI 在时间线中显示这些事件,以便事件的相对顺序和交错一目了然。

时间线视图可在三个级别使用:跨所有作业、一项作业内和一个阶段内。在登录页面上,时间线显示应用程序中所有作业的所有 Spark 事件。考虑以下示例:

spark可视化界面 spark可视化工具_UI


这里的事件顺序相当简单。在所有executors注册后不久,应用程序并行运行 4 个作业,其中一个失败而其余的成功。然后,当所有作业完成且应用程序退出时,executors将随之删除。现在让我们点击其中一项工作。

spark可视化界面 spark可视化工具_HDFS_02


此作业对 3 个文件运行字数统计,并在最后合并结果。从时间线来看,很明显 3 个字数统计阶段并行运行,因为它们不相互依赖。但是,最后的合并确实取决于前 3 个阶段的结果,因此相应的阶段(最后的收集)直到所有前面的阶段都完成后才会开始。让我们进一步了解其中一个阶段。

spark可视化界面 spark可视化工具_spark_03


此阶段有 20 个分区(未显示所有分区),分布在 4 台机器上。每个条形代表阶段内的单个任务。从这个时间线视图中,我们可以收集到关于这个阶段的几个见解。首先,分区在机器上分布得相当好。其次,大部分任务执行时间包括原始计算,而不是网络或 I/O 开销,这并不奇怪,因为我们混洗的数据非常少。第三,如果我们为 executor 分配更多的内核,可以提高并行度;目前看来,每个 executor 一次最多只能执行两个任务。我想借此机会展示 Spark 中使用此时间线的另一个功能:动态分配。此功能允许 Spark 根据工作负载动态扩展执行程序的数量,以便更有效地共享集群资源。让我们通过时间线来看看它的实际效果。

spark可视化界面 spark可视化工具_HDFS_04


首先要注意的是,应用程序在工作过程中获取executors,而不是提前保留他们。然后,在第一个作业完成后不久,用于该作业的一组executors变为空闲并返回到集群。这允许在同一集群中运行的其他应用程序同时使用我们的资源,从而提高集群利用率。只有当一个新作业进来时,我们的 Spark 应用程序才会获取一组新的执行器来运行它。

在时间轴中查看 Spark 事件的能力对于识别应用程序中的瓶颈非常有用。调试应用程序的下一步是将特定任务或阶段映射到产生它的 Spark 操作。

执行 DAG

最新 Spark 版本的第二个可视化添加显示每个作业的执行 DAG。在 Spark 中,作业与以有向无环图 (DAG) 组织的一系列RDD依赖项相关联,如下所示:

spark可视化界面 spark可视化工具_spark_05


此作业执行简单的字数统计。首先,它执行textFile操作读取 HDFS 中的输入文件,然后执行flatMap操作将每一行拆分为单词,然后执行map操作以形成 (word, 1) 对,最后执行reduceByKey操作以求和每个行的计数单词。

可视化中的蓝色阴影框表示用户在其代码中调用的 Spark 操作。这些框中的点代表在相应操作中创建的 RDD。操作本身按它们运行的阶段分组。

可以从这个可视化中获得一些观察结果。首先,它揭示了未通过 shuffle 分隔的流水线操作的 Spark 优化。特别是,每个执行器从 HDFS 读取输入分区后,直接将后续的flatMap和map函数应用于同一任务中的分区,无需触发另一个阶段。

其次,其中一个 RDD 被缓存在第一阶段(由绿色突出显示)。由于封闭操作涉及从 HDFS 读取,因此缓存此 RDD 意味着此 RDD 上的未来计算可以至少从内存访问到源文件的一个子集而不是从 HDFS。

DAG 可视化的价值在复杂的工作中最为明显。例如,MLlib 中的交替最小二乘法 (ALS) 实现迭代计算两个因子矩阵的近似乘积。这涉及到一系列的map、join、groupByKey操作。

spark可视化界面 spark可视化工具_应用程序_06


值得注意的是,在 ALS 中,在正确位置缓存对性能至关重要,因为该算法在每次迭代中广泛重用先前计算的结果。通过 DAG 可视化,用户和开发人员现在可以一目了然地确定某些 RDD 是否正确缓存,如果没有,可以快速了解为什么实现缓慢。与时间线视图一样,DAG 可视化允许用户单击进入舞台并扩展舞台内的细节。下面描述了 ALS 中单个阶段的 DAG 可视化。

spark可视化界面 spark可视化工具_spark_07


在stage视图中,属于这个stage的所有RDD的详细信息都会自动展开。用户现在可以快速找到有关特定 RDD 的信息,而无需通过将鼠标悬停在作业页面上的各个点上来进行猜测和检查。最后,我想强调 DAG 可视化和 Spark SQL 之间的初步集成。由于 Spark SQL 用户对高级物理运算符比对低级 Spark 原语更熟悉,因此应该显示前者。结果类似于映射到底层执行 DAG 的 SQL 查询计划。

spark可视化界面 spark可视化工具_HDFS_08


版本:spark1.4