【问题标题】:Java heap utilization in spark jobSpark 作业中的 Java 堆利用率
【发布时间】:2016-09-14 13:25:44
【问题描述】:
我正在通过 Java 运行 Spark Streaming 作业。我在 AWS 上有一个带有 cloudera 分布的 4 节点集群,其中 3 个是计算节点。当我的作业运行时,我需要记录集群的每个执行程序/节点上使用了多少 Java 堆。我正在使用 getRunTime() 方法,但我得到了一个我认为来自驱动程序执行的值。
有没有一种方法可以用来捕获单个堆的利用率?
【问题讨论】:
标签:
java
apache-spark
bigdata
【解决方案1】:
Spark 通过Sinks 公开此类指标。其中一个是 JMX 计数器,但您可以选择其他格式(CSV、Console、Graphite、Ganglia、Slf4j)。这需要您在工作节点上添加一个metrics.properties 文件。以下是 JMX 计数器的示例:
*.sink.jmx.class=org.apache.spark.metrics.sink.JmxSink
master.source.jvm.class=org.apache.spark.metrics.source.JvmSource
worker.source.jvm.class=org.apache.spark.metrics.source.JvmSource
driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource
executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource
然后,它公开了许多指标,其中一些是:
{SparkAppId}.{ExecutorId}.jvm.heap.committed
{SparkAppId}.{ExecutorId}.jvm.heap.init
{SparkAppId}.{ExecutorId}.jvm.heap.max
{SparkAppId}.{ExecutorId}.jvm.heap.usage
{SparkAppId}.{ExecutorId}.jvm.heap.used
{SparkAppId}.{ExecutorId}.jvm.non-heap.committed
{SparkAppId}.{ExecutorId}.jvm.non-heap.init
{SparkAppId}.{ExecutorId}.jvm.non-heap.max
{SparkAppId}.{ExecutorId}.jvm.non-heap.usage
{SparkAppId}.{ExecutorId}.jvm.non-heap.used
这样您就可以监控您的应用程序堆使用情况。