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

时间:2016-01-06 13:52:10

标签: hortonworks-data-platform ambari

我有一个要求,我想使用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安装基本路径所需的所有基本路径。

1 个答案:

答案 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集群中管理的服务,这样,所有这些文件将保留在系统上,并且必须通过编写自定义脚本或手动执行来删除。但是,如果您使用包管理来处理安装文件,则可以使用相同的包管理系统轻松删除软件。