我正在通过Java运行Spark Streaming作业。我在AWS上有一个带有cloudera发行版的4节点集群,其中3个是计算节点。我需要记录当我的作业运行时在群集的每个执行器/节点上使用多少java堆。我正在使用getRunTime()的方法,但我得到一个值,我相信是来自驱动程序执行。
是否有可用于捕获单个堆利用率的方法?
答案 0 :(得分:3)
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
通过这种方式,您可以监控应用程序堆的使用情况。