Spark 應用監控告警-Graphite_exporter


相關內容原文地址:

CSDN:瓜牛呱呱:讓 Spark Streaming 程序在 YARN 集羣上長時間運行(一)—— 故障容錯、性能、安全
CSDN:瓜牛呱呱:讓 Spark Streaming 程序在 YARN 集羣上長時間運行(二)—— 日誌、監控、Metrics
CSDN:瓜牛呱呱:讓 Spark Streaming 程序在 YARN 集羣上長時間運行(三)—— Grafana、優雅地停止(Graceful stop)、總結
CSDN:weixin_44772715:graphite_exporter收集spark on yarn metrics
簡書:0o青團o0:Spark 應用監控告警和自動重啓
灰信網(軟件開發博客聚合):使用 PROMETHEUS 和 GRAFANA 監控 SPARK 應用


Graphite 來收集度量標準,Grafana 則用於構建儀表板,首先,需要配置 Spark 以將 metrics 報告到 Graphite。

一、下載graphite_exporter

prometheus 提供了一個插件(graphite_exporter),可以將 Graphite metrics 進行轉化並寫入 Prometheus (本文的方式)。

先去https://prometheus.io/download/下載graphite_exporter。
在這裏插入圖片描述

1.1 修改graphite_exporter_mapping

將下載下來的graphite_exporter上傳至服務器:

rz + graphite_exporter-.....tar.gz

解壓:

tar -zxvf graphite_exporter....tar.gz

重命名:

mv graphite_exporter....  graphite_exporter

進入到graphite_exporter,在該路面下創建graphite_exporter_mapping文件:

vi graphite_exporter_mapping

添加如下內容

mappings:
- match: '*.*.executor.filesystem.*.*'
  name: spark_app_filesystem_usage
  labels:
    application: $1
    executor_id: $2
    fs_type: $3
    qty: $4
- match: '*.*.jvm.*.*'
  name: spark_app_jvm_memory_usage
  labels:
    application: $1
    executor_id: $2
    mem_type: $3
    qty: $4
- match: '*.*.executor.jvmGCTime.count'
  name: spark_app_jvm_gcTime_count
  labels:
    application: $1
    executor_id: $2
- match: '*.*.jvm.pools.*.*'
  name: spark_app_jvm_memory_pools
  labels:
    application: $1
    executor_id: $2
    mem_type: $3
    qty: $4
- match: '*.*.executor.threadpool.*'
  name: spark_app_executor_tasks
  labels:
    application: $1
    executor_id: $2
    qty: $3
- match: '*.*.BlockManager.*.*'
  name: spark_app_block_manager
  labels:
    application: $1
    executor_id: $2
    type: $3
    qty: $4
- match: '*.*.DAGScheduler.*.*'
  name: spark_app_dag_scheduler
  labels:
    application: $1
    executor_id: $2
    type: $3
    qty: $4
- match: '*.*.CodeGenerator.*.*'
  name: spark_app_code_generator
  labels:
    application: $1
    executor_id: $2
    type: $3
    qty: $4
- match: '*.*.HiveExternalCatalog.*.*'
  name: spark_app_hive_external_catalog
  labels:
    application: $1
    executor_id: $2
    type: $3
    qty: $4
- match: '*.*.*.StreamingMetrics.*.*'
  name: spark_app_streaming_metrics
  labels:
    application: $1
    executor_id: $2
    app_name: $3
    type: $4
    qty: $5

1.2 啓動graphite_exporter

./graphite_exporter --graphite.mapping-config=graphite_exporter_mapping

二、Spark配置Graphite metrics

Spark 是自帶 Graphite Sink 的,只需要配置一下metrics.properties;
進入到spark安裝目錄下,進入到conf目錄下,找到metrics.properties

cd /spark/conf/
vi metrics.properties

在最下面更新如下內容:

*.source.jvm.class=org.apache.spark.metrics.source.JvmSource
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

*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
*.sink.graphite.protocol=tcp
*.sink.graphite.host=spark-ip
*.sink.graphite.port=9109
*.sink.graphite.period=1
*.sink.graphite.unit=seconds

graphite_exporter 接收數據端口爲9109
Prometheus接收數據端口開發說明

三、啓動Spark程序

啓動spark程序時,需要加上–files /usr/etc/spark/conf/metrics.properties參數。
例如:

nohup ./spark-submit --class StreamingInput --master spark://master:7077 --supervise --num-executors 3 --total-executor-cores 3 --executor-memory 2g --files /usr/etc/spark/conf/metrics.properties /root/StreamingInput.jar > /root/logs/StreamingInput.log.txt 2>&1 &

將應用程序的 metric 固定爲靜態的應用程序名稱:

--conf spark.metrics.namespace=my_application_name

四、配置Prometheus

scrape_configs:
  - job_name: 'spark'
    static_configs:
    - targets: ['spark-ip:9108']

重啓Prometheus。

4.1 查看Prometheus是否收集到metrics數據

curl spark-ip:9108/metrics    

若成功,則會收到如下數據:

# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 3.5844e-05
go_gc_duration_seconds{quantile="0.25"} 7.1282e-05
go_gc_duration_seconds{quantile="0.5"} 9.674e-05
go_gc_duration_seconds{quantile="0.75"} 0.0001363

.................................此處略過很多行

spark_app_jvm_memory_usage{application="application_1556625797222_0045",executor_id="driver",mem_type="total",qty="max"} 1.050673151e+09
spark_app_jvm_memory_usage{application="application_1556625797222_0045",executor_id="driver",mem_type="total",qty="used"} 1.114036792e+09

五、Metrics分析

Spark 會從 Driver 和 executors 生成大量指標。 如果我選擇最重要的一個,那將是最後收到的 batch 的信息。 當StreamingMetrics.streaming.lastReceivedBatch_records == 0時,這可能意味着 Spark Streaming 作業已停止或失敗。

下面列出了其他重要的 metrics:

  • 當總延遲大於批處理間隔時,處理延遲將會增加。
driver.StreamingMetrics.streaming.lastCompletedBatch_totalDelay
  • 當運行的 task 數低於 number of executors * number of cores 時,YARN 分配的資源未充分利用。
executor.threadpool.activeTasks
  • RDD的緩存使用了多少內存。
driver.BlockManager.memory.memUsed_MB
  • 當 RDD 緩存沒有足夠的內存時,有多少數據 spilled 到磁盤。 你應該增加executor 內存或更改 spark.memory.fraction 的Spark參數以避免性能下降。
driver.BlockManager.disk.diskSpaceUsed_MB
  • Spark Driver 上的 JVM 內存利用率是多少
driver.jvm.heap.used
driver.jvm.non-heap.used
driver.jvm.pools.G1-Old-Gen.used
driver.jvm.pools.G1-Eden-Space.used
driver.jvm.pools.G1-Survivor-Space.used
  • 在Spark Driver上的 GC 花費了多少時間
driver.jvm.G1-Old-Generation.time
driver.jvm.G1-Young-Generation.time
  • Spark executors 上的 JVM 內存利用率是多少
[0-9]*.jvm.heap.used
[0-9]*.jvm.non-heap.used
[0-9]*.jvm.pools.G1-Old-Gen.used
[0-9]*.jvm.pools.G1-Survivor-Space.used
[0-9]*.jvm.pools.G1-Eden-Space.used
  • 在Spark executors上的 GC 花費了多少時間
[0-9]*.jvm.G1-Old-Generation.time
[0-9]*.jvm.G1-Young-Generation.time

六、Grafana模板

在Grafana官網,沒有找到合適的dashboard,貌似得自己手寫了。需要自己研究手寫搞一套了。。
DASHBOARD 配置:
將 application label 加入 Variables 用於篩選不同的應用:
在這裏插入圖片描述
配置相應的圖表:
在這裏插入圖片描述

七、進程監控失敗重啓和告警模塊

監控yarn上指定的Spark應用是否存在,不存在則發出告警。

使用Python腳本查看yarn狀態,指定監控應用,應用中斷則通過webhook發送報警信息到釘釘羣,並且自動重啓。

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import os
import json
import requests

'''
Yarn應用監控:當配置的應用名不在yarn applicaition -list時,釘釘告警
'''


def yarn_list(applicatin_list):
    yarn_application_list = os.popen('yarn application -list').read()
    result = ""
    for appName in applicatin_list:
        if appName in yarn_application_list:
            print("應用:%s 正常!" % appName)
        else:
            result += ("告警--應用:%s 中斷!" % appName)
            if "應用名1" == appName:
                os.system('重啓命令')

    return result


def dingding_robot(data):
    # 機器人的webhooK 獲取地址參考:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
    webhook = "https://oapi.dingtalk.com/robot/send?access_token" \
              "=你的token "
    headers = {'content-type': 'application/json'}  # 請求頭
    r = requests.post(webhook, headers=headers, data=json.dumps(data))
    r.encoding = 'utf-8'
    return r.text


if __name__ == '__main__':
    applicatin_list = ["應用名1", "應用名2", "應用名3"]
    output = yarn_list(applicatin_list)
    print(output)

    if len(output) > 0:
        # 請求參數 可以寫入配置文件中
        data = {
            "msgtype": "text",
            "text": {
                "content": output
            },
            "at": {
                "atMobiles": [
                    "xxxxxxx"
                ],
                "isAtAll": False
            }
        }
        res = dingding_robot(data)
        print(res)  # 打印請求結果
    else:
        print("一切正常!")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章