我有一个要求,我想使用Ambari服务器在所有hadoop集群节点上的特定位置部署jar文件。为此,我想我可以使用服务功能。 所以我创建了一个示例服务,可以在所有节点上将其部署为客户端或从服务器。 我在/var/lib/ambari-server/resources/stacks/HDP/2.2/services/中添加了一个新文件夹作为Testservice,它有以下文件/目录
[machine]# cd /var/lib/ambari-server/resources/stacks/HDP/2.2/services/Testservice^C
[machine]#
[machine]# pwd
/var/lib/ambari-server/resources/stacks/HDP/2.2/services/Testservice
[machine]# ls
configuration metainfo.xml package
[machine]# ls package/*
package/archive.zip
package/files:
filesmaster.py test1.jar
package/scripts:
test_client.py
[machine]#
使用此功能,我的服务将添加并安装在所有节点上。在每个节点上,各自的目录&#34; /var/lib/ambari-agent/cache/stacks/HDP/2.2/services/Testservice"使用与上面提到的相同的文件结构创建。截至目前,test_client.py脚本根本没有代码。只需虚拟实现安装,配置功能。</ p>
所以在这里我想添加代码,使得每个主机的package / files / test1.jar到定义的目标位置说&#34; / lib文件夹。 我在这一点上需要帮助。我怎样才能使用test_client.py脚本?我如何编写通用代码来复制我的jar文件。
test_client.py的安装方法如下所示
class TestClient(Script):
def install(self, env):
需要更多详细信息如何使用env变量来获取ambari服务目录和hadoop安装基本路径所需的所有基本路径。
答案 0 :(得分:2)
您认为可以使用自定义Ambari服务来确保群集中的各个节点上存在文件,这是正确的。您的自定义服务应该有一个CLIENT组件,用于处理在群集中的各种主机上放置所需的文件。它应该是一个客户端组件,因为它没有正在运行的进程。
但是,使用files文件夹不是分发您拥有的文件(test1.jar)的正确方法。所有Ambari服务都依赖于Linux软件包来在系统上安装必要的文件。所以你应该做的是创建一个软件包,负责将lib文件放到磁盘上的正确位置。这可能是rpm和/或deb文件,具体取决于您计划支持的操作系统。获得软件包后,您可以通过修改上面已经概述的两个文件来实现目标。
metainfo.xml - 您将列出服务正常运行所需的必要软件包。例如,如果您计划支持RHEL6和RHEL7,则应创建名为my_package_name的rpm包,并将其包含在此代码中:
<osSpecifics>
<osSpecific>
<osFamily>redhat6,redhat7</osFamily>
<packages>
<package>
<name>my_package_name</name>
</package>
</packages>
</osSpecific>
</osSpecifics>
test-client.py - 您需要将问题中的初始代码替换为:
class TestClient(Script):
def install(self, env):
self.install_packages(env)
self.install_packages(env)调用将确保在安装自定义服务CLIENT组件时安装metainfo.xml文件中列出的软件包。
注意:您的软件包(rpm,deb等)必须托管在在线存储库中,以便Ambari访问并安装它。您可以使用httpd和createrepo在运行Ambari Server的节点上创建本地存储库。可以从HDP Documentation收集此过程。
替代方法(不推荐)
现在我已经解释了应该的方式。让我告诉您如何使用package / files文件夹实现此目的。同样,这不是处理在Linux系统上安装软件的推荐方法,您的发行版的软件包管理系统应该处理这个问题。
test-client.py - 更新您的初始文件以包含以下内容。对于此示例,我们将test1.jar复制到/ lib文件夹,其文件权限为0664,来自&#39; guest&#39;以及group&#39; hadoop&#39;:
def configure(self,env):
File("/lib/test1.jar",
mode=0644,
group="hadoop",
owner="guest",
content=StaticFile("test1.jar")
)
为什么不推荐这种方法?不建议这样做,因为应该管理在Linux发行版上安装软件,这样可以轻松升级和删除所述软件。 Ambari在其服务方面没有完整的卸载功能。您可以做的最多就是删除在ambari集群中管理的服务,这样,所有这些文件将保留在系统上,并且必须通过编写自定义脚本或手动执行来删除。但是,如果您使用包管理来处理安装文件,则可以使用相同的包管理系统轻松删除软件。