Ambari 自定义服务(Custom Service)

引言

Ambari 是一个不错的大数据集群管理平台。不过,有时修我们希望使用一些非 Ambari 支持的工具,管理起来便没那么方便了。
不过,Ambari 提供了一个自定义服务的方法,我们只需要把使用的工具做个简单封装就可以轻松的实现在 Ambari 上管理了。
本文我们以 Kafka Manager 为例,介绍如何制作一个自定义服务(Custom Service).

目录结构

    KAFKA_MANAGER
    ├── configuration
    │   ├── kafka-consumer.xml
    │   ├── kafka-manager-env.xml
    │   └── kafka-manager.xml
    ├── metainfo.xml
    ├── package
    │   ├── files
    │   │   └── kafka-manager-1.3.3.23.tgz
    │   └── scripts
    │       ├── kafka_manager.py
    │       └── params.py
    ├── quicklinks
    │   └── quicklinks.json
    └── service_advisor.py

编辑 metainfo.xml

metainfo.xml 文件指定的此服务的一些基本信息,具体如下文件中的说明。

<metainfo>
    <!-- 默认即可 -->
    <schemaVersion>2.0</schemaVersion>
    <!-- 定义服务 -->
    <services>
        <service>
            <!-- Ambari 识别的服务名称 -->
            <name>KAFKA_MANAGER</name>
            <!-- 展示时的名称 -->
            <displayName>Kafka Manager</displayName>
            <!-- 服务说明 -->
            <comment>Cluster Manager for Apache Kafka, a tool for managing Apache Kafka clusters.</comment>
            <!-- 服务的版本号 -->
            <version>1.3.3.23</version>
            <!-- 一个服务可能含有多个子组件 -->
            <components>
                <component>
                    <!-- 组件名 -->
                    <name>KAFKA_MANAGER</name>
                    <displayName>Kafka Manager</displayName>
                    <!-- 组件类型,有 MASTER/SLAVE/CLIENT 可选,其中 MASTER 和 SLAVE 是有状态的(启动和停止),CLIENT 是无状态的 -->
                    <category>MASTER</category>
                    <!-- 定义组件分布规则,可以支持如下格式。1:一个实例。1-2:1个至2个实例。1+:1个或多个实例-->
                    <cardinality>1</cardinality>
                    <versionAdvertised>true</versionAdvertised>
                    <!-- 组件的控制脚本配置 -->
                    <commandScript>
                        <!-- 组件控制脚本的相对路径 -->
                        <script>scripts/kafka_manager.py</script>
                        <!-- 脚本类型 -->
                        <scriptType>PYTHON</scriptType>
                        <!-- 脚本执行的超时时长 -->
                        <timeout>1200</timeout>
                    </commandScript>
                </component>
            </components>
            <!-- 依赖的服务 -->
            <requiredServices>
                <service>KAFKA</service>
            </requiredServices>
            <!-- 定义配置文件,定义的配置文件在 configuration 目录下,xml 格式-->
            <configuration-dependencies>
                <config-type>kafka-manager</config-type>
                <config-type>kafka-manager-env</config-type>
                <config-type>kafka-consumer</config-type>
                <config-type>kafka-logback</config-type>
                <config-type>kafka-logger</config-type>
                <config-type>routes</config-type>
            </configuration-dependencies>
            <!-- 定义快捷链接 -->
            <quickLinksConfigurations>
                <quickLinksConfiguration>
                    <!-- 指定快捷链接的文件 -->
                    <fileName>quicklinks.json</fileName>
                    <default>true</default>
                </quickLinksConfiguration>
            </quickLinksConfigurations>
            <!-- 修改配置文件后是否需要重启 -->
            <restartRequiredAfterChange>true</restartRequiredAfterChange>
        </service>
    </services>
</metainfo>

增加 configuration 配置文件

这里以 kafka-manager-env.xml 文件为例,此文件指定的是一些环境相关的配置,具体配置就不介绍了,不同的服务配置都是不一样的。

<configuration supports_adding_forbidden="true">
    <property>
        <!-- 定义服务的所属用户 -->
        <name>cmak_user</name>
        <display-name>CMAK User</display-name>
        <value>cmak</value>
        <property-type>USER</property-type>
        <description/>
        <value-attributes>
            <type>user</type>
            <overridable>false</overridable>
            <user-groups>
                <property>
                    <type>cluster-env</type>
                    <name>user_group</name>
                </property>
            </user-groups>
        </value-attributes>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>port</name>
        <description>Kafka manager server port</description>
        <value>8086</value>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>kafka_keytab</name>
        <description>Kafka keytab path</description>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>kafka_principal_name</name>
        <description>Kafka principal name</description>
        <property-type>KERBEROS_PRINCIPAL</property-type>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>cmak_log_dir</name>
        <display-name>CMAK Log directory</display-name>
        <value>/var/log/cmak</value>
        <description/>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>cmak_pid_dir</name>
        <value>/var/run/cmak</value>
        <display-name>CMAK PID dir</display-name>
        <description/>
        <value-attributes>
            <type>directory</type>
            <editable-only-at-install>true</editable-only-at-install>
            <overridable>false</overridable>
        </value-attributes>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>cmak_user_nofile_limit</name>
        <value>128000</value>
        <description>Max open files limit setting for CMAK user.</description>
        <on-ambari-upgrade add="true"/>
    </property>
    <property>
        <name>cmak_user_nproc_limit</name>
        <value>65536</value>
        <description>Max number of processes limit setting for CNAK user.</description>
        <on-ambari-upgrade add="true"/>
    </property>
    <!-- kafka-env.sh -->
    <property>
        <name>is_supported_cmak_ranger</name>
        <value>false</value>
        <on-ambari-upgrade add="true"/>
    </property>
</configuration>

脚本

params.py 脚本主要用户获取 configuration 目录的配置,或者 Ambari 其它组件的配置

# 获取服务所有配置项
config = Script.get_config()
# 获取具体的配置项
user_group = config['configurations']['cluster-env']['user_group']

kafka-manager.py 脚本包含服务的安装及基本操作

  # 安装服务时执行函数
  def install(self, env):
    ......
  # 停止服务时执行的函数
  def stop(self, env):
    ......

  # 启动服务时执行的函数
  def start(self, env):
    ......

  # 检查服务状态时执行的函数
  def status(self, env):
    ......

自动填充相关配置

service_advisor.py 提供了自动填充相关参数的功能。在配合中,因为 kafka manager 依赖 zookeeper 服务,那么能不能自动获取 zookeeper 的连接信息并填充到相关的配置跑去云呢?
通过这个脚本就可以实现。具体直接看脚本吧,这里就展开说明了。

项目下载地址

GitHub: Kafka Manager for Ambari

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇