zoukankan      html  css  js  c++  java
  • [离线计算Spark|Hive] 大数据应用性能指标采集工具改造落地

    背景

    主要介绍针对平台的spark应用程序,在不修改用户程序的情况下 如何采集其资源和性能指标为后续分析使用,如性能优化,资源使用计价等.

    分析挑战

    在应用程序级别关联大量进程的指标

    在分布式环境中,多个 Spark 应用程序运行在同一台服务器上,每个 Spark 应用程序都有大量的进程(例如数千个执行程序)在许多服务器上运行.

    79xF9U.png

    1. 需要一个解决方案,该解决方案可以为每个进程收集指标,并将它们关联到每个应用程序的流程中

    2. 我们不知道这些流程何时启动以及需要多长时间。为了能够在这种环境中收集指标,分析器需要随每个进程自动启动。

    使指标收集对任意用户代码无干扰

    为了跟上数据基础设施的不断增长,我们需要能够随时测量任何应用程序,而无需更改代码。

    例如,如果我们在 Hadoop 分布式文件系统 (HDFS) NameNode 上遇到高延迟,我们希望检查从每个 Spark 应用程序观察到的延迟,以确保这些问题没有被复制。由于 NameNode 客户端代码嵌入在我们的 Spark 库中,因此修改其源代码以添加此特定指标很麻烦。

    JVM Profiler 引入

    主要受 https://github.com/etsy/statsd-jvm-profiler 启发构建了更多功能的分析器

    JVM Profiler 由三个关键功能组成,可以更轻松地收集性能和资源使用指标,然后将这些指标(例如 Apache Kafka)提供给其他系统进行进一步分析:

    • java agent: 通过将 Java agent 合并到我们的分析器中,用户可以以分布式方式收集 JVM 进程的各种指标(例如 CPU/内存使用情况)和堆栈跟踪

    • 高级分析功能:JVM Profiler 允许我们跟踪用户代码中的任意 Java 方法和参数,而无需进行任何实际代码更改。此功能可用于跟踪 Spark 应用程序的 HDFS NameNode RPC 调用延迟并识别慢速方法调用。它还可以跟踪每个 Spark 应用程序读取或写入的 HDFS 文件路径,以识别热文件以进行进一步优化。

    • 数据分析报告:在 Uber,我们使用分析器向 Kafka topic和 Apache Hive 表报告指标,使数据分析更快更容易。

    JVM Profiler 使用场景

    • 大小合适的 executor:使用 JVM Profiler 的内存指标来跟踪每个 executor 的实际内存使用情况,以便我们可以为 Spark“executor-memory”参数设置正确的值。

    • 监控 HDFS NameNode RPC 延迟:我们分析Spark 应用程序中org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB类上的方法,并识别 NameNode 调用的长时间延迟

    • 监控驱动程序丢弃事件: 分析像org.apache.spark.scheduler.LiveListenerBus.onDropEvent这样的方法来跟踪 Spark 驱动程序事件队列变得太长并丢弃事件的情况。

    • 跟踪数据:在org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getBlockLocations和org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock方法上分析文件路径参数,以跟踪 Spark 读取和写入的文件应用

    实现细节及可扩展性

    为了使实现尽可能无缝,JVM Profiler 具有非常简单且可扩展的设计。人们可以轻松添加额外的分析器实现来收集更多指标,还可以部署自己的自定义报告器,将指标发送到不同的系统进行数据分析。

    7CPM4I.png

    一旦进程启动,JVM Profiler 代码就会通过Java agent 参数加载到 Java 进程中。它由三个主要部分组成:

    • Class File Transformer:在进程内检测 Java 方法字节码以分析任意用户代码并将指标保存在内部指标缓冲区中。

    • Metric Profilers

      • CPU/Memory Profiler:通过JMX收集 CPU/内存使用指标并将其发送给报告者。
      • Method Duration Profiler:从指标缓冲区读取方法持续时间(延迟)指标并发送给报告者。
      • Method Argument Profiler: 从指标缓冲区读取方法参数值并将其发送给报告者。
    • Reporters

      • Console Reporter: 在控制台输出中写入指标
      • Kafka Reporter :将指标发送到 Kafka topic中

    如何自定义reporter发送指标

    用户可以实现自己的报告器并使用 -javaagent 选项指定它:

    -javaagent:jvm-profiler-0.0.5.jar= reporter=com.uber.profiling.reporters.CustomReporter
    

    JVM Profiler 在Uber数据基础设施集成

    7Vbz36.png

    基础设施集成实现:

    • 集群范围的数据分析:指标首先发送到 Kafka 并摄取到 HDFS,然后用户使用 Hive/Presto/Spark 进行查询。
    • 实时 Spark 应用程序调试:使用 Flink 实时聚合单个应用程序的数据并写入MySQL 数据库,然后用户可以通过基于 Web 的界面查看指标。

    如何落地的

    扩展设计

    7ZVAaR.png

    整体流程:

    • spark应用在启动的时候指定jvm-profiler jar, 运行时收集内存,cpu,gc.io等指标,定制实现的profile

    • 使用自定的reproter,主要将指标通过http 发送到接收服务

    • 接收服务负责将数据写入kafka

    • kafka经flink 消费清洗分别写入influxdb以及hive中,用于后续展示和分析

    • hive 一样执行时,指定相关参数

    • 通过解析/.staging/下job.xml 获取queryId 及sql相关信息

    • 后续流程一样

    部署

    spark: 上传jvm-profiler jar 包到 hdfs上,提交任务时参数指定
    hive: 部署jar到 hiveserver2 节点对应libs下面

    总结

    本文主要介绍了下Uber的开源项目jvm-profiler的产生背景,设计原理以及架构, 后面也设计了一套落地方案,用于采集spark、hive任务的资源消耗相关指标,可用于后续分析以及资源调优.

    参考

    https://eng.uber.com/jvm-profiler/

    https://github.com/uber-common/jvm-profiler

    本文作者: chaplinthink, 关注领域:大数据、基础架构、系统设计, 一个热爱学习、分享的大数据工程师
  • 相关阅读:
    完美的隐藏软键盘方法
    Android开发——构建自定义组件
    android 中 系统日期时间的获取
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
    总结:调用startActivityForResult,onActivityResult无响应的问题
    Android 頁面中有 EditText ,進入時取消自動彈出鍵盤
    Android中 Bitmap和Drawable相互转换的方法
    ImageView的属性android:scaleType
    动态添加组件(XML)
    Openfire3.8.2在eclipse中Debug方式启动最简单的方式
  • 原文地址:https://www.cnblogs.com/bigdata1024/p/15786588.html
Copyright © 2011-2022 走看看