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


    🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

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

    🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

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

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

    目录

    一、概述

    二、集群版本信息

    三、组件状态信息获取

    四、DataNode 启动

    五、Python 实现 Rest API获取组件状态并告警


    一、概述


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


    二、集群版本信息



    三、组件状态信息获取


    1. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGER
    2. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVE
    3. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVE
    4. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/TEZ
    5. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HBASE
    6. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS
    7. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/ZOOKEEPER
    • -u Ambari登录用户:密码
    • -i -H获取http请求的完整头部信息,包括请求方法、请求地址、请求头信息等
    • -X 同时想发 HEAD、GET 或 POST 请求,需在 -X 中声明要使用的请求方式

    获取hdp106服务器上NODEMANAGER 的状态信息

    1. [winner_spark@hdp105 root]$ curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGER
    2. HTTP/1.1 200 OK
    3. Date: Tue, 29 Aug 2023 06:15:38 GMT
    4. X-Frame-Options: DENY
    5. X-XSS-Protection: 1; mode=block
    6. X-Content-Type-Options: nosniff
    7. Cache-Control: no-store
    8. Pragma: no-cache
    9. Set-Cookie: AMBARISESSIONID=node0146ihmo69ytgk12k48wrpwrt0v5.node0;Path=/;HttpOnly
    10. Expires: Thu, 01 Jan 1970 00:00:00 GMT
    11. User: admin
    12. Content-Type: text/plain;charset=utf-8
    13. X-Content-Type-Options: nosniff
    14. Vary: Accept-Encoding, User-Agent
    15. Transfer-Encoding: chunked
    16. {
    17. "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGER",
    18. "HostRoles" : {
    19. "cluster_name" : "winner",
    20. "component_name" : "NODEMANAGER",
    21. "desired_admin_state" : "INSERVICE",
    22. "desired_repository_version" : "3.1.4.0-315",
    23. "desired_stack_id" : "HDP-3.1",
    24. "desired_state" : "STARTED",
    25. "display_name" : "NodeManager",
    26. "host_name" : "hdp106",
    27. "maintenance_state" : "OFF",
    28. "public_host_name" : "hdp106",
    29. "reload_configs" : false,
    30. "service_name" : "YARN",
    31. "stale_configs" : false,
    32. "state" : "STARTED",
    33. "upgrade_state" : "NONE",
    34. "version" : "3.1.4.0-315",
    35. "actual_configs" : { }
    36. },
    37. "host" : {
    38. "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106"
    39. },
    40. "component" : [
    41. {
    42. "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/services/YARN/components/NODEMANAGER",
    43. "ServiceComponentInfo" : {
    44. "cluster_name" : "winner",
    45. "component_name" : "NODEMANAGER",
    46. "service_name" : "YARN"
    47. }
    48. }
    49. ],
    50. "processes" : [ ]
    51. }

    四、DataNode 启动


    curl -u admin:admin -i -H  'X-Requested-By:ambari'  -X PUT -d  '{"RequestInfo":{"context":"Start DATANODE via REST"},"Body" : {"ServiceInfo" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS

    datanode 启动 返回 Accepted

    ambari 页面显示: Start DATANODE via REST 表示我们执行是成功的。


    五、Python 实现 Rest API获取组件状态并告警


    1. import time
    2. import requests
    3. import json
    4. """
    5. ~~~~~~~~~~~~
    6. author: kangll
    7. date: 2023/8/25 17:22
    8. desc: Ambari rest api 获取组件告警信息
    9. -- curl 请求,如下为测试链接
    10. curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/hosts/winner
    11. -- datanode 启动
    12. curl -u admin:admin -i -H 'X-Requested-By:ambari' -X PUT -d '{"RequestInfo":{"context":"Start RESOURCEMANAGER via REST"}
    13. ,"Body" : {"ServiceInfo" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS
    14. """
    15. __author__ = 'kanglilong'
    16. # Ambari rest api 访问地址
    17. control_url = "http://192.168.2.153:8080/api/v1/clusters/winner/hosts"
    18. # ambari web 登录账号
    19. AUTH = ("admin", "admin")
    20. headers = {'Content-Type': 'application/json;charset=utf-8'}
    21. # 钉钉URL
    22. api_url = "https://oapi.dingtalk.com/robot/send?access_token=f4e0f344306ce9b6eec60bec95d5aa7c57f4264a791458dc09121dd7e948ac64"
    23. hostname = "hdp105"
    24. ambari_server_ip = "192.168.2.153"
    25. def getComponentStatus(host, component):
    26. """
    27. 获取某个节点 组件的状态
    28. :param host: 主机名
    29. :param component: 组件
    30. :return: 状态
    31. """
    32. get_component_status_url = control_url + "/{}/host_components/{}".format(
    33. host, component)
    34. try:
    35. rep = requests.get(get_component_status_url, auth=AUTH)
    36. if rep.status_code == 200:
    37. jsonRep = json.loads(rep.text)
    38. status = jsonRep['HostRoles']['state']
    39. return status
    40. else:
    41. print("获取组件状态返回异常")
    42. except Exception as e:
    43. print(e)
    44. def getHostComponentsStatus(host):
    45. """
    46. 获取某个服务器上某个组件的状态信息
    47. :param host:
    48. :return: component_dict 组件与其状态
    49. status 当前节点状态是否符合期望,
    50. getStatus 是否获取到了状态
    51. """
    52. component_dict = {}
    53. get_host_components_status_url = control_url + "/{}/host_components".format(host)
    54. try:
    55. rep = requests.get(get_host_components_status_url, auth=AUTH)
    56. # 如果状态码是20x 则获取成功
    57. print(rep.status_code)
    58. if str(rep.status_code).startswith("20"):
    59. jsonrep = json.loads(rep.text)
    60. items = jsonrep['items']
    61. for itemJson in items:
    62. item = itemJson['HostRoles']['component_name']
    63. # 排除client 角色,与SQOOP等一直是启动状态的客户端,这些不需要启动,也不需要判断状态
    64. if "CLIENT" not in item and "SQOOP" not in item and "INFRA_SOLR" not in item:
    65. component_status = getComponentStatus(host, item)
    66. # INSTALLED 表示已安装没有启动,我们默认 INSTALLED 的组件没有 STARTED 就是 停止,要发告警信息
    67. if component_status == "INSTALLED":
    68. # {'DATANODE': 'STARTED', 'HBASE_REGIONSERVER': 'STARTED'}
    69. component_dict[item] = component_status
    70. else:
    71. # 没有正常获取到状态
    72. print("没有正常获取到状态")
    73. except Exception as e:
    74. print(e)
    75. return component_dict
    76. def msg(text, api_url):
    77. """
    78. :param text: 告警文本
    79. :param api_url: 钉钉URL
    80. :return:
    81. """
    82. json_text = {
    83. "msgtype": "text",
    84. "text": {
    85. "content": text
    86. }, "at": {
    87. "atMobiles": ["1786881xxxx"]
    88. }
    89. }
    90. requests.post(api_url, json.dumps(json_text), headers=headers).content
    91. component_dict = getHostComponentsStatus(hostname)
    92. for compo_dict in component_dict.items():
    93. compo_dict_len = int(len(component_dict))
    94. if compo_dict_len > 50: # 告警信息条数判断,告警信息太频繁钉钉告警可能会阻塞告警
    95. time.sleep(30)
    96. component_name = compo_dict[0]
    97. now_time = time.localtime(time.time())
    98. formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)
    99. text = "告警对象:IP:" + ambari_server_ip + ' 主机名:' + hostname + ' \n组件名称:' + component_name + " \n告警内容:HDP 集群组件 " + component_name + " 停止运行" + "\n告警时间:" + formatted_time
    100. time.sleep(2) # 告警匀速 发出
    101. msg(text, api_url)

    钉钉告警发送成功:

  • 相关阅读:
    分布式消息队列RocketMQ详细下载安装教程
    volatile如何保证可见性
    Java 的基本类型与引用类型的深拷贝和浅拷贝
    数据结构——堆
    java中@Repository注解的作用?
    Leetcode 【1488. 避免洪水泛滥】
    CSAPP-BombLab详解
    黑豹程序员-页面录音-在vue页面中进行录音wav/mp3
    HashMap与HashTable、HashSet的区别
    Springboot中使用Redis
  • 原文地址:https://blog.csdn.net/qq_35995514/article/details/132637138