眾所周知,去年是 Apache Hadoop 發生重大變化的一年。 去年,Cloudera 和 Hortonworks 合併(實質上是收購後者),而 Mapr 由於嚴重的財務問題,被賣給了惠普。 如果幾年前,在本地安裝的情況下,通常必須在 Cloudera 和 Hortonworks 之間做出選擇,但今天,唉,我們沒有這個選擇。 另一個令人驚訝的事實是,Cloudera 在今年 2019 月宣布將停止將其發行版的二進位組件發佈到公共儲存庫中,並且現在只能透過付費訂閱來獲取它們。 當然,仍然可以下載XNUMX年底之前發布的CDH和HDP的最新版本,預計它們的支援時間為一到兩年。 但下一步該怎麼辦呢? 對於那些之前付費訂閱的人來說,一切都沒有改變。 對於那些不想切換到付費版本的發行版,但同時希望能夠接收最新版本的叢集元件,以及修補程式和其他更新的人,我們準備了這篇文章。 在其中我們將考慮擺脫這種情況的可能選擇。
這篇文章更多的是一篇評論。 它不會包含對發行版的比較和對它們的詳細分析,並且不會有安裝和配置它們的秘訣。 會發生什麼事? 我們將簡要討論 Arenadata Hadoop 這樣的發行版,由於其可用性,它理所當然地值得我們關注,而這在今天是非常罕見的。 然後我們將討論 Vanilla Hadoop,主要是如何使用 Apache Bigtop 來「烹飪」它。 準備好? 那麼歡迎來到貓。
阿里納資料 Hadoop
這是國內開發的全新且鮮為人知的發行套件。 不幸的是,目前哈布雷上只有
更多資訊可以查看官方
有關路線圖的資訊可以找到
Arenadata 叢集管理器介面
Arenadata的核心產品是
對於 Hadoop 3 的部署和管理,社區版本的捆綁包與 ADCM 一起提供,但對於 Hadoop 2,只有
如果我們談論缺點,它們將與所有其他 Hadoop 發行版相同。 即:
- 所謂的「供應商鎖定」。 透過Cloudera和Hortonworks的例子,我們已經意識到公司政策改變的風險始終存在。
- 明顯落後於 Apache 上游。
普通 Hadoop
如您所知,Hadoop 並不是一個單一的產品,事實上,它是圍繞其分散式檔案系統 HDFS 的一整套服務。 很少有人會擁有足夠的一個文件集群。 有的需要Hive,有的需要Presto,還有HBase和Phoenix;Spark的使用也越來越多。 對於編排和資料加載,有時會使用 Oozie、Sqoop 和 Flume。 如果出現安全問題,人們會立即想到 Kerberos 和 Ranger。
每個生態系統專案的網站上都以 tarball 的形式提供了 Hadoop 元件的二進位版本。 您可以下載它們並開始安裝,但有一個條件:除了從「原始」二進位檔案獨立組裝軟體包(您最有可能想要這樣做)之外,您對下載的組件版本與每個組件的兼容性沒有任何信心其他。 首選選項是使用 Apache Bigtop 進行建置。 Bigtop 將允許您從 Apache maven 儲存庫進行建置、執行測試和建置套件。 但是,對我們來說非常重要的是,Bigtop 將組裝那些相互相容的元件版本。 我們將在下面更詳細地討論它。
阿帕契大頂
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:
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的需求,可以看一下
還有許多附加元件(Ranger、Knox、NiFi)。
至於 Rostelecom,對我們來說,Bigtop 是今天考慮的選擇之一。 無論我們選擇與否,時間都會證明一切。
附錄
要在組裝中包含新元件,您需要將其描述新增至 bigtop.bom 和 ./bigtop-packages 中。 您可以嘗試透過與現有組件類比來做到這一點。 試著弄清楚。 這並不像乍看那麼困難。
你怎麼認為? 我們很高興在評論中看到您的意見,並感謝您的關注!
本文由 Rostelecom 資料管理團隊撰寫
來源: www.habr.com