10.3.3 Hadoop的节点管理

作为Hadoop集群的管理员,可能随时都要处理增加和撤销机器节点的任务。例如,要增加集群的存储容量,就要增加新的节点。相反,要缩小集群的规模,就需要撤销已存在的节点。如果一个节点频繁地发生故障或运行缓慢,那么也要考虑撤销已存在的节点。节点一般承担DataNode和TaskTracker的任务,Hadoop支持对它们的添加和撤销。

1.添加新的节点

在第2章,我们介绍了如何部署Hadoop集群,可以看到添加一个新的节点虽然只用配置hdfs-site.xml文件和mapred-site.xml文件,但最好还是配置一个授权节点列表。

如果允许任何机器都可以连接到NameNode上并充当DataNode,这是存在安全隐患的,因为这样的机器可能能够获得未授权文件的访问权限。此外这样的机器并不是真正的DataNode,但它可以存储数据,却又不在集群的控制之下,并且任何时候都有可能停止运行,从而造成数据丢失。由于配置简单或存在配置错误,即使在防火墙内这样的处理也可能存在风险,因此在集群中也要对DataNode进行明确的管理。

在dfs.hosts文件中指定可以连接到NameNode的DataNode列表。dfs.hosts文件存储在NameNode的本地文件系统上,包含每个DataNode的网络地址,一行表示一个DataNode。要为一个DataNode设置多个网络地址,把它们写到一行中,中间用空格分开。类似的,TaskTracker是在mapred.hosts中设置的。一般来说,DataNode和TaskTracker列表都存在一个共享文件,名为include file。该文件被dfs.hosts及mapred.hosts两者引用,因为在大多数情况下,集群中的机器会同时运行DataNode及TaskTracker守护进程。

需要注意的是,dfs.hosts和mapred.hosts这两个文件与slaves文件不同,slaves文件被Hadoop的执行脚本用于执行集群范围的操作,例如集群的重启等,但它从来不会被Hadoop的守护进程使用。

要向集群添加新的节点,需要执行以下步骤:

1)向include文件中添加新节点的网络地址;

2)使用以下命令更新NameNode中具有连接权限的DataNode集合:


hadoop dfsadmin-refreshNodes


3)更新带有新节点的slaves文件,以便Hadoop控制脚本在执行后续操作时可以使用更新后的slaves文件中的所有节点;

4)启动新的数据节点;

5)重新启动MapReduce集群;

6)检查网页用户界面是否有新的DataNode和TaskTracker。

需要注意的是,HDFS不会自动将旧DataNode上的数据转移到新的DataNode中,但我们可以运行平衡器命令进行集群均衡。

2.撤销节点

撤销数据节点时要避免数据的丢失。在撤销前,需先通知NameNode要撤销的节点,然后在撤销此节点前将上面的数据块转移出去。而如果关闭了正在运行的TaskTracker,那么JobTracker会意识到错误并将任务分配到其他TaskTracker中去。

撤销节点过程由exclude文件控制:对于HDFS来说,可以通过dfs.hosts.exclude属性来控制;对于MapReduce来说,可以由mapred.hosts.exclude来设置。

TaskTracker是否可以连接到JobTracker,其规则很简单,只要include文件中包含且exclude中不包含这个TaskTracker,这样TaskTracker就可以连接到JobTracker来执行任务。没有定义的或空的include文件意味着所有节点都在include文件中。

对于HDFS来说规则有些许不同,表10-3总结了include和exclude存放节点的情况。对于TaskTracker来说,一个未定义的或空的include文件意味着所有的节点都包含其中。

10.3.3 Hadoop的节点管理 - 图1

要想从集群中撤销节点,需要执行以下步骤:

1)将需要撤销的节点的网络地址增加到exculde文件中,注意,不要在此时更新include文件;

2)重新启动MapReduce集群来终止已撤销节点的TaskTracker;

3)用以下命令更新具有新的许可DataNode节点集的NameNode:


hadoop dfsadmin-refreshNodes


4)进入网络用户界面,先检查已撤销的DataNode的管理状态是否变为“DecommissionIn Progress”,然后把数据块复制到集群的其他DataNode中;

5)当所有DataNode报告其状态为“Decommissioned”时,所有数据块也都会被复制,此时可以关闭已撤销的节点;

6)从include中删除节点网络地址,然后再次运行命令:


hadoop dfsadmin-refreshNodes


7)从slaves文件中删除节点。