TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)
  • 方法论

  • 代码生命周期-metainfo

    • 加载原理深度剖析[一]
    • 加载原理深度剖析[二]
    • 加载原理深度剖析[三]
    • 结构与层级深入解读
    • configFile详解[一]
    • configFile详解[二]
    • cardinality详解[一]
    • cardinality详解[二]
    • cardinality详解[三]
    • category详解[一]
    • category详解[二]
    • category详解[三]
    • theme详解[一]
    • theme详解[二]
    • theme详解[三]
    • commandScript详解[二]
    • commandScript详解[一]
    • commandScript详解[三]
    • customCommand详解[一]
    • customCommand详解[二]
    • customCommand详解[三]
      • 4. 最佳实践与技巧 💡
        • 4.1 官方扩展能力的设计初衷
        • 4.2 自定义组件的最佳实践与落地步骤
        • 4.2.1 定义 Ajax 请求
        • 4.2.2 定义前端 Action 函数
        • 4.2.3 在 Host Component Action Map 中注册命令
        • 4.2.4 在模板文件中渲染按钮
      • 5. 总结与延伸学习 🚀
        • 5.1 内容回顾
    • requiredServices详解[一]
    • requiredServices详解[二]
    • osSpecifics详解[一]
    • osSpecifics详解[二]
    • osSpecifics详解[三]
    • quicklinks详解[一]
    • quicklinks详解[二]
    • quicklinks详解[三]
    • quicklinks详解[四]
  • 架构剖析

  • UI样式

  • GOD-Ambari
  • 代码生命周期-metainfo
JaneTTR
2025-06-02
目录

customCommand详解[三]

# 4. 最佳实践与技巧 💡

# 4.1 官方扩展能力的设计初衷

作为大数据集群运维的中枢平台,Ambari 的设计目标一直是简化管理、增强灵活性。但随着业务需求的个性化和大规模集群的复杂化,官方很早就意识到标准命令并不能满足所有场景,这就是自定义命令扩展机制出现的初衷。

官方设计自定义命令的三大动因:

  1. 灵活扩展 不同企业、不同项目对运维命令的诉求不一。通过开放自定义命令,用户可以按需扩展 Ambari 默认功能,如实现 YARN 队列热刷新、定制化健康检查等。
  2. 自动化脚本化 批量、复杂的集群操作往往繁琐易错。自定义命令让脚本自动化管理流程成为可能,极大减少人工干预,降低误操作概率。
  3. 高度可扩展 随着大数据组件生态扩展和企业级需求升级,用户可无缝集成自有工具或特殊操作流程,充分发挥 Ambari 的集成中台能力。

# 4.2 自定义组件的最佳实践与落地步骤

下面整理一套适用于实际开发和二次集成的自定义命令全链路实践步骤。每一步都兼顾了“官方推荐写法”与“个性化自定义”两种范式。

# 4.2.1 定义 Ajax 请求

实现自定义命令操作的第一步,就是在 app/utils/ajax/ajax.js 中声明与后端 REST API 对应的请求配置,确保前端可用通用方法封装不同业务场景。

image-20241007192714657

官方标准定义:

'service.item.refreshQueueYarnRequest': {
  'real': '/clusters/{clusterName}/requests', // REST API 路径
  'mock': '',
  'format': function (data) {
    return {
      type: 'POST',
      data: JSON.stringify({
        RequestInfo: {
          'context': data.context,
          'command': data.command,
          'parameters/forceRefreshConfigTags': data.forceRefreshConfigTags
        },
        "Requests/resource_filters": [{
          "service_name": data.serviceName,
          "component_name": data.componentName,
          'hosts': data.hosts
        }]
      })
    };
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

自定义范例:

'service.item.customActionRequest': {
  'real': '/clusters/{clusterName}/requests',
  'mock': '',
  'format': function (data) {
    return {
      type: 'POST',
      data: JSON.stringify({
        RequestInfo: {
          'context': data.context,
          'command': data.command,
          'parameters/customParam': data.customParam
        },
        "Requests/resource_filters": [{
          "service_name": data.serviceName,
          "component_name": data.componentName,
          'hosts': data.hosts
        }]
      })
    };
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 4.2.2 定义前端 Action 函数

第二步,在控制器(如 app/controllers/main/service/item.js)中实现具体的 Action 响应函数,将页面交互和后台命令调用打通。

image-20241007192612026

官方实现示例:

refreshYarnQueues: function () {
  return App.showConfirmationPopup(() => {
    App.ajax.send({
      name: 'service.item.refreshQueueYarnRequest',
      sender: this,
      data: {
        command: "REFRESHQUEUES",
        context: Em.I18n.t('services.service.actions.run.yarnRefreshQueues.context'),
        hosts: App.MasterComponent.find('RESOURCEMANAGER').get('hostNames').join(','),
        serviceName: "YARN",
        componentName: "RESOURCEMANAGER",
        forceRefreshConfigTags: "capacity-scheduler"
      },
      success: 'refreshYarnQueuesSuccessCallback',
      error: 'refreshYarnQueuesErrorCallback',
      showLoadingPopup: true
    });
  });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

自定义命令写法:

triggerCustomAction: function () {
  return App.showConfirmationPopup(() => {
    App.ajax.send({
      name: 'service.item.customActionRequest',
      sender: this,
      data: {
        command: "MY_CUSTOM_COMMAND",
        context: "执行自定义命令",
        hosts: "customHost1,customHost2",
        serviceName: "MY_SERVICE",
        componentName: "MY_COMPONENT",
        customParam: "someValue"
      },
      success: 'customActionSuccessCallback',
      error: 'customActionErrorCallback',
      showLoadingPopup: true
    });
  });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 4.2.3 在 Host Component Action Map 中注册命令

第三步,需将自定义命令注册到 app/models/host_component.js 的 ActionMap 内,实现菜单与功能的动态映射。

image-20241007192524142

官方示例:

REFRESHQUEUES: {
  action: 'refreshYarnQueues',
  customCommand: 'REFRESHQUEUES',
  context: Em.I18n.t('services.service.actions.run.yarnRefreshQueues.context'),
  label: Em.I18n.t('services.service.actions.run.yarnRefreshQueues.menu'),
  cssClass: 'glyphicon glyphicon-refresh',
  disabled: false
}
1
2
3
4
5
6
7
8

自定义扩展写法:

MY_CUSTOM_COMMAND: {
  action: 'triggerCustomAction',
  customCommand: 'MY_CUSTOM_COMMAND',
  context: "执行自定义操作",
  label: "执行自定义操作",
  cssClass: 'glyphicon glyphicon-cog',
  disabled: false
}
1
2
3
4
5
6
7
8

你可自定义 context、label、cssClass 实现多语言和专属风格,提升用户体验。

# 4.2.4 在模板文件中渲染按钮

最后一步,在视图层(如 app/views/main/service/item.js 或相关 Handlebars 模板)插入渲染逻辑,让自定义命令以按钮形式出现在 UI 操作栏。

image-20241007192427198

官方写法:

if (this.get('serviceName') === 'YARN' && this.get('hasMasterOrSlaveComponent')) {
  options.push(actionMap.REFRESHQUEUES);
}
1
2
3

自定义写法:

if (this.get('serviceName') === 'MY_SERVICE' && this.get('hasMasterOrSlaveComponent')) {
  options.push(actionMap.MY_CUSTOM_COMMAND);
}
1
2
3

# 5. 总结与延伸学习 🚀

# 5.1 内容回顾

本文系统梳理了 Ambari 自定义命令的设计理念、落地流程与最佳实践,结合官方与自定义两类写法,全链路展示了“配置—注册—渲染—交互”闭环。

建议结合实际业务,定制高频运维动作为自定义命令,结合脚本化和自动化体系,实现真正的“无人值守”大数据集群管理。

#metainfo.xml#commandScript#Ambari#前端开发#自动化运维#实践技巧
customCommand详解[二]
requiredServices详解[一]

← customCommand详解[二] requiredServices详解[一]→

最近更新
01
Pandoc 缺失导致 SparkR 构建失败
06-08
02
Cyrus SASL/GSASL 缺失解决
06-07
03
Hadoop_3.3.4 编译实战 1.0.0+
06-06
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式