对这两天搭建Hadoop集群做个经验总结
master节点:Ubuntu 22.04,也就是我的台式机主机
slave节点:Debian 11,通过VMware虚拟出来
(1)集群节点设置和角色分配
master namenode,datanode,resourcemanager,nodemanager
slave0 secondarynamenode,datanode,nodemanager
slave1 datanode,nodemanager
slave2 datanode,nodemanager
Hadoop体系的构成有三部分,分别是HDFS、YARN、MapReduce。分清楚它们的逻辑关系很重要。
其中HDFS充当的是文件系统的角色,笼统来讲就像你电脑里的文件管理器,由于它的存在,你只需扔给它文件就行了,至于存到哪块硬盘(对应HDFS就是datanode节点),你不需要操心。
YARN的角色就是资源协调方,在Hadoop2.0的时候引入的一个机制。hadoop1.0的时候YARN这部分的工作基本上是由namenode来完成的。YARN要做的工作,大概就是弄清楚集群中的存储资源分布情况,当你要向集群存储文件时,能够较好地把文件存到合适的位置。
MapReduce则相当于你电脑的应用程序,具体如何处理数据,就由MapReduce来弄。
其中,namenode、datanode、secondarynamenode是属于HDFS系统的,也就是这些节点共同构成分布式文件系统。resourcemanager和nodemanager是属于YARN的。在启动分布式系统时,可以分别启动HDFS系统(运行start-dfs.sh)和YARN系统(运行start-yarn.sh)
(2)配置过程
具体配置过程,网上已经有很多博客了,我不再赘述。
先说说走过的弯路
1. 关于Linux的User设置
master和slave节点运行Hadoop的用户,最好要取相同的名字,虽然不取相同的名字理论上也行得通,但是很麻烦。
这里主要是因为配置$HADOOP_HOME/etc/hadoop里的workers文件的问题,这里只定位到节点的ip地址,而不定位到具体节点运行Hadoop程序的用户。当master和slave节点运行Hadoop程序的用户名不一样时,在master节点上(比如master节点上用户名是mmm)通过ssh远程登陆slave节点(比如slave节点用户名是sss)时,它会默认登陆slave节点的mmm用户。我一直想在etc/hadoop下的masters文件里定位到具体节点的用户上,然而一直会有节点启动失败问题。
总结:为了免去不必要的麻烦,最好让各个节点上运行Hadoop程序的用户名一致
2.格式化和cluster-ID不一致问题
其实格式化就是重置文件系统,格式化之后之前存储的东西都没了。格式化的时候经常会碰到datanode和namenode的cluster-ID不一致问题
hdfs namenode -format
运行这个命令时,其实主要就是把namenode上面里存储HDFS的元数据删除了。那元数据存储在哪里呢?$HADOOP_HOME/etc/hadoop下的hdfs-site.xml文件里,通过配置dfs.namenode.name.dir,可以指定元数据的存储位置,其中cluster-ID数据就存在这里面。。在hdfs-site.xml里通过配置dfs.datanode.data.dir,还可以指定datanode存储具体数据的位置
那cluster-ID不一致是怎么回事呢?其实就是dfs.namenode.name.dir和dfs.datanode.data.dir下面的cluster-ID不一致,导致datanode启动不了。格式化之后,namenode的相关数据会删掉,在start-dfs.sh的时候重新生成,但是,datanode下面的相关数据不会删除!在启动文件系统的时候,由于检测到dfs.datanode.data.dir里面不是空的,它就不会给它同步生成cluster-ID,从而导致datanode的cluster-ID和namenode的cluster-ID不一致。
所以,格式化之后,一定要把datanode下dfs.datanode.data.dir里的文件删掉,再启动HSDFS
3.关于排错
其实主要就是查看日志文件。每次启动都会生成日志文件(就是.log文件,不是.out文件)。查看相关的日志文件就好了。
4.关于网段设置
说一个我遇上的诡异事件。我的台式机主机IP是公网IP,VMware上虚拟机设置的是NAT模式,IP地址是私域IP。一路配置下来,都没问题,免密登录、启动HDFS、启动YARN,看起来都好好的。但是!我发现HDFS的存储空间为0,而且也没法hdfs dfs -put文件。运行hdfs dfsadmin -report显示只有一个存活的节点(事实上四个datanode都启动了),我多次运行hdfs dfsadmin -report,发现存活的datanode还不一样。。????
后来我只好让namenode和datanode全都处于私域,或者全都处于公网,才正常了。
所以,一定要让节点要么都在公网,要么都在私域其实,从后面对hadoop的设计初衷也知道,这个问题是很显然的。
集群配置还有好多问题,要弄懂整个集群,还有很多要学。加油!!!
这里推荐一篇很值得读的文章:Hadoop和网络 有时间我对这篇博客做个总结。