2016-01-06 61 views
2

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

[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脚本根本没有代码。只是虚拟执行安装,配置功能。

所以在这里我要添加代码,这样从每个主机到规定的目标位置包/文件/ test1.jar说“/ lib文件夹。 我需要在这一点上有所帮助。我怎么能利用test_client.py剧本?我怎么能写通用代码复制我的jar文件。

test_client.py具有如下图所示安装方法

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

需要更多细节变量如何ENV可以用来获得所有必要的基础路径, ambari服务目录和hadoop安装基本路径。

回答

2

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

但是,使用files文件夹不是正确的方法来分发您拥有的文件(test1.jar)。所有的Ambari服务都依赖于Linux软件包来在系统上安装必要的文件。所以你应该做的是创建一个软件包,负责将该lib文件放置到磁盘上的正确位置。这可能是一个rpm和/或deb文件,具体取决于您计划支持的操作系统。一旦你有了软件包,你可以通过修改上面已经列出的两个文件来实现你的目标。

metainfo.xml - 您将列出所需的软件包,以使您的服务正常运行。例如,如果你计划支持RHEL6和RHEL7你会与此代码创建一个rpm包名为my_package_name,包括它:

<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 - 更新您的入门文件以包含以下内容。在这个例子中,我们将您的test1.jar复制到/ lib文件夹与文件权限0664,“客人”,以及集团的Hadoop'的所有者:

def configure(self,env): 
    File("/lib/test1.jar", 
    mode=0644, 
    group="hadoop", 
    owner="guest", 
    content=StaticFile("test1.jar") 
    ) 

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

+0

理论上,您是否可以封装一个存档并使用install方法调用Execute()并提取并复制这些内容?什么是反对这样做的论据? –

+1

@JeroenVlek,我已经更新了我的答案以提供替代方案,并解释了为什么我的原始答案是最佳/行业标准方法。 – cjackson

+0

@杰克逊我已经尝试了第二种选择,即使用文件功能,现在它已经为我工作。但是我不知道标准的包装方法。所以谢谢你分享的细节。我也会试着看看它是如何工作的。 – DPM