需求:kill 掉yarn上超时的任务,实现不同队列不同超时时间的kill机制,并带有任务名的白名单功能

此为python脚本,可配置crontab使用

# _*_ coding=utf-8 _*_
# !/usr/bin/python
import re
import commands
import time run_app_arr = []
timeout_app_arr = []
ONE_HOURE = 1
THREE_HOURE = 3
TEST_QUEUE_NAME = ['hue', 'etl-test']
ONLINE_QUEUE_NAME = ['default']
KILL_WHITE_LIST = ['org.apache.spark.sql.hive.thriftserver.HiveThriftServer2']
DINGDING_URL = 'xxx'
ding_cmd = """ curl %s -H 'Content-Type: application/json' -d '{"msgtype": "text", "text": {"content": "== YARN OVERTIME JOB KILL 告警 ==\n\n 当前时间: %s \n kill_app_id: %s \n kill_app_name: %s \n kill_app_queue: %s "}}' """
f = None
try:
f = open('/home/hadoop/autokillhadoopjob/check_timeout_job.log', 'a')
commond = '. /etc/profile && yarn application -list | grep "http://" |grep "RUNNING" |cut -f1,2,5'
# 获得正在运行job的id,name,queue 加到 run_app_arr
status, output = commands.getstatusoutput(commond)
f.write('#' * 50 + '\n')
f.write('=> start_time: %s \n' % (time.strftime('%Y-%m-%d %H:%M:%S')))
if status == 0 :
for line in output.split('\n'):
if line.startswith('application_'):
app_line = re.split('\t', line)
running_app_id = app_line[0].strip()
running_app_name = app_line[1].strip()
app_queue = app_line[2].strip()
# 根据所在队列 筛选出app加到数组中
if app_queue in TEST_QUEUE_NAME or app_queue in ONLINE_QUEUE_NAME:
run_app_arr.append((running_app_id, running_app_name, app_queue))
else:
f.write('yarn -list 执行失败. status: %s.'%(status)) # 遍历所有队列的running job,如有超时加到timeout_app_arr
for run_app in run_app_arr:
running_app_id = run_app[0]
running_app_name = run_app[1]
running_app_queue = run_app[2]
commond = ". /etc/profile && yarn application -status " + running_app_id + "| grep 'Start-Time' | awk -F ':' '{print $2}'"
status, output = commands.getstatusoutput(commond)
if status == 0:
for line in output.split('\n'):
start_timestamp = line.strip()
if start_timestamp.isdigit():
# 计算任务耗时
elapsed_time = time.time() - int(start_timestamp) / 1000
cost_time = round(elapsed_time / 60 / 60, 2)
f.write('=> cost_time: %sh \n' % (cost_time))
# print cost_hour
# 筛选出超时的job 加到数据组中/过滤掉白名单任务
if running_app_name not in KILL_WHITE_LIST:
if (running_app_queue in TEST_QUEUE_NAME and cost_time > ONE_HOURE) \
or (running_app_queue in ONLINE_QUEUE_NAME and cost_time > THREE_HOURE):
# if cost_hour > 0:# 测试
f.write('=> timeout app => %s # %s # %s\n' % (running_app_id, running_app_name, running_app_queue))
timeout_app_arr.append((running_app_id, running_app_name, running_app_queue))
else:
f.write('yarn -status 执行失败. status: %s.'%(status)) if len(timeout_app_arr) == 0:
f.write('=> no timeout job.\n') # kill掉超时的job 并dingding报警
for kill_app in timeout_app_arr:
kill_app_id = kill_app[0]
kill_app_name = kill_app[1]
kill_app_queue = kill_app[2]
commond = '. /etc/profile && yarn application -kill ' + kill_app_id
status, output = commands.getstatusoutput(commond)
if status == 0:
f.write('=> kill app sucessfully: %s # %s # %s.\n' % (kill_app_id, kill_app_name, kill_app_queue))
current_time = time.strftime('%Y-%m-%d %H:%M:%S')
cmd = ding_cmd % (DINGDING_URL, current_time, kill_app_id, kill_app_name, kill_app_queue)
commands.getstatusoutput(cmd)
else:
f.write('=> kill app failed: %s # %s # %s.\n' % (kill_app_id, kill_app_name, kill_app_queue)) f.write('=> stop_time: %s \n' % (time.strftime('%Y-%m-%d %H:%M:%S'))) except Exception as e:
f.write('=> Exception: %s \n' % (e.message))
finally:
if f:
f.close()

yarn application -kill application_id yarn kill 超时任务脚本的更多相关文章

  1. hadoop job -kill 和 yarn application -kill 区别

    hadoop job -kill 调用的是CLI.java里面的job.killJob(); 这里会分几种情况,如果是能查询到状态是RUNNING的话,是直接向AppMaster发送kill请求的.Y ...

  2. hadoop job -kill 与 yarn application -kii(作业卡了或作业重复提交或MapReduce任务运行到running job卡住)

    问题详情  解决办法 [hadoop@master ~]$ hadoop job -kill job_1493782088693_0001 DEPRECATED: Use of this script ...

  3. yarn application命令介绍

    yarn application 1.-list     列出所有 application 信息    示例:yarn  application -list 2.-appStates <Stat ...

  4. kill 进程卡住,超时kill方法

    还是有漏洞 ,万一 working.py未超时, kill_job.sh 会不会杀死别人的进程啊start.sh#!/bin/bash python working.py &python wo ...

  5. spark-shell启动报错:Yarn application has already ended! It might have been killed or unable to launch application master

    spark-shell不支持yarn cluster,以yarn client方式启动 spark-shell --master=yarn --deploy-mode=client 启动日志,错误信息 ...

  6. yarn application ID 增长达到10000后

    Job, Task, and Task Attempt IDs In Hadoop 2, MapReduce job IDs are generated from YARN application I ...

  7. Yarn application has already exited with state FINISHED

    如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大 ...

  8. spark利用yarn提交任务报:YARN application has exited unexpectedly with state UNDEFINED

    spark用yarn提交任务会报ERROR cluster.YarnClientSchedulerBackend: YARN application has exited unexpectedly w ...

  9. 【深入浅出 Yarn 架构与实现】3-1 Yarn Application 流程与编写方法

    本篇学习 Yarn Application 编写方法,将带你更清楚的了解一个任务是如何提交到 Yarn ,在运行中的交互和任务停止的过程.通过了解整个任务的运行流程,帮你更好的理解 Yarn 运作方式 ...

随机推荐

  1. Azure REST API (3) 使用REST API,操作Azure ARM VM

    <Windows Azure Platform 系列文章目录> 笔者之前遇到一个客户,需求是当发生某一个特定条件的时候,对多台Azure ARM VM执行开机或者关机操作,这个时候就需要使 ...

  2. JTextArea利用JScrollpane增加文本域滚轮(滚动条)

    JTextArea加滚轮的几种方法 JTextArea txaDisplay = new JTextArea(); JScrollPane scroll = new JScrollPane(txaDi ...

  3. tomcat源码 StandardServer

    在执行org.apache.catalina.startup.Catalina#load的时候会执行org.apache.catalina.core.StandardServer#init,然后会调到 ...

  4. vue cli 配置信息说明

    摘自csdn http://blog.csdn.net/hongchh/article/details/55113751

  5. ALGO-141_蓝桥杯_算法训练_P1102

    定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值, 程序使用冒泡排序法将学生按照成绩从小到大的顺序 ...

  6. bzoj3815: 卡常数

    随机数据,带修改,求到空间中到给定点距离为给定值的点的编号,唯一解. 建三维kdtree,对查询用可行性剪枝在树上找,由于数据随机,插入删除时不需要维护平衡. #include<bits/std ...

  7. springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)

    在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...

  8. Spring Boot下Druid连接池+mybatis

      目前Spring Boot中默认支持的连接池有dbcp,dbcp2, hikari三种连接池.  引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连 ...

  9. [转]PLSQL 记住密码

  10. Scrapy学习篇(四)之数据存储

    上一篇中,我们简单的实现了toscrapy网页信息的爬取,并存储到mongo,本篇文章信息看看数据的存储.这一篇主要是实现信息的存储,我们以将信息保存到文件和mongo数据库为例,学习数据的存储,依然 ...