1,因业务需求,需要监控yarn的某些常驻进程,如果挂了的话,打电话报警或者把相关报警发到报警群里。
package com.crgt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.util.ConverterUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
/**
* @Author: wpp
* @Date: 2020/3/29 13:36
*
* https://blog.youkuaiyun.com/zhangshenghang/article/details/104447587#%E4%BB%A3%E7%A0%81
*
*/
public class YarnMonitor {
public static void main(String[] args) throws IOException, InterruptedException {
// while(true) {
// TimeUnit.SECONDS.sleep(10);
// Map<String,String> hashMaps = RedisUtil.getInstance().hash().hgetAll("yarn_monitor_hash");
// for(String key : hashMaps.keySet()) {
// Boolean yarnIsContains = yarnIsContains(key);
// String msg = "yarn的调度名称:" + key +",yarn的任务:"+ hashMaps.getOrDefault(key,"")+",任务是否存在"+yarnIsContains;
// System.out.println(msg);
// if(!yarnIsContains){
// sendMsgToWeiXin(msg);
// }
// }
// }
while(true) {
String threadSleep = RedisUtil.getInstance().strings().get("yarn_scheduler_time");
System.out.println(Integer.valueOf(threadSleep));
TimeUnit.SECONDS.sleep(Integer.valueOf(threadSleep));
Map<String,String> hashMaps = RedisUtil.getInstance().hash().hgetAll("yarn_monitor_hash");
StringBuilder sb = new StringBuilder();
Map<String ,Boolean> yarnContainsMap = yarnIsRuning(hashMaps);
for(String key : yarnContainsMap.keySet() ){
if(!yarnContainsMap.get(key)){
sb.append("yarn的调度名称:" + key +",yarn的任务:"+ hashMaps.getOrDefault(key,"")+",任务是否存在:"+yarnContainsMap.get(key) + "\n");
}else{
System.out.println(key + "数据存在");
}
}
if(sb.toString().length() != 0){
sendMsgToWeiXin(sb.toString());
System.out.println("ressss======="+sb.toString());
}
}
}
/**
* 获取任务的applicationId
* @return String
* @param jobName
* @return
*/
public static String getAppId(String jobName) {
YarnClient client = YarnClient.createYarnClient();
Configuration conf = new Configuration();
client.init(conf);
client.start();
EnumSet<YarnApplicationState> appStates = EnumSet.noneOf(YarnApplicationState.class);
if (appStates.isEmpty()) {
appStates.add(YarnApplicationState.RUNNING);
appStates.add(YarnApplicationState.ACCEPTED);
appStates.add(YarnApplicationState.SUBMITTED);
}
List<ApplicationReport> appsReport = null;
try {
//返回EnumSet<YarnApplicationState>中个人任务状态的所有任务
appsReport = client.getApplications(appStates);
} catch (YarnException | IOException e) {
e.printStackTrace();
}
assert appsReport != null;
for (ApplicationReport appReport : appsReport) {
//获取任务名
String jn = appReport.getName();
String applicationType = appReport.getApplicationType();
if (jn.equals(jobName) && "Apache Flink".equals(applicationType)) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
return appReport.getApplicationId().toString();
}
}
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据任务的applicationId去获取任务的状态
* @return YarnApplicationState
* @param appId
* @return
*/
public static YarnApplicationState getState(String appId) {
YarnClient client = YarnClient.createYarnClient();
Configuration conf = new Configuration();
client.init(conf);
client.start();
ApplicationId applicationId = ApplicationId.fromString(appId);
// ApplicationId appId = ConverterUtils.toApplicationId(appId);
YarnApplicationState yarnApplicationState = null;
try {
ApplicationReport applicationReport = client.getApplicationReport(applicationId);
yarnApplicationState = applicationReport.getYarnApplicationState();
} catch (YarnException | IOException e) {
e.printStackTrace();
}
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
return yarnApplicationState;
}
public static void sendMsgToWeiXin(String msg){
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://screen-bigdata.ccrgt.com/sms/sendReport");
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
List<NameValuePair> valuePairs = new ArrayList<>();
NameValuePair valuePair = new BasicNameValuePair("msg", msg);
valuePairs.add(valuePair);
HttpEntity entity = null;
try {
entity = new UrlEncodedFormEntity(valuePairs,"UTF-8");
httpPost.setEntity(entity);
httpclient.execute(httpPost);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 判断任务名为appName的任务,是否在yarn中运行,状态为RUNNING
* @return Boolean
* @param appName
* @return
*/
public static Boolean yarnIsContains(String appName) {
Configuration conf = new YarnConfiguration();
YarnClient yarnClient = YarnClient.createYarnClient();
yarnClient.init(conf);
yarnClient.start();
Boolean isContains = false;
List<ApplicationReport> applications = new ArrayList<ApplicationReport>();
try {
//applications = yarnClient.getApplications(EnumSet.of(YarnApplicationState.RUNNING, YarnApplicationState.FINISHED));
applications = yarnClient.getApplications(EnumSet.of(YarnApplicationState.RUNNING));
for(ApplicationReport application : applications) {
String name = application.getName();
if(name.equals(appName)) {
System.out.println("ApplicationId ============> "+application.getApplicationId());
System.out.println("name ============> "+application.getName());
System.out.println("queue ============> "+application.getQueue());
System.out.println("user ============> "+application.getUser());
System.out.println("application=========" + application);
isContains = true;
}
}
/*
* if(applications.contains(appName)) {
* System.out.println("ApplicationId ============> "+applications.get(0).
* getApplicationId());
* System.out.println("name ============> "+applications.get(0).getName());
* System.out.println("queue ============> "+applications.get(0).getQueue());
* System.out.println("queue ============> "+applications.get(0).getUser());
* System.out.println(applications); }
*/
} catch (YarnException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
yarnClient.stop();
}
return isContains;
}
/**
* 判断任务名为appName的任务,是否在yarn中运行,状态为RUNNING
* @return Boolean
* @param appName
* @return
*/
public static Map<String,Boolean> yarnIsRuning(Map<String,String> map) {
Configuration conf = new YarnConfiguration();
YarnClient yarnClient = YarnClient.createYarnClient();
yarnClient.init(conf);
yarnClient.start();
List<ApplicationReport> applications = new ArrayList<ApplicationReport>();
Map<String,Boolean> resMap = new HashMap<String,Boolean>();
try {
//applications = yarnClient.getApplications(EnumSet.of(YarnApplicationState.RUNNING, YarnApplicationState.FINISHED));
applications = yarnClient.getApplications(EnumSet.of(YarnApplicationState.RUNNING));
for(String appName : map.keySet()){
resMap.put(appName,false);
for(ApplicationReport application : applications) {
String name = application.getName();
if(name.equals(appName)) {
System.out.println("ApplicationId ============> "+application.getApplicationId());
System.out.println("name ============> "+application.getName());
System.out.println("queue ============> "+application.getQueue());
System.out.println("user ============> "+application.getUser());
System.out.println("application=========" + application);
resMap.put(appName,true);
}
}
}
} catch (YarnException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
yarnClient.stop();
}
return resMap;
}
}
2,使用python,把要添加的任务添加redis,进行相关处理
import redis
r = redis.StrictRedis(host="10.2.12.76", port=6379, password="eD5JbS9y9ZDB5umf", db=0)
key = 'yarn_monitor_hash'
r.set('yarn_scheduler_time', 3600)
#添加相关监控指标
#r.hset(key, 'ComputeGpsInOutStationDev', '进出站计算')
r.hset(key, 'dws_first_mac_dri2', '首次开网人数')
#r.hset(key, 'dws_first_mac_dri2', '首次开网人数2')
#删除相关数据
# r.hdel(key, 'TracingDataSparkStreamingToESTest1')
r.hdel(key, 'dws_first_mac_dri')
#r.delete(key)
list2 = r.hgetall(key)
for (key, val) in list2.items():
print(key.decode('utf-8'), val.decode('utf-8'))
3.链接redis的util

本文介绍了一种使用Java实现的YARN进程监控系统,能够检测特定任务的状态并在任务异常时通过微信发送警报。同时,系统利用Redis存储监控配置,支持动态调整监控策略,包括监控频率和任务列表。
最低0.47元/天 解锁文章
4223

被折叠的 条评论
为什么被折叠?



