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("一切正常!")