SparkStreaming任务监控
SparkStreaming实时计算引擎,在生产应用中为保证系统稳定性,减少事故发生,需做一些事前、事中、事后动作。监控是比不可少的一步,那如何去监控SparkStreaming任务运行状态、计算延迟?Spark监控说明介绍:http://spark.apache.org/docs/latest/monitoring.html
▊ Python实现SparkStreaming任务监控
支持 Spark On Yarn 任务运行状态监控,任务停止,执行应用启动脚本
支持 SparkStreaming 任务计算延迟监控,设定延迟预警阀值,超时预警
本文主要介绍本公司内使用RestAPI方式通过Python监控运行指标,SparkStreaming 运行模式Spark On Yarn,Spark版本2.2.0,Python版本3.6.监控内容1.Spark On Yarn 任务运行状态,任务停止则进行预警,启动任务;任务运行中则进行计算延迟监控,设定延迟阀值,超过阀值进行预警。定时调度可使用linux crontab或公司内调度产品,执行频率随可容忍时效而定,目前我们是每5分钟1次。
crontab或公司内调度产品,执行频率随可容忍时效而定,目前我们是每5分钟1次。
import subprocessimport jsonimport urllib.requestimport sys# 规则:监控spark on yarn任务运行状态,监控sparkstreaming 任务运行延迟情况if __name__ == "__main__": """ # 支持 调用脚本时,指定参数 argv = sys.argv if len(argv) <= 1: print('argv', str(argv)) print("argv exception! ") sys.exit(1) yarn_master = argv[1] spark_appname = argv[2] spark_task_name = argv[3] delay_threshold = int(argv[4]) shell_app_start = argv[5] """ # 变量定义 # yarn resourcemanager ip yarn_master = "192.168.15.11" # spark appname spark_appname = "spark-app" # spark on yarn task name,用于查看SparkOnYarn任务 spark_task_name = "SparkApplication" # 计算延迟预警阀值 delay_threshold_min = 5 # spark应用启动脚本 shell_app_start = "sh /app/realtime/spark/start-app.sh" shell_yarn_list = "yarn application -list 2>1 | grep {}".format(spark_task_name) yarn_list = subprocess.getoutput(shell_yarn_list) yarn_list_arr = yarn_list.split('\t') # 判断任务是否运行 if yarn_list and yarn_list_arr[5].strip() == 'RUNNING': # 监控任务运行情况 url = "http://{}:8088/proxy/{}/metrics/json".format(yarn_master, yarn_list_arr[0]) response = '' try: response = urllib.request.urlopen(url) except Exception as e: print("ERROR:访问URL异常", str(e), str(url)) if response == '': # 告警 print("spark on yarn|sparkstreaming application:{}|task :{},url response is null,please check the exception ".format( spark_appname,spark_task_name)) else: metrics_data = json.load(response) totalDelay_key = '{}.driver.{}.StreamingMetrics.streaming.lastCompletedBatch_totalDelay'.format( yarn_list_arr[0], spark_appname) totalDelay = metrics_data['gauges'][totalDelay_key]['value'] if totalDelay == '': # 告警 - kill - start print( "spark on yarn|sparkstreaming application:{}|task :{},totalDelay is null,please check the exception ".format( spark_appname,spark_task_name)) elif totalDelay >= delay_threshold_min * 60 * 1000: # 告警 delayMin = totalDelay / 1000 / 60 print("spark on yarn|sparkstreaming application:{}|task :{},totalDelay {} min ".format(spark_appname,spark_task_name, delayMin)) else: # 启动spark 任务 print( "spark on yarn|sparkstreaming application:{}|task :{},task state is stod,next start the task.".format(spark_appname,spark_task_name)) state = subprocess.getoutput(shell_app_start) print("state: "+state)
注:
[1]SparkStreaming RestAPI监控从spark2.2.0版本开始支持。
注:
[1]SparkStreaming RestAPI监控从spark2.2.0版本开始支持。
[2]预警操作需使用者调整添加,目前生产调用脚本输出信息触发预警接口。
![c35cd17998f47cb5f834ad412ae1174e.gif](https://i-blog.csdnimg.cn/blog_migrate/40beacb4cecf41df6f76ea54f1093758.gif)
长按,扫码,关注
及时收看更多精彩内容