文章目录
学习一项技能的最好方式自然是理解+实践,在了解了 hadoop 的基本概念后我开始尝试在本地搭建一个集群环境用于进一步学习。
但是经过尝试后发现想在 MacOS 中搭建一个集群比我想象中困难得多,其中也有一部分原因是我对 macOS 系统不太熟悉,可谓是一坑未填一坑又起了。经过不懈努力终于搭建了一个基于 docker 的 hadoop 集群,故有此一文作记录和分享~
macOS (version: 12.3, chip: Apple M1 Pro, memory: 16GB)
colima 0.4.5
docker 20.10.18
这里简单介绍下 hadoop 的一些基本概念。

hadoop 的基本组成为 MapReduce、Yarn、HDFS 等组件。

其中 HDFS 是一种分布式的文件系统,它的主要组成是 NameNode、SecondaryNameNode 和 Datanode 等。

而 Yarn 是 hadoop 在 2.x 版本后设计的分布式资源调度工具,其主要组成为 NodeManager 和 ResourceManager 等。
更详细的基础知识可以参考我的博客笔记:
https://blog.csdn.net/weixin_40815218/article/details/126838369
一般情况下,搭建一个高可用的 hadoop 集群通常是选择两台以上的物理服务器来运行不同的节点。本文的目的是搭建一个用于学习的集群,可以先不考虑 HA,而据我了解,将一台机器用作多个服务器的方法一般有虚拟机方式和 docker 容器方式两种。
相比于搭建虚拟机,我更倾向于选择后者,因为虚拟机的安装和配置更加复杂,对资源消耗也更大。同时因为之前参加 twu 也已经安装好了 colima 虚拟环境下的docker,就愉快地决定用docker开始搭建了。
搭建集群的第一步是先搭建一个单机的伪分布式集群,验证环境的可用性。
这里开始了第一个坑:
由于过于信任 docker 的平台无关性,我先搜索了"docker 安装 hadoop3.x",忽略了macOS m1芯片aarch64架构的特性,并根据社区中教程文章开始操作。
首先拉取了一个centos镜像,docker run 运行镜像后,docker exec 进入容器,安装配置了 jdk1.8、openssh、hadoop后 docker commit 保存镜像,发现如下报错:
The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
无奈得知想要重复使用一个镜像的话需要保证芯片架构的一致性。于是重新寻找适用于aarch64的镜像,最后找到一篇博文讲到这方面问题:
https://blog.csdn.net/LiuWH1688/article/details/120608075
这篇博客中的项目对MacOS M1芯片、arm64架构等做了适配。
项目地址:https://github.com/Weihong-Liu/hadoop-docker/blob/main/hadoop-docker-aarch64
第一个坑结束。
高兴地 clone 了项目开始实践,参详其 Dockerfile,作者使用 ubuntu 作为系统镜像,分别安装适用的 hadoop 和 jdk1.8 的 aarch版本,还预装了openssh,同时载入了外部配置文件并配置了各种环境变量,准备工作可以说相当全面。
我充满信心地使用 docker build 运行 Dockerfile 文件生成 hadoop 节点镜像,最后自动生成了三个节点容器并进入了 master 节点容器。一切都很完美直到我运行 start-all.sh 启动了集群,这里遇到第二个大坑:
运行没有报任何异常,但是 jps 查看进程后发现 namenode 节点不能正常启动,这时就想到查看 logs 日志,观察发现 hadoop 日志没有错误信息,然后想看下系统日志 /var/log/message 发现日志文件都没有~
百思不得其解后向原项目提交了一个 issue 寻求帮助,作者回复已做修复后我查看修改记录发现作者将 resourcemanager 的地址中 master 节点修改为了 slave2 节点,这样做的动机是防止 docker 单个容器的内存占用过高导致节点挂掉。于是我获得了灵感,觉得这可能是因为内存不足导致的,但同时也疑惑为什么没有生成 记录 oom 的 heapdump 文件。这里我就使用 yarn --daemon start 和 hdfs --daemon start 尝试单独启动指定节点,发现现象是启动了 master 的 namenode,slave2 的 resourcemanager 就会 down 掉,再尝试启动 resourcemanager,namenode 又会 down 掉。这也更加证实了我的猜想没错。
首先我尝试 docker -m p1 --memory-swap p2 指定 docker 的内存资源分配,发现没有效果。然后意识到当前环境下 docker 的各个容器之间共享内存资源,而现在 docker 的总内存资源只有 2G,这才是问题所在。
于是把问题视角上升到 docker 的父容器 colima,通过查阅资料得知 colima 也可以通过简单配置 colima --cpu p1 --memory p2 start 来分配内存资源。重启 colima 时发现如下输出:
Reducing the guest memory from 4GiB to 3GiB, to avoid host kernel panic on macOS <= 12.3 with QEMU >= 7.0; Please update macOS to 12.4 or later, or downgrade QEMU to 6.2; See https://github.com/lima-vm/lima/issues/795 for the further background
于是无奈地顺便升级了macOS系统版本到12.6,重启 colima 后再次进入 docker 容器发现内存确实提高到了指定的 4G 内存。这时重新启动了 hadoop 集群,所有节点运行正常。
这时我想要在 mac 的浏览器访问 localhost:9870 查看 hdfs 系统 和 localhost:8088/cluster 查看 cluster 节点信息。
无奈发现 404 not found。经过一番查阅资料,得知 mac 环境不会自动创建 docker 网卡 用于与 docker 容器通信。
参考文章:https://blog.csdn.net/qq_35371031/article/details/104601403
文章提供了解决问题的三种方法:
1. 使用 vpn 代理
2. host 模式代替 bridge 模式
3. 端口映射
其中替换为 host 模式的方法在不同容器之间会有端口冲突;
而端口映射方法需要指定端口而不是IP,不够灵活,具体参考文章:
http://t.zoukankan.com/EasonJim-p-7819478.html
最终采用了 vpn 代理方法,具体参考文章:
https://blog.csdn.net/tqtaylor/article/details/119799526
注意,可能是因为系统差异,文章中所用的配置文件地址(/usr/local/etc/docker-connector.conf)不正确,参考原始项目后得知应该改为 $(brew --prefix)/etc/docker-connector.conf
经过一番尝试,终于可以在浏览器访问 hdfs 和 cluster 啦!!
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub