在业内存在着一种看起来比较离谱的搭建方式,叫计算节点与存储节点分离,说它比较离谱,是因为hadoop架构本身不直接支持将这两者分开,因为hadoop本身的一大优势就是计算本地化,这种分开搭建的方式抛弃了这种优势,但是也有好处,就是可以省钱,通过这种方式,把高性能机器放在计算上,其他大量的廉价机器在保证磁盘读写IO性能上不出大问题就可以放在集群中存储数据。
通常这种样式的搭建方式,一般都会放最少20台高性能机器,其他都是廉价的存储节点,下面就来看一下怎么搭建这个玩意,具体搭建之前我要再说明一点hadoop本身不直接支持把计算和存储节点分离,注意我用的字眼是直接
,意思就是说你没有办法通过配置来直接指定哪台节点被明确的区分为存储节点或计算节点,但是你能够通过一些hadoop提供的配置从运行方面达到这一点需求。
我在本地准备了三个节点的Hadoop测试集群,他们负责的角色如下
bash
域名 负责角色
hdp4 NameNode、DataNode、NodeManager、JournalNode、DFSZKFailoverController、Zookeeper
hdp5 NameNode(备用)、DataNode、ResourceManager、NodeManager、JournalNode、DFSZKFailoverController、Zookeeper
hdp6 DataNode、ResourceManager、NodeManager、JournalNode、Zookeeper
总的来说,hdp4和hdp5负责namenode主副节点,hdp5和hdp6配合负责主副yarn节点、hdp4和hdp5以及hdp6本身都再负责一个datanode和nodemanager的角色。现在我要做的是只让hdp4和hdp5上的datanode起效,也就是做存储节点,而hdp6只起效nodemanager作为计算节点。
首先第一步,进入hadoop的配置文件目录,我用的3.x的版本,既/opt/hadoop-3.1.3/etc/hadoop
下,打开yarn-site.xml
,追加一个配置
xml
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/opt/hadoop-3.1.3/etc/hadoop/exNodeManagers</value>
</property>
然后再配置目录下创建exNodeManagers
文件,在这个文件里,每一行为单位,写你希望那台节点在启动集群的时候被排除在yarn资源池里面。注意
,这里补充一点,在搭建Hadoop集群的时候,2.x会指定slaves文件3.x会指定workers文件,这里说的,你希望哪台节点在启动时被排除,就是指的这个文件里你写的机器,和namenode和及resourcemanager节点没关系,因为现在是为了分离计算和存储节点,只对datanode和nodemanager做操作。
言归正传,因为计划只让hdp6做计算,因此其他两台机器我要写在这个文件中,不让他们启动nodemanager
bash
hdp4
hdp5
第二步,打开hdfs-site.xml
文件,添加如下配置并建立对应的文件,作用和上面同样,只不过这次限制的是那台节点不作为datanode
xml
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/hadoop-3.1.3/etc/hadoop/exDataNodes</value>
</property>
exDataNodes文件:
bash
hdp6
虽然我们就可以启动集群了,注意这个配置方法,本身是Hadoop提供给OP的技术储备,使得Hadoop可以灵活的预留节点或对节点做上下线的。而且一般情况下也不能直接重启集群,一来耗时,二来商用的时候你每关闭一小时集群,那可是少赚一小时的核时
啊,不明白什么叫核时的去查一查这里不做科普。
言归正传,正式操作的时候,都是通过yarn rmadmin -refreshNodes
和hdfs dfsadmin -refreshNodes
来刷新配置就行。
当你一切准备就绪后,重启或刷新配置,登录yarn ui上,你就可以看到只剩下hdp6节点在资源队列里面
datanode去namenode的ui上看,但是看的时候注意,datanode不想resourcemanager节点那样不展示,你在datanodes界面任然还能看到节点,只是会标记为退出存储队列,不过你在服务器上jsp进程,对应的节点还是会启动datanode进程。
最后说一句,nodemanager配置文件排除之后,对应节点上就不启动了,不过如果你是通过刷新配置来操作的话,可能有的时候网络之类的问题没有成功退出,直接kill就行,但是datanode还会启动,一般会写一个脚本,放在hadoop启动脚本的最后,用来远程调用对应节点处理出datanode的进程号kill掉就行,然后再datanodes页面上前面的标识就会从退出,变成橙色标识的完全退出状态,既对应节点已完全消失。