且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何用 Uber JVM Profiler 等可视化工具监控 Spark 应用程序?

更新时间:2022-05-27 23:57:25

  关键要点

  持续可靠地运行 Spark 应用程序是一项具有挑战性的任务,而且需要一个良好的性能监控系统。

  - 在设计性能监控系统时有三个目标——收集服务器和应用程序指标、在时序数据库中存储指标,并提供用于数据可视化的仪表盘。

  Uber JVM Profiler 被用于监控 Spark 应用程序,用到的其他技术还有 InfluxDB(用于存储时序数据)和 Grafana(数据可视化工具)。性能监控系统可帮助 DevOps 团队有效地监控系统,用以满足应用程序的合规性和 SLA。

  很多行业都在使用 Apache Spark 构建大数据处理应用程序。Spark 为此类应用程序提供了隐式数据并行性和容错性。这类应用程序可以是基于流式处理、批处理、SQL 数据集处理或机器学习。Spark 通过快速的内存数据处理引擎在集群中运行这些应用程序,并在数据管道中转换和处理大量数据。持续可靠地运行这些应用程序是一项具有挑战性的任务,需要一个良好的性能监控系统。随着 Spark 被各行各业广泛采用,性能监控、度量分析和调优 Spark 应用程序的问题越来越受到关注。Uber 最近开源了他们的 JVM Profiler。在本文中,我们将讨论如何扩展 Uber JVM Profiler,并将其与 InfluxDB 和 Grafana 一起用于监控和报告 Spark 应用程序的性能指标。

  Spark 应用程序性能监控系统

  要最大限度地利用可用资源并尽早发现可能存在的问题,需要一个性能监测系统。监控系统需要为运行中的系统提供综合性的状态报告,并在组件发生故障时发送警报。当我们需要在 Spark 集群中运行大规模分布式系统以及 Hadoop 生态系统的不同组件时,对细粒度性能监视系统的需求就变得不可或缺。Spark 应用程序在共享资源上执行数据的分布式处理,这使得 DevOps 团队的教程工作变得非常复杂。DevOps 团队必须有效地管理可用资源,并密切监控古玩系统的不同组件,以避免出现宕机。性能监控系统提供的完整堆栈可见性有助于 DevOps 团队了解系统行为,并对生产问题做出快速反应。这确保了 Spark 应用程序的可靠性、可伸缩性和性能。

  针对这种复杂系统的理想性能监控系统必须具备以下特性:

  监控系统应提供有关集群内每个组件的细粒度可见性。我们应该能够获得有关 CPU、内存、存储、本地文件和 HDFS 的磁盘 I/O、堆栈跟踪等详细指标。这些指标有助于快速诊断发生故障的实例。监控系统应该为在 Spark 上运行的应用程序提供代码级别度量(例如执行时间、方法的参数等)。这将有助于识别运行较慢的方法、磁盘热点等。监控系统应存储每一秒的指标,并允许我们通过浏览不同时间段的数据来分析指标。我们应该能够对这些数据进行二级和二级解剖。我们应该能够控制数据保留期,并在需要时轻松访问和分析过去的数据。这有助于分析当前趋势并预测未来趋势。监控系统应该要提供有效的方法,用于从连续收集的大量指标中提取有意义信息。包括使用 SQL 或 API 查询数据、过滤数据、聚合值和应用自定义分析。这有助于轻松转换和更快地分析数据。监控系统应该能够方便地访问从度量数据分析中推导出的信息,可以使用不同的形式(如图表等)在仪表盘中显示数据,可以基于主机、时间或作业对数据进行分类,用户应该能够进一步深入分析不同的数据点,能够为用户定义的阈值配置警报和通知。这有助于 DevOps 团队和组织的其他利益相关者在必要时快速获得所需的信息。

  在本文中,我们将使用开源工具和技术开发一个性能监控系统。Spark 应用程序性能监控系统的设计有三个目标:

  收集系统(驱动程序和执行程序)和应用程序代码的性能指标;将这些指标存储在持久存储中以进行时序分析(批量和实时);以图表的形式生成度量指标报告。

  Apache Spark 为指标提供了一个 web-ui 和 REST API。Spark 还提供各种接收器,包括控制台、JMX、Servlet、Graphite 等。还有一些其他可用的开源性能监控工具,如 dr-elephant、sparklint、prometheus 等。这些工具提供的指标主要是服务器级别的指标,其中有一些也提供应用程序的信息。

  Uber JVM Profiler 同时收集服务器级别和应用程序的度量指标。它可以从驱动程序、执行程序或任已 JVM 中收集所有指标(cpu、内存、缓冲池等)。它可以在不修改现有代码的情况下对其进行增强,因此可以收集有关方法、参数和执行时间的指标。为了存储用于时序分析的度量指标,我们将使用 InfluxDB,它是一个功能强大的时序数据库。我们将扩展 Uber JVM Profiler,并为 InfluxDB 添加一个新的 Reporter,这样就可以通过 HTTP API 保存度量数据。在图形化的仪表盘方面,我们将使用 Grafana,它将从 InfluxDB 查询指标数据。

  以下是用于 Spark 应用性能监控系统的工具和技术的详细信息。

  Uber JVM Profiler

  Uber JVM Profiler 是一个分布式的分析器,它从集群的不同节点收集性能指标和资源利用率指标。它作为 Java 代理与应用程序一起运行,并收集不同的度量指标。它将这些指标发布给指定的 Reporter,以进行进一步的分析和报告。Uber JVM Profiler 是为分析 Spark 应用程序而开发的,但它也可以用于分析任何基于 JVM 的应用程序。Uber JVM Profiler 有三个主要组件:

  Profiler:Uber JVM Profiler 内置了以下的 Profiler:

  CpuAndMemory Profiler——收集缓冲池(直接和映射)、垃圾回收(计数和时间)、堆内存(已提交和已使用)、非堆内存(已提交和已使用)、CPU(加载和时间)、内存池详细信息(EdenSpace、SurvivorSpace、TenuredGen、CodeCache、CompressedClassSpace、Metaspace)、vmHWM 和 vmRSS 指标。IO Profiler——收集 CPU 统计信息(idle、nice、system、user、iowait)和磁盘 IO 的读 / 写字节。Stacktrace Profiler——收集线程名称、线程状态和堆栈跟踪指标。ProcessInfo Profiler——收集代理版本、JVM 类路径、JVM 输入参数和 xmxBytes 指标。MethodDuration Profiler——收集方法执行时间的指标,其中包括类名、方法名和进程名。MethodArgument Profiler——收集方法参数的指标,其中包括类名、方法名和进程名。