2.3.4 完全分布式安装
完全分布式用多个节点构成集群环境来运行Hadoop,对Linux 机器集群进行规划,使Hadoop 各模块分别部署在不同的多台机器上,环境配置信息如表2-1所示。
表2-1 环境配置信息

1.环境准备
这里采用先在第一台机器上解压、配置 Hadoop,然后再分发到其他两台机器上的方式来安装集群。
(1)解压Hadoop 目录,代码如图2-62所示。

图2-62 解压Hadoop目录
(2)配置Hadoop JDK 路径,修改Hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件中的 JDK 路径,代码如图2-63所示。

图2-63 配置Hadoop JDK路径
(3)配置core-site.xml,代码如图2-64所示。

图2-64 配置core-site.xml
(4)设置fs.defaultFS的参数值为NameNode的地址。
Hadoop.tmp.dir为Hadoop临时目录的地址,默认情况下,NameNode 和 DataNode 的数据文件都会存在这个目录的对应子目录下。应该保证此目录是存在的,如果不存在,则先创建。
(5)配置hdfs-site.xml,代码如图2-65所示。

图2-65 配置hdfs-site.xml
dfs.namenode.secondary.http-address 指定 secondaryNameNode 的 http 访问地址和端口号。因为在规划中,我们将 BigData03 规划为secondaryNameNode 服务器,所以这里设置为bigdata-senior03:50090。
(6)配置slaves,代码如图2-66所示。

图2-66 配置slaves
slaves 文件指定 HDFS 上有哪些 DataNode。
(7)配置yarn-site.xml,代码如图2-67所示。

图2-67 配置yarn-site.xml
根据规划,yarn.resourcemanager.hostname指定ResourceManager 服务器指向BigData-senior02。
yarn.log-aggregation-enable设置是否启用日志聚集功能。
yarn.log-aggregation.retain-seconds设置聚集的日志在 HDFS 上最多保存多长时间。
(8)配置mapred-site.xml,代码如图2-68所示。

图2-68 配置mapred-site.xml
mapreduce.framework.name 设置MapReduce任务运行在YARN上。
mapreduce.jobhistory.address设置MapReduce的历史服务器安装在BigData01机器上。
mapreduce.jobhistory.webapp.address 设置历史服务器的Web页面地址和端口号。
2.设置SSH无密码登录
Hadoop集群中各机器之间会相互通过 SSH 访问,因为每次访问都输入密码是不现实的,所以要设置各个机器间的SSH 是无密码登录的。
(1)在BigData01上生成公钥,代码如图2-69所示。

图2-69 生成公钥
一路回车,都设置为默认值,然后在当前用户的Home目录下的.ssh目录中会生成公钥文件(id_rsa.pub)和私钥文件(id_rsa)。
(2)分发公钥,代码如图2-70所示。

图2-70 分发公钥
(3)设置BigData02、BigData03 到其他机器的无密钥登录。
同样,在 BigData02、BigData03 上生成公钥和私钥后,将公钥分发到三台机器上。
3.分发Hadoop文件
(1)在其他两台机器上创建存放Hadoop的目录,代码如图2-71所示。

图2-71 创建存放Hadoop的目录
(2)通过SCP分发。
SCP分发代码及结果如图2-72所示。Hadoop根目录下的share/doc目录下存储的是Hadoop相关文件,这个doc目录占用的硬盘空间相当大,一般在1.5GB以上,建议在分发之前将这个目录删除,以节省硬盘空间并提高分发的速度。

图2-72 SCP分发代码及结果
4.格式化NameNode
在 NameNode 机器上执行格式化,代码如图2-73所示。

图2-73 格式化NameNode
注意:
如果需要重新格式化NameNode,则先将原有NameNode和DataNode 下的文件全部删除,不然会报错。在core-site.xml文件中,dfs.namenode.name.dir、dfs.datanode.data.dir属性字段可分别设置为NameNode和DataNode的目录路径值。
core-site.xml配置信息如图2-74所示。

图2-74 core-site.xml配置信息
每次格式化都默认创建一个集群ID,并写入NameNode和DataNode的VERSION文件(VERSION文件所在目录为dfs/name/current和dfs/data/current)中,重新格式化时,会默认生成一个新的集群ID,如果不删除原有目录,则会导致NameNode中的VERSION文件中是新的集群ID,而DataNode中是旧的集群ID,不一致时会报错。
另一种方法是格式化时指定集群ID参数,指定为旧的集群ID。
5.启动集群
(1)启动HDFS,代码及结果如图2-75所示。

图2-75 启动HDFS
(2)启动YARN,代码如图2-76所示。

图2-76 启动YARN
(3)在BigData02 上启动ResourceManager,代码及结果如图2-77所示。

图2-77 启动ResourceManager
(4)启动日志服务器。
因为我们规划的是在 BigData01 服务器上运行 MapReduce 日志服务,所以要在 BigData01 上启动,代码及结果如图2-78所示。

图2-78 启动日志服务器
(5)查看HDFS Web 页面。
http://bigdata-senior01:50070/
(6)查看YARN Web 页面。
http://bigdata-senior02:8088/cluster
6.测试 Job
我们在这里采用Hadoop自带的WordCount 例子,在集群模式下测试运行MapReduce程序。
(1)准备MapReduce 输入文件 wc.input,代码如图2-79所示。

图2-79 准备MapReduce输入文件wc.input
(2)在 HDFS 中创建输入目录 input,代码如图2-80所示。

图2-80 创建输入目录input
(3)将wc.input上传到 HDFS,代码如图2-81所示。

图2-81 将wc.input上传到HDFS
(4)运行Hadoop自带的MapReduce Demo程序,代码及结果如图2-82所示。

图2-82 运行Hadoop自带的MapReduce Demo程序
(5)查看输出文件,代码及结果如图2-83所示。

图2-83 查看输出文件