【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警

news2025/1/18 3:29:29

🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁

🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁

感谢点赞和关注 ,每天进步一点点!加油!

目录

一、概述

二、集群版本信息

三、组件状态信息获取

三、告警实现


一、概述


Ambari 借鉴了很多成熟分布式软件的 API 设计。Rest API 就是一个很好地体现。通过 Ambari 的 Rest API,可以在脚本中通过 curl 维护整个集群。并且,我们可以用 Rest API 实现一些无法在 Ambari GUI 上面做的操作。


二、集群版本信息



三、组件状态信息获取


参考:【Ambari】Python调用Rest API 获取集群状态信息并发送钉钉告警-CSDN博客

RESOURCEMANAGER停止

 curl -u admin:admin -i -H  'X-Requested-By:ambari'  -X PUT -d  '{"RequestInfo":{"context":"Restart RESOURCEMANAGER via REST"},"Body" : {"HostRoles" : {"state":"INSTALLED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER
  • -u Ambari登录用户:密码
  • -i -H获取http请求的完整头部信息,包括请求方法、请求地址、请求头信息等
  • -X 同时想发 HEAD、GET 或 POST 请求,需在 -X 中声明要使用的请求方式

ambari页面显示停止成功调用

ambari页面RM服务停止

RESOURCEMANAGER启动

curl -u admin:admin -i -H  'X-Requested-By:ambari'  -X PUT -d  '{"RequestInfo":{"context":"Restart RESOURCEMANAGER via REST"},"Body" : {"HostRoles" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER

直接使用RESTART

curl -uadmin:admin -H 'X-Requested-By: ambari' -X POST -d '{"RequestInfo":{"command":"RESTART","context":"Restart RESOURCEMANAGER via REST","operation_level":{"level":"HOST","cluster_name":"winner"}},"Requests/resource_filters":[{"service_name":"YARN","component_name":"RESOURCEMANAGER","hosts":"hdp103"}]}' http://192.168.2.153:8080/api/v1/clusters/winner/requests

请求响应接受


四、告警实现


python 脚本实现RM HA的监控告警

# -*- coding: utf-8 -*-
import logging
import time
from imp import reload

import requests
import json
import sys
"""
~~~~~~~~~~~~
author: kangll
date: 2023/12/6 13:29 
desc: 

-- curl 请求,如下为测试链接
        curl -u admin:admin -i -H X-Requested-By:ambari -XGET  http://192.168.2.153:8080/api/v1/clusters/winner/hosts/winner
                  http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER
-- datanode 启动        
curl -u admin:admin -i -H  'X-Requested-By:ambari'  -X PUT -d  '{"RequestInfo":{"context":"Start RESOURCEMANAGER via REST"}
,"Body" : {"ServiceInfo" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS

"""

reload(sys)
sys.setdefaultencoding('utf8')
__author__ = 'kanglilong  <kangll@winnerinf.com>'
logger = logging.getLogger('mylogger')
logger.setLevel(level=logging.INFO)
# Ambari rest api 访问地址
control_url = "http://192.168.2.153:8080/api/v1/clusters/winner/hosts"
# ambari web 登录账号
AUTH = ("admin", "admin")
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 钉钉URL
api_url = "https://oapi.dingtalk.com/robot/send?access_token=f4e0f344306ce9b6eec60bec95d5aa7c57f4264a791458dc09121dd7e948ac64"
# RM hostname
rm_hostname_01 = "hdp103"
rm_hostname_02 = "hdp105"
requests_rm_url = "http://192.168.2.153:8080/api/v1/clusters/winner/requests"


def getHostComponentsStatus():
    """
    获取某个服务器上某个组件的状态信息
    :param host:
    :return: component_dict   组件与其状态
             status           当前节点状态是否符合期望,
             getStatus        是否获取到了状态
    """
    now_time = time.localtime(time.time())
    formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)
    json_text = {
        "RequestInfo": {
            "command": "RESTART",
            "context": "Restart RESOURCEMANAGER via REST",
            "operation_level": {
                "level": "HOST",
                "cluster_name": "winner"
            }
        },
        "Requests/resource_filters": [{
            "service_name": "YARN",
            "component_name": "RESOURCEMANAGER",
            "hosts": "{}".format(rm_hostname_01)
        }]
    }
    get_rm_status_url_01 = control_url + "/{}/host_components/RESOURCEMANAGER".format(rm_hostname_01)
    get_rm_status_url_02 = control_url + "/{}/host_components/RESOURCEMANAGER".format(rm_hostname_02)
    print("-----------------")
    rep01 = requests.get(get_rm_status_url_01, auth=AUTH)
    # 如果状态码是20x 则获取成功
    print(rep01.status_code)
    if str(rep01.status_code).startswith("200"):
        jsonRep01 = json.loads(rep01.text)
        component_name_01 = jsonRep01['HostRoles']['component_name']
        status_01 = jsonRep01['HostRoles']['state']
        ha_state_01 = jsonRep01['HostRoles']['ha_state']
        host_name_01 = jsonRep01['HostRoles']['host_name']  # STARTED

    else:
        # 没有正常获取到状态
        print("没有正常获取到状态")

    rep02 = requests.get(get_rm_status_url_02, auth=AUTH)
    # 如果状态码是20x 则获取成功
    print(rep02.status_code)
    if str(rep02.status_code).startswith("200"):
        jsonRep02 = json.loads(rep02.text)
        component_name_02 = jsonRep02['HostRoles']['component_name']
        status_02 = jsonRep02['HostRoles']['state']
        ha_state_02 = jsonRep02['HostRoles']['ha_state']
        host_name_02 = jsonRep02['HostRoles']['host_name']  # STARTED
    else:
        # 没有正常获取到状态
        print("没有正常获取到状态")

    # RM 为 STARTED status
    if component_name_01 == component_name_02 and status_01 == "STARTED" and status_02 == "STARTED":
        # 两个RM都为STANDBY则重启其中一个 
        if ha_state_01 == ha_state_02 and ha_state_01 == "STANDBY" and ha_state_02 == "STANDBY":
            text = "告警对象:主机名:" + host_name_01 + ', ' + host_name_02 + ' \n组件名称:' + component_name_01 + " \n告警内容:HDP集群服务 " + component_name_01 + " 高可用状态异常 " + ha_state_01 + ",  触发重启" + "\n告警时间:" + formatted_time
            send_msg(text)
            print("RESOURCEMANAGER state abnormal.")
            restart_res = requests.post(requests_rm_url, data=json.dumps(json_text), auth=AUTH, headers=headers)
            print(restart_res.text)
            if str(restart_res.status_code).startswith("202"):
                # 没有正常获取到状态
                print("重启请求发送成功!")
            else:
                # 没有正常获取到状态
                print("重启请求发送成功!")
        else:
            #
            print("RESOURCEMANAGER state normal.")


def send_msg(text):
    """
    :param text: 告警文本
    :return:
    """
    json_text = {
        "msgtype": "text",
        "text": {
            "content": text
        }, "at": {
            "atMobiles": ["1786881xxxx"]
        }

    }
    requests.post(api_url, json.dumps(json_text), headers=headers).content


getHostComponentsStatus()

钉钉告警发送成功

RM 重启一台RM操作完成,触发HA的强制切换

需要添加配置 ambari.properties

vi /etc/ambari-server/conf/ambari.properties
# 添加如下配置
api.csrfPrevention.enabled=false

# 重启
ambari-server restart

request请求返回的状态码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…

介绍java spring 提供的默认数据库持久化技术 JdbcTemplate基本演示

之前 我们说过spring贴心的内嵌了三种数据源形式 其中默认为HikariCP 其实 spring 也提供了持久化数据库连接技术 这个技术其实大部分都接触过 那就是 JDBC 随着时代的发展 用他的人也越来越少了 那么 我们要演示 JdbcTemplate 导入 mybatis 或 mybatis-plus 的片段 就要注掉了…

nacos服务的分级存储

举例说明 一个服务可以有多个实例&#xff0c;比如我们当前有4个实例&#xff0c;都叫做nacos-user-service服务 ip地址端口服务器所属地区集群192.168.xxx.xxx18080广东GD192.168.xxx.xxx18081广东GD192.168.xxx.xxx18082广西GX192.168.xxx.xxx18083广西GX所以我们可以将nacos…

跨境电商独立站怎么获取流量 跨境电商引流的两个方法

独立站有着比SaaS和中心化站点不一样的特点&#xff0c;今天介绍两种引流的主要玩法&#xff1a; 独立站的第一种玩法是通过数据&#xff0c;找到爆款&#xff0c;搭建独立站&#xff0c;企业站加电商功能、交易、订单配送功能&#xff0c;搜索引擎seo引流法&#xff0c;外联渠…

服务器RAID系统的常见故障,结合应用场景谈谈常规的维修处理流程

常见的服务器RAID系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论&#xff1a; 硬盘故障&#xff1a; 应用场景&#xff1a;在服务器RAID系统中&#xff0c;硬盘故障是最常见的问题之一。硬盘可能…

[MySQL--基础]事务的基础知识

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;生活中最重要的决定就是要做出决定。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 MySQL数据库 事务的目录&#x1f4d5; 前言事务简介&#x1f680;事务操作&#x1f680;准…

【头歌系统Python实验】顺序与选择结构

目录 第1关&#xff1a;顺序结构 第2关&#xff1a;选择结构&#xff1a;if-else 第3关&#xff1a;选择结构 &#xff1a; 三元操作符 如果对你有帮助的话&#xff0c;不妨点赞收藏评论一下吧&#xff0c;爱你么么哒&#x1f618;❤️❤️❤️ 第1关&#xff1a;顺序结构 …

批量AI写作生成器有哪些?免费的批量AI写作生成器

当今信息爆炸的时代&#xff0c;文案需求量庞大&#xff0c;传统文案写作已无法满足快速迭代的需求。批量AI写作生成器应运而生&#xff0c;成为许多行业的得力助手。在众多AI写作工具中&#xff0c;147原创助手以其批量AI写作功能和在各大平台显示原创首发的特性脱颖而出。本文…

大数据项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学…

redis-学习笔记(hash)

Redis 自身已经是 键值对 结构了 Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成后, 到了 value 这一层, 还可以用 哈希类型 来组织 (简单的说就是哈希里面套哈希 [数组里面套数组 -> 二维数组] ) [ field value ] hset key field value [ field va…

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步&#xff0c;slow依然指向head&#xff1b;然后fa…

对Spring源码的学习:二

目录 SpringBean实例化流程 Spring的后处理器 Bean工厂后处理器 SpringBean实例化流程 Spring容器在进行初始化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去…

成品短视频app源码选择指南

作为一名有志于开发短视频app的创业者&#xff0c;选择合适的成品短视频app源码至关重要。一款优秀的成品短视频app源码可以帮助你节省开发时间&#xff0c;加速上线进程&#xff0c;快速实现盈利。但在众多的选择中&#xff0c;如何找到适合自己的成品短视频app源码呢&#xf…

商业案例实战:Python数据可视化之四象限图

1.四象限图的含义 四象限图是一种针对二维数据&#xff08;x&#xff0c;y&#xff09;的平面图形。二维数据&#xff08;x&#xff0c;y&#xff09;的两个维度垂直交叉在一起&#xff0c;分别构成四象限图的X轴及Y轴。两个维度所有样本的均值&#xff08;即x的均值和y的均值…

在 Docker 容器中运行 macOS:接近本机性能,实现高效运行 | 开源日报 No.96

cxli233/FriendsDontLetFriends Stars: 2.6k License: MIT 这个项目是关于数据可视化中好的和不好的实践&#xff0c;作者通过一系列例子解释了哪些图表类型是不合适的&#xff0c;并提供了如何改进或替代它们。主要功能包括展示错误做法以及正确做法&#xff0c;并提供相应代…

98基于matlab的在MIMO通信系统中功率优化算法的仿真

基于matlab的在MIMO通信系统中&#xff0c;功率优化算法的仿真&#xff0c;重点研究了注水功率分配算法。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 98matlab功率优化功率分配 (xiaohongshu.com)

2.1 网络编程-多用户通信系统(用户登录、拉取在线用户、无异常退出)

文章目录 一、多用户通信系统1.1 介绍1.2 公共类1.2.1 封装消息类1.2.2 用户类1.2.3 消息类型类1.2.4 控制台读取内容 二、用户登录2.1 客户端2.1.1 菜单界面 QQView2.1.2 验证用户UserClientService2.1.3 线程类 ClientConnectServerThread2.1.4 线程集合类 2.2 服务端2.2.1 服…

C++ - 函数重载和运算符重载

文章目录 1.函数重载2.运算符重载 1.函数重载 函数重载 (Overload)是 C 语言在C语言基础上新增的功能。函数重载能够在程序中使用多个同名的函数。是C多态的特征体现。 通过函数重载来设计一系列的函数&#xff0c;它们完成相同或者相似的功能&#xff0c;但使用不同的参数列表…

el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求 Select 选择器 多选需要增加 全选 和 取消全选 功能&#xff0c;前端框架为vue2&#xff0c;UI组件为elementUI。 2. 代码 html部分 <template><el-tooltip effect"dark" :disabled"defaultValue.length < 0" :content"defaul…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…