如何使用Ambari服务在所有hadoop节点上部署一个jar?

How to use Ambari service to deploy a jar on all hadoop nodes?

我有一个要求,我想使用 Ambari 服务器在所有 hadoop 集群节点的特定位置部署一个 jar 文件。为此,我想我可以使用服务功能。 所以我创建了一个示例服务,可以将其部署为所有节点上的客户端或从属。 我在 /var/lib/ambari-server/resources/stacks/HDP/2.2/services/ 中添加了一个新文件夹作为 Testservice,它具有以下 files/directories

[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]#

有了这个我的服务被添加并安装在所有节点上。在每个节点上,都会创建一个相应的目录“/var/lib/ambari-agent/cache/stacks/HDP/2.2/services/Testservice”,其文件结构与上述相同。截至目前 test_client.py 脚本根本没有代码。只是安装、配置功能的虚拟实现。

所以我想在这里添加代码,这样 package/files/test1.jar 从每个主机到定义的目标位置说“/lib 文件夹。 在这一点上我需要帮助。我如何使用 test_client.py 脚本?我如何编写通用代码来复制我的 jar 文件。

test_client.py安装方法如下

class TestClient(Script):
def install(self, env):

需要更多详细信息,了解如何使用 env 变量获取 ambari 服务目录和 hadoop 安装基本路径所需的所有基本路径。

您认为可以使用自定义 Ambari 服务来确保文件存在于集群中的各个节点上是正确的。您的自定义服务应该有一个 CLIENT 组件,用于处理在集群中的不同主机上放置您需要的文件。它应该是一个客户端组件,因为它没有 运行 个进程。

但是,使用文件夹并不是分发您拥有的文件的正确方法 (test1.jar)。所有 Ambari 服务都依赖 linux 包在系统上安装必要的文件。所以你应该做的是创建一个软件包,负责将 lib 文件放置到磁盘上的正确位置。这可能是一个 rpm and/or 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) 调用将确保在安装自定义服务客户端组件时安装您在 metainfo.xml 文件中列出的软件包。

注意:您的软件包(rpm、deb 等)必须托管在在线存储库中,以便 Ambari 访问并安装它。您可以使用 httpd 和 createrepo 在节点 运行 Ambari Server 上创建本地存储库。这个过程可以从 HDP Documentation.

中收集到

替代方法(不推荐)

现在我已经解释了 应该 完成的方式。让我告诉您如何使用 package/files 文件夹实现此目的。同样,这不是在 linux 系统上处理安装软件的推荐方法,您的发行版的包管理系统应该处理这个问题。

test-client.py - 更新您的入门文件以包含以下内容。对于此示例,我们将使用文件权限 0664、'guest' 的所有者和组 'hadoop':

将您的 test1.jar 复制到 /lib 文件夹
 def configure(self,env):
   File("/lib/test1.jar",
    mode=0644,
    group="hadoop",
    owner="guest",
    content=StaticFile("test1.jar")
    )

为什么不推荐这种方法?不推荐这种方法,因为在 linux 发行版上安装软件应该进行管理,以便于升级和删除说软件。就其服务而言,Ambari 没有完整的卸载功能。您最多可以做的是从您的 ambari 集群中删除一个服务,在这样做之后所有这些文件将保留在系统上并且必须通过编写自定义脚本或手动删除。但是,如果您使用包管理来处理安装文件,您可以使用相同的包管理系统轻松删除软件。