Как использовать службу Ambari для развертывания jar-файла на всех узлах hadoop?

У меня есть требование, когда я хочу развернуть файл jar в определенном месте на всех узлах кластера hadoop с помощью сервера Ambari. Для этого я думаю, что могу использовать сервисную функцию. Итак, я создал образец службы и мог развернуть ее как клиент или ведомый на всех узлах. Я добавил новую папку как Testservice внутри /var/lib/ambari-server/resources/stacks/HDP/2.2/services/, и в ней есть следующие файлы / каталоги

[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 folder. Мне нужна помощь в этом вопросе. Как я могу использовать сценарий test_client.py? Как я могу напишите общий код, чтобы скопировать мой файл jar.

test_client.py имеет метод установки, как показано ниже

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

Требуются дополнительные сведения о том, как можно использовать переменную env для получения всех необходимых базовых путей для каталога служб Ambari и базовых путей установки hadoop.


person DPM    schedule 06.01.2016    source источник


Ответы (1)


Вы правы, полагая, что вы можете использовать настраиваемую службу Ambari, чтобы убедиться, что файл присутствует на различных узлах в вашем кластере. Ваша настраиваемая служба должна иметь компонент КЛИЕНТ, который обрабатывает размещение необходимых файлов на различных хостах в кластере. Это должен быть клиентский компонент, потому что у него нет запущенных процессов.

Однако использование папки с файлами - неправильный подход к распространению имеющегося у вас файла (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 могла получить к нему доступ и установить его. Вы можете создать локальный репозиторий на узле, на котором запущен сервер Ambari, с помощью httpd и createrepo. Об этом процессе можно узнать из документации HDP .

Альтернативный подход (не рекомендуется)

Теперь, когда я объяснил, как это ДОЛЖНО быть сделано. Позвольте мне рассказать вам, как этого добиться, используя папку 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 не имеет полной функциональности по удалению. Максимум, что вы можете сделать, - это удалить службу из-под управления в кластере амбари, после чего все эти файлы останутся в системе, и их придется удалить, написав собственный сценарий или сделав это вручную. Однако, если вы использовали управление пакетами для установки файлов, вы можете легко удалить программное обеспечение, используя ту же систему управления пакетами.

person cjackson    schedule 11.01.2016
comment
Теоретически нельзя ли упаковать архив и использовать метод установки для вызова Execute (), извлечения и копирования содержимого? Какие есть аргументы против этого? - person Jeroen Vlek; 12.01.2016
comment
@JeroenVlek, я обновил свой ответ, чтобы предоставить альтернативу, а также объяснил, почему мой исходный ответ является лучшим / отраслевым стандартным подходом. - person cjackson; 12.01.2016
comment
@Jackson Я уже пробовал второй вариант, то есть с помощью функции File, и пока это сработало для меня. Однако я не знал о стандартном пакетном подходе. Так что спасибо, что поделились подробностями об этом. Я попробую и это, чтобы увидеть, как это работает. - person DPM; 13.01.2016
comment
Если любой из вариантов сработал, примите ответ. Спасибо. - person cjackson; 14.01.2016