了解集成原理

在部署 HDP 集群时,在界面上,会有选择 HDP stack 的版本, 如 : 2.0、2.6、3.0、 3.1 … , 每一个 stack 版本在ambari 节点上都有对应的目录,里面存放着 hdp 各服务,像 hdfs、yarn、 mapreduce、 spark、hbase 这些,stack 版本高的, 服务相对多些。 stack 版本目录具体在 ambari-server 节点的 /var/lib/ambari/server/resources/stacks/HDP 下,用 python 开发的自定义服务脚本就会放到这个目录下

image.png

将自定义服务放到指定目录下,只需重启 ambari server 就能在添加服务界面加载出来的自定义服务,ambari 在安装自定义服务的过程中,会将 python 开发的自定义服务脚本分发到 agent 节点上,由 agent 节点的自定义服务脚本来执行安装、部署步骤

等通过 Ambari 安装自定义服务之后,Ambari 会在数据库(如 : MySQL ) 相关表里将自定义服务相关信息进行保存,和记录其它 HDP 服务一样的逻辑

一个自定义服务暂定义为一个项目,项目名称须为大写,使用 Python 编写
该项目框架有些必不可少的文件或目录 :

  • metainfo.xml 文件 : 描述了对整个项目的约束配置,是一个核心文件
  • configuration 目录 : 里面放置一个或多个 xml 文件,用于将该服务的配置信息展示在前端页面,也可以在 ambari 页面上对服务的一些配置做更改
  • package 目录 : 里面包含 scripts 文件夹,该目录下存放着 python 文件,用于对服务的安装、配置、启动、停止等操作。自定义服务 python 脚本依赖的模块是 resource_management
  • alerts.json 文件 : 描述 ambari 对服务的告警设置。告警类型 : WEB、Port、Metric、Aggregate、Script
  • quicklinks.json 文件 : 用于生成快速链接,实现 url 的跳转 , 可支持多个 url 展示
  • role_command_order.json文件 : 决定各个服务组件之间的启动顺序

如 : Kylin 自定义服务
image.png

image.png

Configuration 下 Xml 解析

官网文档 : https://cwiki.apache.org/confluence/display/AMBARI/Configuration+support+in+Ambari

property

Java 的 property 结构体 : ambari-server/src/main/java/org/apache/ambari/server/state/PropertyInfo.java

Configuration 下包含 n 个 xml 配置文件 , 每一个 xml 配置文件都代表了一个配置组 , 每个 xml 文件中规定了 service 配置项的名称,value 类型和描述

<configuration supports_final="false" supports_adding_forbidden="true">
  <property>
      <!-- 配置项名称 必须-->
      <name>dfs.https.port</name>
      <!-- 配置的默认值 必须-->
      <value>50470</value>
      <!-- 配置的描述,即鼠标移动到文本框弹出的提示 必须 -->
      <description>https 端口</description>
      <!-- UI显示名称 可选-->
      <display-name>https 端口</display-name>
      <!-- 磁盘文件的名称 可选-->
      <filename>hdfs-site.xml</filename>

      <!-- 删除 property 可选-->
      <deleted>false</deleted>
      <!--property 是否允许空 默认:false 可选-->
      <require-input>true</require-input>
      <!-- 配置更改是否需要重新启动 , 
        默认: add="false" delete="false" update="false" 
      可选-->
      <on-ambari-upgrade add="true"/>
      <!-- stack修改是否重启 merge="true" 可选-->
      <on-stack-upgrade merge="true"/>
      <!--property 类型, 
      PASSWORD, USER, UID, GROUP, GID, TEXT, 
      ADDITIONAL_USER_PROPERTY, NOT_MANAGED_HDFS_PATH, 
      VALUE_FROM_PROPERTY_FILE, KERBEROS_PRINCIPAL
      默认: TEXT 可选-->
      <property-type></property-type>

      <!-- property 属性集 可选-->
      <value-attributes>
        <!-- ........... -->
      </value-attributes>
    
      <!-- 在堆栈推荐属性 可选-->
      <depends-on>
        <property>
          <type>zoo.cfg</type>
          <name>clientPort</name>
        </property>
      </depends-on>
    
      <!-- 依赖值 可选 -->
      <property-depended-by>
        <dependedByProperties>
          <name>hive.exec.orc.encoding.strategy</name>
          <type>hive-site</type>
        </dependedByProperties>
      </property-depended-by>
      <!-- 可选-->
      <used-by></used-by>
  </property>
  
</configuration>

property/value-attributes

<!-- 这里规定了属性值的类型为int,最小值为0,最大值为48000 -->
<value-attributes>
  <!-- 值类型
    boolean/ int/ float/ directory/ directories/ content/
    value-list/ user/ password -->
  <type>int</type>

  <!--是否可复写 true/ false -->
  <overridable>true</overridable>
  <!-- 空值是否有效 true/ false -->
  <empty-value-valid>true</empty-value-valid>
  <!-- property是否 ui true/ false -->
  <ui-only-property>true</ui-only-property>
  <!-- 不可编辑 true / false -->
  <read-only>true</read-only>
  <!--值是否在安装时可编辑 true/ false -->
  <editable-only-at-install></editable-only-at-install>
  <!-- property 显示值 true/ false -->
  <show-property-name></show-property-name>
  <!-- 步长 -->
  <increment-step>100</increment-step>
  <!-- 可选值 -->
  <selection-cardinality>2+</selection-cardinality>
  <!-- property 文件名 -->
  <property-file-name></property-file-name>
  <!-- property文件类型 -->
  <property-file-type></property-file-type>
  <!-- 条目 -->
  <entries>
    <entry>
      <value>2</value>
    </entry>
    <!-- ... -->
  </entries>
  <!-- 隐藏 -->
  <hidden></hidden>
  <!--条目是否可编辑 true/ false -->
  <entries-editable></entries-editable>
  <!-- 用户组 -->
  <user-groups></user-groups>
  <!-- 密钥库是否启用 true/ false -->
  <keystore></keystore>
  <!-- 最小值 -->
  <minimum>0</minimum>
  <!-- 最大值 -->
  <maximum>48000</maximum>
  <!-- 值单位 B/ MB/ ms/ Bytes/ milliseconds -->
  <unit></unit>
  <!--可见  -->
  <visible></visible>
  <!-- 复制 -->
  <copy></copy>
</value-attributes>

读取配置项的值

在控制脚本中读取用户在页面填写的 instance_name 配置项的值
配置项的配置文件为: configuration/sample.xml

resource_management

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>instance_name</name>
    <value>instance1</value>
    <description>Instance name for samplesrv</description>
  </property>
</configuration>

Python 脚本中的读取方法为:params.py

script : ambari-2.7.6\ambari-common\src\main\python\resource_management\libraries\script\script.py

from resource_management.libraries.script.script import Script

config = Script.get_config()

# config被封装为了字典格式,层级 : configurations/文件名/属性名
instance_name = config['configurations']['sample']['instance_name']
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐