Apache Bigtop 并立即选择 Hadoop 发行版

Apache Bigtop 并立即选择 Hadoop 发行版

众所周知,去年是 Apache Hadoop 发生重大变化的一年。 去年,Cloudera 和 Hortonworks 合并(实质上是收购后者),而 Mapr 由于严重的财务问题,被卖给了惠普。 如果几年前,在本地安装的情况下,通常必须在 Cloudera 和 Hortonworks 之间做出选择,但今天,唉,我们没有这个选择。 另一个令人惊讶的事实是,Cloudera 在今年 2019 月宣布将停止将其发行版的二进制程序集发布到公共存储库中,并且现在只能通过付费订阅来获取它们。 当然,仍然可以下载XNUMX年底之前发布的CDH和HDP的最新版本,预计对它们的支持时间为一到两年。 但下一步该怎么办呢? 对于那些之前付费订阅的人来说,一切都没有改变。 对于那些不想切换到付费版本的发行版,但同时希望能够接收最新版本的集群组件,以及补丁和其他更新的人,我们准备了这篇文章。 在其中我们将考虑摆脱这种情况的可能选择。

这篇文章更多的是一篇评论。 它不会包含对发行版的比较和对它们的详细分析,并且不会有安装和配置它们的秘诀。 会发生什么? 我们将简要讨论 Arenadata Hadoop 这样的发行版,由于其可访问性,它理所当然地值得我们关注,而这在今天是非常罕见的。 然后我们将讨论 Vanilla Hadoop,主要是如何使用 Apache Bigtop 来“烹饪”它。 准备好? 那么欢迎来到猫。

阿里纳数据 Hadoop

Apache Bigtop 并立即选择 Hadoop 发行版

这是国内开发的全新且鲜为人知的发行套件。 不幸的是,目前哈布雷上只有 这篇文章.

更多信息可以查看官方 在线 项目。 该发行版的最新版本基于 Hadoop 3.1.2(版本 3)和 2.8.5(版本 2)。

有关路线图的信息可以找到 这里.

Apache Bigtop 并立即选择 Hadoop 发行版
Arenadata 集群管理器界面

Arenadata的核心产品是 Arenadata 集群管理器 (ADCM),用于安装、配置和监控各种公司软件解决方案。 ADCM 是免费分发的,并且通过添加捆绑包(一组 ansible-playbook)来扩展其功能。 捆绑包分为两种类型:企业捆绑包和社区捆绑包。 后者可以从 Arenadata 网站免费下载。 还可以开发自己的捆绑包并将其连接到 ADCM。

对于 Hadoop 3 的部署和管理,社区版本的捆绑包与 ADCM 一起提供,但对于 Hadoop 2,只有 阿帕奇安巴里 作为备选。 至于带有软件包的存储库,它们向公众开放,可以以通常的方式为集群的所有组件下载和安装它们。 总体而言,该分布看起来非常有趣。 我相信会有一些人习惯了 Cloudera Manager 和 Ambari 等解决方案,并且会喜欢 ADCM 本身。 对于某些人来说,分布也将是一个巨大的优势 包含在软件寄存器中 用于进口替代。

如果我们谈论缺点,它们将与所有其他 Hadoop 发行版相同。 即:

  • 所谓的“供应商锁定”。 通过Cloudera和Hortonworks的例子,我们已经意识到公司政策改变的风险始终存在。
  • 明显落后于 Apache 上游。

普通 Hadoop

Apache Bigtop 并立即选择 Hadoop 发行版

如您所知,Hadoop 并不是一个单一的产品,事实上,它是围绕其分布式文件系统 HDFS 的一整套服务。 很少有人会拥有足够的一个文件集群。 有的需要Hive,有的需要Presto,还有HBase和Phoenix;Spark的使用也越来越多。 对于编排和数据加载,有时会使用 Oozie、Sqoop 和 Flume。 如果出现安全问题,人们会立即想到 Kerberos 和 Ranger。

每个生态系统项目的网站上都以 tarball 的形式提供了 Hadoop 组件的二进制版本。 您可以下载它们并开始安装,但有一个条件:除了从“原始”二进制文件独立组装软件包(您最有可能想要这样做)之外,您对下载的组件版本与每个组件的兼容性没有任何信心其他。 首选选项是使用 Apache Bigtop 进行构建。 Bigtop 将允许您从 Apache maven 存储库进行构建、运行测试和构建包。 但是,对我们来说非常重要的是,Bigtop 将组装那些相互兼容的组件版本。 我们将在下面更详细地讨论它。

阿帕奇大顶

Apache Bigtop 并立即选择 Hadoop 发行版

Apache Bigtop 是一个用于构建、打包和测试多种应用程序的工具
开源项目,例如 Hadoop 和 Greenplum。 大顶有很多
发布。 在撰写本文时,最新的稳定版本是 1.4 版,
在 master 中是 1.5。 不同版本的release使用不同的版本
成分。 例如,对于 1.4 Hadoop 核心组件版本为 2.8.5,并且在 master 中
2.10.0。 支持的组件的组成也在变化。 一些过时的东西和
不可再生的事物消失了,取而代之的是新的、需求更大的事物,
它不一定来自 Apache 家族本身。

此外,Bigtop还有很多 叉子.

当我们开始熟悉 Bigtop 时,我们首先感到惊讶的是,与其他 Apache 项目相比,它的规模不大,流行度和受欢迎程度以及非常小的社区。 由此可见,有关该产品的信息很少,并且在论坛和邮件列表上搜索出现的问题的解决方案可能根本不会产生任何结果。 起初,由于工具本身的特性,完成发行版的完整组装对我们来说是一项艰巨的任务,但我们稍后会讨论这一点。

作为一个预告片,那些曾经对 Gentoo 和 LFS 这样的 Linux 世界项目感兴趣的人可能会发现使用这个东西是一种怀旧的愉快,并记住我们自己正在寻找(甚至写作)的那些“史诗”时光。 ebuilds 并定期使用新补丁重建 Mozilla。

Bigtop 的一大优势是其所基于的工具的开放性和多功能性。 它基于 Gradle 和 Apache Maven。 Gradle 作为 Google 用于构建 Android 的工具而广为人知。 它很灵活,而且正如他们所说,“经过实战考验”。 Maven 是 Apache 本身构建项目的标准工具,由于其大部分产品都是通过 Maven 发布的,所以这里也离不开它。 值得关注的是 POM(项目对象模型)——“基本”xml 文件,描述了 Maven 与您的项目一起工作所需的一切,所有工作都是围绕它构建的。 正好在
Maven 的一部分,首次使用 Bigtop 用户通常会遇到一些障碍。

实践

那么你应该从哪里开始呢? 转到下载页面并下载最新的稳定版本作为存档。 您还可以在那里找到 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 工具,詹金斯
./bigtop-data-generators — 数据生成、合成、烟雾测试等。
./bigtop-deploy - 部署工具
./bigtop-packages — 配置、脚本、组装补丁、工具的主要部分
./bigtop-test-framework — 测试框架
./bigtop-tests — 测试本身、负载和烟雾
./bigtop_toolchain — 装配环境,为工具工作准备环境
./build — 构建工作目录
./dl — 下载源的目录
./docker — 在 docker 镜像中构建、测试
./gradle - 等级配置
./output – 构建工件所在的目录
./provisioner — 配置

现阶段对我们来说最有趣的是主要配置 ./bigtop/bigtop.bom,其中我们可以看到所有受支持的组件及其版本。 在这里,我们可以指定产品的不同版本(如果我们突然想尝试构建它)或构建版本(例如,如果我们添加了重要的补丁)。

子目录也很有趣 ./bigtop/bigtop-packages,这与组件及其封装的组装过程直接相关。

那么,我们下载了存档,解压它或从 github 进行克隆,我们可以开始构建了吗?

不行,我们先准备一下环境。

准备环境

在这里我们需要一个小小的撤退。 要构建几乎任何或多或少复杂的产品,您需要一定的环境 - 在我们的例子中,这是 JDK、相同的共享库、头文件等、工具,例如 ant、ivy2 等等。 获取 Bigtop 所需环境的选项之一是在构建主机上安装必要的组件。 我的时间顺序可能是错误的,但似乎在 1.0 版本中,还有一个选项可以构建预配置且可访问的 Docker 映像,可以在此处找到。

至于准备环境,有一个助手——Puppet。

可以使用以下命令,从根目录运行
工具, ./bigtop:

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

或者直接通过木偶:

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 路线。

装配

我们可以尝试收集什么? 这个问题的答案将由命令的输出给出

./gradlew tasks

在“打包任务”部分中,有许多产品是 Bigtop 的最终产品。
它们可以通过后缀 -rpm 或 -pkg-ind 来识别(在构建的情况下)
在码头工人)。 在我们的例子中,最有趣的是 Hadoop。

让我们尝试在构建服务器的环境中进行构建:

./gradlew hadoop-rpm

Bigtop 本身将下载特定组件所需的必要源并开始组装。 因此,该工具的运行依赖于 Maven 存储库和其他来源,也就是说,它需要 Internet 访问。

运行期间,会生成标准输出。 有时它和错误消息可以帮助您了解出了什么问题。 有时您需要获取更多信息。 在这种情况下,值得添加参数 --info или --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>

最有可能的是,在阅读本文时,您不必自己进行上述修复。

当对程序集机制引入任何补丁和更改时,您可能需要使用 cleanup 命令“重置”程序集:

./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

您还可以记住 Docker 中的冒烟测试和部署。

创建一个包含三个节点的集群:

./gradlew -Pnum_instances=3 docker-provisioner

在三个节点的集群中运行冒烟测试:

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

删除集群:

./gradlew docker-provisioner-destroy

获取用于连接 docker 容器内部的命令:

./gradlew docker-provisioner-ssh

显示状态:

./gradlew docker-provisioner-status

您可以在文档中阅读有关部署任务的更多信息。

如果我们谈论测试,其数量相当多,主要是烟雾和集成。 他们的分析超出了本文的范围。 我只想说,组装分发套件并不像乍看起来那么困难。 我们成功地组装并通过了生产中使用的所有组件的测试,并且在测试环境中部署它们并执行基本操作也没有出现任何问题。

除了 Bigtop 中的现有组件之外,还可以添加任何其他组件,甚至是您自己开发的软件。 所有这一切都是完全自动化的,并且符合 CI/CD 概念。

结论

显然,以这种方式编译的发行版不应立即发送到生产环境。 您需要了解,如果确实需要构建和支持您的发行版,那么您需要为此投入金钱和时间。

然而,结合正确的方法和专业的团队,无需商业解决方案也是有可能实现的。

需要注意的是,Bigtop 项目本身需要开发,并且目前看来并未积极开发。 Hadoop 3出现在其中的前景也还不明朗,顺便说一句,如果你确实有搭建Hadoop 3的需求,可以看一下 来自 Arenadata,其中,除了标准
还有许多附加组件(Ranger、Knox、NiFi)。

至于 Rostelecom,对我们来说,Bigtop 是今天考虑的选择之一。 无论我们选择与否,时间会证明一切。

附录

要在装配中包含新组件,您需要将其描述添加到 bigtop.bom 和 ./bigtop-packages 中。 您可以尝试通过与现有组件类比来做到这一点。 试着弄清楚。 这并不像乍看起来那么困难。

你怎么认为? 我们很高兴在评论中看到您的意见,并感谢您的关注!

本文由 Rostelecom 数据管理团队编写

来源: habr.com

添加评论