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

这篇具有很好参考价值的文章主要介绍了【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

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

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

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

目录

一、概述

二、集群版本信息

三、组件状态信息获取

三、告警实现


一、概述


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


二、集群版本信息


【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA


三、组件状态信息获取


参考:【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】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

ambari页面显示停止成功调用

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

ambari页面RM服务停止

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

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

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

直接使用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

请求响应接受

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA


四、告警实现


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()

钉钉告警发送成功

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

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

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA

需要添加配置 ambari.properties

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

# 重启
ambari-server restart

request请求返回的状态码

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警,# 【==== Ambari ====】,ambari,钉钉,restAPI,python,钉钉告警,HDP,YARN HA文章来源地址https://www.toymoban.com/news/detail-752099.html

到了这里,关于【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jira REST API_获取创建issue时的字段配置

    通过 Jira REST API 创建 jira issue 时,可以根据jira 配置,动态获取需要填写的字段;这样就不用每次通过UI ,固定指定创建issue时需要填充的内容,来实现接口创建 issue 了。 获取创建项目的问题类型: 获取指定问题类型创建时的字段配置 可以先获取项目类型id,然后再在末尾传

    2024年01月17日
    浏览(44)
  • Python请求kyuubi rest API

    kyuubi 版本:1.7.1 kyuubi 官网:https://kyuubi.readthedocs.io/en/master/ 通过Python代码访问kyuubi接口 熟悉Python http请求方法 Tips 即使请求内容为空,也需要加json={}

    2024年02月06日
    浏览(35)
  • 用python写一个Rest API服务

    以下是一个使用Flask框架编写的简单REST API服务的示例。 在此示例中,我们将创建一个基本的待办事项列表,并提供CRUD(创建、读取、更新、删除)操作。 首先,确保你已经安装了Flask框架(可以使用pip install Flask安装),然后创建一个名为app.py的Python文件,并添加以下代码

    2024年02月05日
    浏览(52)
  • Hadoop YARN HA 集群安装部署详细图文教程

    目录 一、YARN 集群角色、部署规划 1.1 集群角色--概述 1.2 集群角色--ResourceManager(RM)  1.3 集群角色--NodeManager(NM)  1.4 HA 集群部署规划 二、YARN RM 重启机制 2.1 概述  2.2 演示  2.2.1 不开启 RM 重启机制现象  2.3 两种实现方案与区别  2.3.1 Non-work-preserving RM restart 2.3.2 

    2024年02月04日
    浏览(52)
  • 【Java可执行命令】(十五)Java进程状态信息获取工具 jps:获取和监控Java进程的状态信息 ~

    JPS(Java Virtual Machine Process Status Tool) 是 Java Development Kit(JDK) 提供的一个命令行工具,它用于 查看运行在Java虚拟机(JVM)中的所有Java进程 。该工具旨在提供一种方便的方式来获取和监控Java进程的状态信息,以帮助开发人员进行调试、性能分析或诊断。 JPS 是一个Java虚拟

    2024年02月14日
    浏览(36)
  • 如何使用Python Flask和MySQL创建管理用户的REST API

    部分数据来源: ChatGPT  引言         在现代化的应用开发中,数据库是一个非常重要的组成部分。关系型数据库(例如:MySQL、PostgreSQL)在这方面尤其是很流行。Flask是一个Python的web框架,非常适合实现REST API。在这篇文章中,我们将介绍如何使用Python Flask和MySQL创建一个

    2024年02月08日
    浏览(62)
  • 车辆保险查询API——查询车辆保险状态及保单信息

    近年来,车辆保险成为广大车主必须购买的一项重要保障。然而,如何查询车辆保险状态及保单信息却是许多车主面临的难题。随着技术的不断发展,API的出现为我们提供了一条便捷的解决之路。本文介绍的《车辆保险查询API——查询车辆保险状态及保单信息》便是一款实用

    2024年02月05日
    浏览(47)
  • rpc调用无法获取异常信息解决

    原本http请求的写法如下:     上面的调用只能拿到不明确的错误信息,如下: StatusCode:400, Msg:status code: 400, reason phrase: model_error] 但是直接curl调用外部接口却可以获取详细错误信息,实例如下: {   \\\"error\\\": {     \\\"message\\\": \\\"This model\\\'s maximum context length is 8192 tokens. However, you requ

    2024年02月13日
    浏览(35)
  • 三台异构服务器搭建hadoop HA集群史上最详细方案(HDFS+YARN)

     一、系统基础服务配置 主机名 IP 操作系统 CPU 内存 磁盘 Hive01 10.86.102.104 Centos 7.9.2009 Xeon 4208 X16 192G 46T Hive02 10.86.102.102 Centos 7.9.2009 Xeon 4208 X16 192G 46T Hive03 10.86.102.105 Centos 7.9.2009 Xeon 8260 X48 256G         11T 最终组成的是一个双副本56T的集群,设置YARN内存共400GB(可调) 3台服务

    2024年02月07日
    浏览(56)
  • Android网络编程,调用API获取网络数据

    实现步骤: 阅读API接口使用文档 使用okhttp 获取网络数据 使用 gson将json数据转为数据实体类 安装GsonFormatPlus插件 使用glide加载网络图片 build.gradle下导入相关依赖 AndroidManifest.xml 加入网络权限和 application节点下设置 注意事项:在手机高版本中,需要在application节点下设置 and

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包