Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon

Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon

Наверное, ни для кого не секрет, что прошлый год для Apache Hadoop стал годом больших перемен. В прошлом году произошло слияние Cloudera и Hortonworks (по сути, поглощение второго), а Mapr, в виду серьезных финансовых проблем, был продан Hewlett Packard. И если несколькими годами ранее, в случае on-premises инсталляций, выбор чаще приходилось делать между Cloudera и Hortonworks, то сегодня, увы, этого выбора у нас не осталось. Сюрпризом стал еще и тот факт, что Cloudera с февраля этого года объявила о прекращении выпуска бинарных сборок своего дистрибутива в публичный репозиторий, и теперь они доступны лишь по платной подписке. Конечно, возможность загрузки последних версий CDH и HDP, выпущенных до конца 2019-го года, все еще есть, и поддержка по ним предполагается в течение одного-двух лет. Но что же делать дальше? Для тех, кто ранее платил за подписку, ничего не изменилось. А для тех, кто не хочет переходить на платную версию дистрибутива, но при этом хочет иметь возможность получать свежие версии компонентов кластера, а также патчи и прочие обновления, мы и подготовили эту статью. В ней мы рассмотрим возможные варианты выхода из сложившейся ситуации.

Статья больше обзорная. В ней не будет сравнения дистрибутивов и подробного их разбора, а также не будет рецептов по их установке и настройке. А что же будет? Мы вкратце расскажем про такой дистрибутив как Arenadata Hadoop, который по праву заслужил наше внимание ввиду своей доступности, что на сегодня большая редкость. А затем поговорим про Vanilla Hadoop, в основном про то, как его можно “приготовить” с помощью Apache Bigtop. Готовы? Тогда добро пожаловать под кат.

Arenadata Hadoop

Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon

Это совсем новый и, пока еще, мало кому известный дистрибутив отечественной разработки. К сожалению, на текущий момент на хабре о нем есть лишь ang artikulong ito.

Более подробную информацию можно найти на официальном Online проекта. Последние версии дистрибутива основаны на Hadoop 3.1.2 для 3-й версии, и 2.8.5 для 2-й версии.

Информацию о roadmap можно найти dito.

Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon
Интерфейс Arenadata Cluster Manager

Ключевым продуктом Arenadata является Arenadata Cluster Manager (ADCM), который используется для установки, настройки и мониторинга различных программных решений компании. ADCM распространяется бесплатно, а его функционал расширяется за счет добавления в него бандлов, которые представляют из себя набор ansible-playbooks. Бандлы делятся на два вида: enterprise и community. Последние доступны для бесплатной загрузки с сайта Arenadata. Также есть возможность разработать свой собственный бандл и подключить его к ADCM.

Для деплоя и управления Hadoop 3 предлагается community-версия бандла в связке с ADCM, а для hadoop 2 есть лишь Apache Ambari в качестве альтернативы. Что же касается репозиториев с пакетами, то они открыты для публичного доступа, их можно загрузить и установить привычным образом для всех компонентов кластера. В целом, дистрибутив выглядит весьма интересно. Уверен, найдутся те, кто привык к таким решениям, как Cloudera Manager и Ambari, и кому приглянется сам ADCM. Для кого-то будет огромным плюсом еще и тот факт, что дистрибутив входит в реестр ПО для импортозамещения.

Если говорить о минусах, то они будут теми же, что и для всех остальных дистрибутивов Hadoop. А именно:

  • Так называемый «vendor lock-in». На примере Cloudera и Hortonworks мы уже поняли, что всегда есть риск изменения политики компании.
  • Значительное отставание от апстрима Apache.

Vanilla Hadoop

Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon

Как вы знаете, Hadoop – это не монолитный продукт, а, по сути, целая плеяда сервисов вокруг его распределенной файловой системы HDFS. Мало кому будет достаточно одного файлового кластера. Одним нужен Hive, а другим Presto, а еще есть HBase и Phoenix, все чаще используется Spark. Для оркестрации и загрузки данных иногда встречаются Oozie, Sqoop и Flume. А если встает вопрос обеспечения безопасности, то сразу вспоминается Kerberos в связке с Ranger.

Бинарные версии компонентов Hadoop доступны на сайте каждого из проектов экосистемы в виде тарболлов. Их можно загрузить и начать установку, но с одним условием: помимо самостоятельной сборки пакетов из «сырых» бинарников, которую, вероятнее всего, вы захотите выполнить, у вас не будет никакой уверенности в совместимости загруженных версий компонентов между собой. Более предпочтительным вариантом является сборка с помощью Apache Bigtop. Bigtop позволит выполнить сборку из maven-репозиториев Apache, прогнать тесты и собрать пакеты. Но, что для нас очень важно, Bigtop соберет те версии компонентов, которые будут между собой совместимы. О нем мы и расскажем более подробно далее.

Apache Bigtop

Apache Bigtop at pumipili ng pamamahagi ng Hadoop ngayon

Apache Bigtop – это инструмент для сборки, пакетирования и тестирования ряда
open source проектов, таких, например, как Hadoop и Greenplum. У Bigtop есть множество
релизов. На момент написания статьи последним стабильным релизом была версия 1.4,
а в master находилась 1.5. В разных версиях релизов используются разные версии
компонентов. Например, для 1.4 core-компоненты Hadoop имеют версию 2.8.5, а в master
2.10.0. Меняется и состав поддерживаемых компонентов. Что-то устаревшее и
необновляемое уходит, а на его место приходит что-то новое, более востребованное, и
не обязательно это что-то из семейства самого Apache.

Кроме того, у Bigtop есть множество форков.

Когда мы стали знакомиться с Bigtop, то прежде всего нас удивила его скромная, в сравнении с другими проектами Apache, распространенность и известность, а также совсем небольшое комьюнити. Из этого следует, что информации по продукту минимум, а поиск решений возникших проблем по форумам и рассылкам может и вовсе ничего не дать. Поначалу для нас оказалось непростой задачей выполнить полную сборку дистрибутива в силу особенностей самого инструмента, но об этом расскажем чуточку позже.

В качестве тизера — тем, кому в свое время заходили такие проекты Linux-вселенной, как Gentoo и LFS, возможно, покажется ностальгически приятно поработать с этой штукой и вспомнить те «былинные» времена, когда мы сами искали (а то и писали) ебилды и регулярно пересобирали с новыми патчами мозиллу.

Большим плюсом Bigtop можно считать открытость и универсальность инструментов, на которых он основан. В его фундаменте стоят Gradle и Apache Maven. Gradle достаточно хорошо известен как инструмент, которым Google собирает Android. Он гибкий, ну и, как говорится, «проверен в бою». Maven – это штатный инструмент для сборки проектов в самом Apache, и, поскольку большинство его продуктов выпускается именно через Maven, тут тоже без него не обошлось. Стоит обратить внимание на POM (project object model) – «фундаментальный» xml-файл с описанием всего необходимого для работы Maven с вашим проектом, вокруг которого строится вся работа. Именно в
части Maven и возникают некоторые препятствия, на которые обычно наталкиваются впервые берущиеся за Bigtop.

Pagsasanay

Итак, с чего же стоит начать? Идем на страницу загрузки и качаем в виде архива последнюю стабильную версию. Там же можно найти и бинарные артефакты, собранные Bigtop. Кстати говоря, из распространенных пакетных менеджеров поддерживаются YUM и APT.

Альтернативным способом, можно загрузить последний стабильный релиз напрямую с
github:

$ git clone --branch branch-1.4 https://github.com/apache/bigtop.git

Клонирование в «bigtop»…

remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 40217 (delta 14), reused 10 (delta 1), pack-reused 40171
Получение объектов: 100% (40217/40217), 43.54 MiB | 1.05 MiB/s, готово.
Определение изменений: 100% (20503/20503), готово.
Updating files: 100% (1998/1998), готово.

Выглядит получившийся каталог ./bigtop примерно так:

./bigtop-bigpetstore — демонстрационные приложения, синтетические примеры
./bigtop-ci — инструментарий CI, jenkins
./bigtop-data-generators — генерация данных, синтетика, для smoke-тестов и т.д.
./bigtop-deploy — инструменты для деплоя
./bigtop-packages — конфиги, скрипты, патчи для сборки, основная часть инструмента
./bigtop-test-framework — фреймворк тестирования
./bigtop-tests — сами тесты, нагрузочные и smoke
./bigtop_toolchain — окружение для сборки, подготовка среды для работы инструмента
./build — рабочий каталог сборки
./dl — каталог для скачанных исходников
./docker — сборка в docker-образах, тестирование
./gradle — конфиг gradle
./output – каталог, в который попадают артефакты сборки
./provisioner — провижининг

Самым интересным на данном этапе для нас является основной конфиг ./bigtop/bigtop.bom, в котором мы видим все поддерживаемые компоненты с версиями. Именно тут мы можем указать другую версию продукта (если вдруг мы хотим ее попробовать собрать) или версию сборки (если, например, добавили значительный патч).

Также большой интерес вызывает подкаталог ./bigtop/bigtop-packages, имеющий непосредственное отношение к процессу сборки компонентов и пакетов с ними.

Итак, мы скачали архив, распаковали его или сделали клон с github, можно начинать сборку?

Нет, сначала подготовим окружение.

Paghahanda sa Kapaligiran

И тут понадобится небольшое отступление. Для сборки практически любого более или менее сложного продукта необходимо определенное окружение — в нашем случае это JDK, те же разделяемые библиотеки, заголовочные файлы и т. д., инструменты, например, ant, ivy2 и много чего еще. Одним из вариантов получить нужное для Bigtop окружение является установка нужных компонентов на хосте сборки. Могу ошибаться в хронологии, но, кажется, с версии 1.0 также появился вариант сборки в заранее сконфигурированных и доступных docker-образах, с ними можно ознакомиться тут.

Что касается подготовки окружения, то для этого есть помощник — Puppet.

Можно воспользоваться следующими командами, запуск делается из корневого каталога
инструмента, ./bigtop:

./gradlew toolchain
./gradlew toolchain-devtools
./gradlew toolchain-puppetmodules

Или непосредственно через puppet:

puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::installer"
puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::deployment-tools"
puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::development-tools"

К сожалению, уже на этом этапе могут возникнуть сложности. Общий совет тут – использовать поддерживаемый дистрибутив, в актуальном состоянии на хосте сборки либо пробовать путь с docker.

Assembly

Что же мы можем попробовать собрать? Ответ на этот вопрос даст вывод команды

./gradlew tasks

В разделе Package tasks есть ряд продуктов являющихся конечными артефактами Bigtop.
Их можно определить по суффиксу -rpm или -pkg-ind (в случае сборки
в docker). В нашем случае самым интересным является Hadoop.

Попробуем выполнить сборку в окружении нашего build-сервера:

./gradlew hadoop-rpm

Bigtop сам скачает необходимые исходники, нужные для конкретного компонента, и начнет сборку. Таким образом, работа инструмента завязана на репозиториях Maven и других источниках, то есть ему нужен доступ в Интернет.

В процессе работы формируется стандартный вывод. Иногда по нему и сообщениям об ошибках можно понять, что пошло не так. А иногда требуется получить дополнительную информацию. В этом случае стоит добавить аргументы --info o --debug, а также может быть полезен –stacktrace. Есть удобный способ сформировать набор данных для последующего обращения в списки рассылки, ключ --scan.

С его помощью bigtop соберет всю информацию и выложит в gradle, после чего выдаст ссылку,
пройдя по которой, компетентный человек сможет понять, почему сборка не удалась.
Нужно иметь в виду, что эта опция может сделать публичной нежелательную для вас информацию, например, имена пользователей, нод, переменные окружения и т.д., так что будьте осторожны.

Часто ошибки являются следствием невозможности получить какие-либо необходимые для сборки компоненты. Как правило, исправить проблему можно через создание патча для исправления чего-либо в исходниках, например, адреса в pom.xml в корневом каталоге исходников. Это делается через создание и размещение его в соответствующем каталоге ./bigtop/bigtop-packages/src/common/oozie/ патча, например, в виде patch2-fix.diff.

--- a/pom.xml
+++ b/pom.xml
@@ -136,7 +136,7 @@
<repositories>
<repository>
<id>central</id>
- <url>http://repo1.maven.org/maven2</url>
+ <url>https://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>

Скорее всего, на момент чтения этой статьи, указанное выше исправление вам не придется делать самим.

При внедрении каких-либо патчей и правок в механизм сборки может понадобиться «сбросить» сборку через команду очистки:

./gradlew hadoop-clean
> Task :hadoop_vardefines
> Task :hadoop-clean
BUILD SUCCESSFUL in 5s
2 actionable tasks: 2 executed

Эта операция откатит все изменения по сборке данного компонента, после чего сборка выполнится заново. В этот раз попробуем собрать проект в docker-образе:

./gradlew -POS=centos-7 -Pprefix=1.2.1 hadoop-pkg-ind
> Task :hadoop-pkg-ind
Building 1.2.1 hadoop-pkg on centos-7 in Docker...
+++ dirname ./bigtop-ci/build.sh
++ cd ./bigtop-ci/..
++ pwd
+ BIGTOP_HOME=/tmp/bigtop
+ '[' 6 -eq 0 ']'
+ [[ 6 -gt 0 ]]
+ key=--prefix
+ case $key in
+ PREFIX=1.2.1
+ shift
+ shift
+ [[ 4 -gt 0 ]]
+ key=--os
+ case $key in
+ OS=centos-7
+ shift
+ shift
+ [[ 2 -gt 0 ]]
+ key=--target
+ case $key in
+ TARGET=hadoop-pkg
+ shift
+ shift
+ [[ 0 -gt 0 ]]
+ '[' -z x ']'
+ '[' -z x ']'
+ '[' '' == true ']'
+ IMAGE_NAME=bigtop/slaves:1.2.1-centos-7
++ uname -m
+ ARCH=x86_64
+ '[' x86_64 '!=' x86_64 ']'
++ docker run -d bigtop/slaves:1.2.1-centos-7 /sbin/init
+
CONTAINER_ID=0ce5ac5ca955b822a3e6c5eb3f477f0a152cd27d5487680f77e33fbe66b5bed8
+ trap 'docker rm -f
0ce5ac5ca955b822a3e6c5eb3f477f0a152cd27d5487680f77e33fbe66b5bed8' EXIT
....
много вывода
....
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-mapreduce-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-namenode-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-secondarynamenode-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-zkfc-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-journalnode-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-datanode-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-httpfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-resourcemanager-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-nodemanager-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-proxyserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-timelineserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-mapreduce-historyserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-client-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-conf-pseudo-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-doc-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-libhdfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-libhdfs-devel-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-fuse-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-debuginfo-2.8.5-1.el7.x86_64.rpm
+ umask 022
+ cd /bigtop/build/hadoop/rpm//BUILD
+ cd hadoop-2.8.5-src
+ /usr/bin/rm -rf /bigtop/build/hadoop/rpm/BUILDROOT/hadoop-2.8.5-1.el7.x86_64
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uQ2FCn
+ exit 0
+ umask 022
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.CwDb22
+ cd /bigtop/build/hadoop/rpm//BUILD
+ rm -rf hadoop-2.8.5-src
+ exit 0
[ant:touch] Creating /bigtop/build/hadoop/.rpm
:hadoop-rpm (Thread[Task worker for ':',5,main]) completed. Took 38 mins 1.151 secs.
:hadoop-pkg (Thread[Task worker for ':',5,main]) started.
> Task :hadoop-pkg
Task ':hadoop-pkg' is not up-to-date because:
Task has not declared any outputs despite executing actions.
:hadoop-pkg (Thread[Task worker for ':',5,main]) completed. Took 0.0 secs.
BUILD SUCCESSFUL in 40m 37s
6 actionable tasks: 6 executed
+ RESULT=0
+ mkdir -p output
+ docker cp
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb:/bigtop/build .
+ docker cp
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb:/bigtop/output .
+ docker rm -f ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
+ '[' 0 -ne 0 ']'
+ docker rm -f ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
Error: No such container:
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
BUILD SUCCESSFUL in 41m 24s
1 actionable task: 1 executed

Сборка выполнилась под CentOS, но можно выполнить и под Ubuntu:

./gradlew -POS=ubuntu-16.04 -Pprefix=1.2.1 hadoop-pkg-ind

Кроме сборки пакетов под различные дистрибутивы Linux, инструмент умеет формировать репозиторий с собранными пакетами, например:

./gradlew yum

Также можно вспомнить про smoke-тесты и развертывание в docker.

Создать кластер из трех нод:

./gradlew -Pnum_instances=3 docker-provisioner

Запустить smoke-тесты в кластере из трех нод:

./gradlew -Pnum_instances=3 -Prun_smoke_tests docker-provisioner

Удалить кластер:

./gradlew docker-provisioner-destroy

Получить команды для подключения внутрь docker-контейнеров:

./gradlew docker-provisioner-ssh

Показать состояние:

./gradlew docker-provisioner-status

Более подробно про Deployment tasks можно почитать в документации.

Если говорить про тесты, то их достаточно большое количество, в основном smoke и интеграционные. Их разбор находится за рамками данной статьи. Скажу лишь, что сборка дистрибутива не является настолько сложной задачей, какой может показаться на первый взгляд. Все компоненты, которые мы используем у себя в проде, удалось собрать и пройти по ним тесты, а также у нас не возникло проблем с их деплоем и выполнением базовых операций в тестовом окружении.

Кроме имеющихся компонентов в Bigtop, есть возможность добавить что-либо еще, даже собственную программную разработку. Все это отлично автоматизируется и укладывается в концепцию CI/CD.

Konklusyon

Очевидно, что собранный таким образом дистрибутив не следует сразу же отправлять в продакшн. Нужно понимать, что если есть реальная потребность в сборке и поддержке своего дистрибутива, то в это нужно вкладываться финансово и временем.

Тем не менее, в сочетании с правильным подходом и профессиональной командой вполне можно обойтись и без коммерческих решений.

Важно отметить, что сам проект Bigtop нуждается в развитии и, похоже, что на сегодня активной разработки в нем не происходит. Также непонятна перспектива появления в нем Hadoop 3. К слову, если у вас есть реальная потребность в сборке Hadoop 3, то можете посмотреть на tinidor от Arenadata, в котором помимо стандартных
компонентов есть еще целый ряд дополнительных (Ranger, Knox, NiFi).

Что касается Ростелекома, то для нас Bigtop – это один из рассматриваемых вариантов на сегодняшний день. Остановим мы свой выбор на нем или нет – покажет время.

Apendiks

Чтобы включить новый компонент в сборку, нужно добавить его описание в bigtop.bom и ./bigtop-packages. Можно попробовать сделать это по аналогии с имеющимися компонентами. Попробуйте разобраться. Это не так сложно, как кажется на первый взгляд.

А что думаете вы? Будем рады увидеть ваше мнение в комментариях и спасибо за внимание!

Статья подготовлена командой управления данными «Ростелекома»

Pinagmulan: www.habr.com

Magdagdag ng komento