【问题标题】:How to use Ambari service to deploy a jar on all hadoop nodes?如何使用 Ambari 服务在所有 hadoop 节点上部署 jar?
【发布时间】:2016-01-06 13:52:10
【问题描述】:

我有一个要求,我想使用 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]#

有了这个我的服务被添加并安装在所有节点上。在每个节点上,使用与上述相同的文件结构创建相应的目录“/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 安装基本路径所需的所有基本路径。

【问题讨论】:

    标签: hortonworks-data-platform ambari


    【解决方案1】:

    您认为可以使用自定义 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,拥有“guest”,组为“hadoop”:

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

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

    【讨论】:

    • 你能不能,理论上,打包一个存档,使用 install 方法调用 Execute() 并提取和复制内容?反对这样做的理由是什么?
    • @JeroenVlek,我更新了我的答案以提供替代方案,并解释了为什么我的原始答案是最佳/行业标准方法。
    • @Jackson 我已经尝试过第二个选项,即使用文件功能,现在它对我有用。但是我不知道标准包装方法。所以感谢您分享这方面的详细信息。我也会尝试看看它是如何工作的。
    • 如果任一选项有效,请接受答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2018-06-29
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多