暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Ambari3.0实现组件自定义操作命令、支持API传参调用特性的源码适配实践总结

大数据从业者 2025-07-18
190

前言

Ambari项目广泛应用于大数据集群管理场景,二次开发需求也很常见。本文主要记录如何实现组件(ZooKeeper为例)新增一个自定义操作命令,同时支持通过AmbariAPI传入自定义参数调用该操作命令的功能特性源码适配实践总结。Ambari3.0编译部署入门参考:大数据管理平台Ambari3.0最新版本二次开发入门实践指南文章首发微信公众号:大数据从业者,其它均为转载,原创不易,欢迎您点赞关注推荐转发,感谢!

特性概述

Ambari默认为每个组件提供的基本操作命令集包括但不限于:StartStopRestartDelete等等,如图所示:

然而根据组件特点,通常需要更丰富的自定义操作命令,比如:数据均衡、数据迁移等等。基于Ambari封装开发自研集群管理平台时,ambari原生界面不对外使用,所以通过api触发操作命令应用更加广泛,比如重启指定主机节点(felixzh)的指定服务(KAFKA)的指定组件(KAFKA_BROKER),原生实现用法如图所示:

然而特定场景下通过api传入自定义参数调用上述自定义操作命令也必不可少,比如:特定主机执行特定命令等等。

实现思路

本文以ZooKeeper服务ZOOKEEPER_SERVER组件新增一个操作命令FELIXZH_TEST为例进行实现。自定义操作命令相对简单,具体过程如下:

步骤1:更新metainfo.xml文件

ZOOKEEPER_SERVER增加customCommands节点,文件路径如下:

    /var/lib/ambari-server/resources/stacks/BIGTOP/3.3.0/services/ZOOKEEPER/metainfo.xml

    完整修改内容如图所示:

    步骤2:更新zookeeper_server.py文件

    ZookeeperServerLinux类增加自定义操作命令的方法,注意方法名必须小写,文件路径如下:

      /var/lib/ambari-server/resources/stacks/BIGTOP/3.3.0/services/ZOOKEEPER/package/scripts/zookeeper_server.py

      完整修改内容如图所示:

      而通过api传入自定义参数调用上述自定义操作命令,实现分析如下:

      方式一:增加输入参数资源类型

      参考上文原生实现用法,尝试通过增加输入参数,遇到不支持的资源类型异常:not supported for the resource type Request,如图所示:

      根据上述日志查看源码Resource类发现资源类型都是预置的,比如:ClusterServiceHostComponect等等,对应源码如图所示:

      自行新增资源类型,评估改动有点大,不太划算,暂且搁置!

      方式二:套用context传递参数

      参考上文原生实现用法,context其实就是个自定义的字符串,所以考虑将输入参数添加到context,传递给ambari-agent执行自定义操作命令FELIXZH_TEST方法时使用,如图所示:

      可以看到context支持传递自定义参数,但是原生实现并没有将context内容传递到自定义操作命令的方法内。源码梳理:/requests接口对应于控制类AmbariManagementController,实现类为AmbariManagementControllerImpl类的createAction方法,如图:

      继续调用requestStageContainer.persist()方法,actionManager.sendActions方法,最终先写数据库、再唤醒ActionScheduler线程开始处理,如图所示:

      继续跟踪ActionScheduler线程doWork方法发现,processHostRole方法增加下如下代码即可实现context继续传递到ambari-agent,如图:

      当然,可以传递任意你需要的key和对应的value,只要自定义命令的方法使用相同的key获取即可。源码修改见github:

        https://github.com/felixzh2020/ambari/commits/felixzh-release-3.0.0/

        效果验证

        自定义操作命令FELIXZH_TEST按钮如图所示:

        点击FELIXZH_TEST按钮,执行命令结果如图所示:

        通过AmbariAPI执行FELIXZH_TEST命令,方法如图所示:

        通过AmbariAPI执行FELIXZH_TEST命令,结果如图所示:

        综上,可以看到API的传递参数已经成功到达felixzh_test方法内!大家有更好的方法欢迎交流!

        写在最后

        文章首发微信公众号:大数据从业者,其它均为转载,原创不易,欢迎您点赞关注推荐转发,感谢!致力于构建高质量技术交流群,欢迎点击关于作者添加个人微信进群!


        文章转载自大数据从业者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论