每个stack版本都应该提供metainfo.xml文件,无论是否从其他stack集成。
<metainfo>
<versions>
<active>true</active>
</versions>
<extends>2.4</extends>
<minJdk>1.7</minJdk>
<maxJdk>1.8</maxJdk>
</metainfo>
通过stack继承,继承的文件,不同的文件继承类型不同。
1.
properties/stack_features.json
properties/stack_tools.json
这两个文件在子stack中也不应该再进行定义。所以这里用的是2.0.6的properties。
2.
kerberos.json
widgets.json
这两个文件如果子stack定义了,则覆盖父stack的定义。
2.6的stack没有覆盖,所以使用的也是2.0.6的kerberos和widgets定义。
3.
configuration/cluster-env.xml
role_command_order.json
这两个文件如果子stack定义了,会合并父stack的定义。其中role_command_order还会合并所有service层面的文件。
4.
metainfo.xml中定义的项会覆盖父stack定义的项。
5.
hooks目录
子stack会覆盖父stack的定义,如果希望保持父stack的文件,需要将其拷贝到子stack目录。
6.
repos
upgrades
这两个目录不会继承。
7.
service目录
这个目录有点特殊,有两种继承机制。
第一种是stack_advisor.py会自动继承父stack的脚本;但是剩下的行为由脚本的作者决定。
例如:
class HDP23StackAdvisor(HDP22StackAdvisor):
def __init__(self):
super(HDP23StackAdvisor, self).__init__()
Logger.initialize_logger()
def getComponentLayoutValidations(self, services, hosts):
parentItems = super(HDP23StackAdvisor, self).getComponentLayoutValidations(services, hosts)
...
第二种是service目录的继承机制由service继承决定。默认的如果一个服务没有通过extends声明明确的继承,则服务会从父stack继承。