目标

配置单个或多个节点的集群环境

说明

除了本地模型直接运行hadoop程序外,也可以把Map-Reduce程序提交到(伪)分布式集群上运行

本文所用环境

Windows 10 x64
VMWare Workstation 15 Pro
CentOS 7.6

虚拟机系统需求

最小4G内存,推荐8G
建议20G硬盘
共三台虚拟机,加上主机需要的内存,主机总共至少16G内存
如果主机只有8G内存,可以先配置一台使用

网络配置说明

根据本文需要,这里只介绍最基本的与本任务相关的必要知识。
如果你的网络中,任意一台电脑直接插入网线(不需要手动配置ip地址)就能上网,那么可以跳过这一部分,对于虚拟机的网络配置,直接使用桥接(Bridged)即可。
基本网络知识介绍

  • ip地址:每台电脑或者设备,联网时至少有一个ip地址。同时也会有网关、DNS配置,才能正常上网。
  • 子网(网络链路层):最基本的网络环境,只能连接相同子网的其他电脑或设备,比如都是192.168.1.x。
  • 网关:如果要连接其他网络(或者说公网),就需要通过网关进行转发。
  • DNS:以上介绍的都是通过ip地址访问,通常使用的网址比如baidu.com需要使用DNS服务解析成ip地址。
  • DHCP:自动分配ip地址的服务。家用路由器一般会自动分配ip地址,windows的网络共享配置也会。但如果没有开启DHCP服务,就需要手动配置ip地址,在没有网关的情况下,同一网段的设备才能相互连接上。

在虚拟机的网络设置中,会涉及以下两种方式

  • Bridged(桥接):虚拟机与主机一样,接到电脑外面的交换机、路由器上。虚拟机与主机是平等的关系。
  • NAT:虚拟机把主机当作网关,虚拟机和网关在同一ip段(比如192.168.138.x),主机连接外网使用另一ip段。
    主机以外的电脑或设备,连接这些虚拟机的时候,无法直接连上,因为没有把这台主机配置为网关。

使用VMWare可以方便地直接选择NAT模式或Bridged模式;如果使用Hyper-V,想使用NAT模式,需要选择Internal(内部)网络,然后在网络连接中,找到主机连接外部网络的设备,右键属性,在里面配置共享,共享给Hyper-V的网络设备。

安装虚拟机系统

官网或者清华镜像下载CentOS系统iso文件

  • 开机选择Install
  • 时区可以改成中国
  • 硬盘需要点进去确认一下
  • 网络需要点进去打开(Enable)一下,确认配置了ip地址,建议写一个主机名,比如c1
  • 如果打算安装三台,另外两台主机可以写成c2,c3
  • 安装开始后,可以配置root用户的密码
  • 推荐新建一个用户,设置为管理员权限,并配置自己的密码

装完开机后只有黑色的命令界面,别慌,正常的

创建文件夹

创建文件夹,并设置为自己的用户权限

  1. sudo mkdir /hadoop
  2. sudo chown cdarling:cdarling /hadoop

安装Java和解压Hadoop软件

在主机使用winscp,通过虚拟机的ip地址,连接到虚拟机
官网下载java(版本SE 8),linux rpm文件,放到/hadoop目录
把hadoop-3.1.1.tar.gz放到/hadoop目录
在虚拟机上安装、解压

  1. yum install java-8.rpm
  2. tar xzf hadoop-3.1.1.tar.gz

配置/etc/hosts文件

虽然每台虚拟机可能自动获得ip地址,但如果它们没有在统一的DNS中注册(如果你看不懂,就肯定没有),那么相互还是不能通过c1,c2,c3这样的主机名找到彼此,因此需要配置hosts文件。
先查看ip地址

  1. ip addr

再修改hosts文件

  1. sudo vi /etc/hosts

比如,配置如下

  1. 192.168.1.111 c1
  2. 192.168.1.112 c2
  3. 192.168.1.113 c3

在主机上也可以进行相应配置,就能方便地通过主机名连接虚拟机了,文件位于

  1. C:\Windows\System32\drivers\etc\hosts

关防火墙

一次性关闭

  1. sudo systemctl stop firewalld

永久关闭(不随系统启动)

  1. sudo systemctl disable firewalld

配置ssh连接

为了在虚拟机系统间远程访问时,不再提示输入密码,需要配置ssh连接。

  1. ssh-keygen
  2. cd ~/.ssh
  3. cat id_rsa.pub >> authorized_hosts
  4. ssh-copy-id localhost

配置Hadoop的XML配置

配置文件都在hadoop解压后文件夹中,etc/hadoop/
首先配置JAVA_HOME,没有它,单机(standalone)模式也无法运行
在hadoop-env.sh文件中找到export JAVA_HOME这一行,去掉注释,改成:

  1. export JAVA_HOME=/usr/java/default

这时就可以运行官网的standalone示例了
下面修改配置,配置为(伪)分布式服务
core-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.default.name</name>
  4. <value>hdfs://c1:8020</value>
  5. </property>
  6. </configuration>

hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>1</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/hadoop/tmp</value>
  9. </property>
  10. </configuration>

上面比官网多了个tmp.dir配置,这是为了重启虚拟机后不会自动删除hadoop相关的namenode/datanode的数据文件,不然可能随机出现故障。
这时HDFS的配置就完成了,第一次启动HDFS服务前,要格式化。后续不要随意格式化,不然datanode找不到原来的namenode了

  1. bin/hdfs namenode -format

启动HDFS

  1. sbin/start-dfs.sh
  2. #OR
  3. #bin/hdfs --daemon start namenode
  4. #bin/hdfs --daemon start datanode

输入jps命令可以检查服务启动情况,应该会显示出Namenode和Datanode的进程名字
运行示例程序,就会使用HDFS了。具体参考官网put上去并运行示例
如果有故障,可以检查hadoop解压文件夹下的logs目录,里面有日志文件
可以使用网页访问HDFS服务,http://c1:9870(hadoop版本3)或者http://c1:50070(hadoop版本2),里面可以看启动是否完成,以及查看文件
第二次启动HDFS时可能需要一些时间,比如10秒到3分钟,等待datanode报告文件信息

下面配置YARN
mapred-site.xml

  1. <configuration>
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. </configuration>

yarn-site.xml

  1. <configuration>
  2. <property>
  3. <name>yarn.resourcemanager.hostname</name>
  4. <value>c1</value>
  5. </property>
  6. <property>
  7. <name>yarn.nodemanager.aux-services</name>
  8. <value>mapreduce_shuffle</value>
  9. </property>
  10. </configuration>

这里比官网多了个RM的hostname配置,这是为了多个主机运行的时候,知道哪个是RM主节点
workers(文件),这个文件在hadoop 2时代叫做slaves

  1. c1

这个文件是让主节点或工作节点知道,都有哪些工作节点
启动YARN:

  1. sbin/start-yarn.sh
  2. #OR
  3. #bin/yarn --daemon start resourcemanager
  4. #bin/yarn --daemon start nodemanager

这时再运行示例程序,就会把程序提交到YARN上运行了
可以使用jps检查进程,也可以使用网页查看服务情况,http://c1:8088
用完之后,可以关闭HDFS和YARN

  1. sbin/stop-yarn.sh
  2. #OR
  3. #bin/yarn --daemon start resourcemanager
  4. #bin/yarn --daemon start nodemanager
  5. sbin/stop-dfs.sh
  6. #OR
  7. #bin/hdfs --daemon start namenode
  8. #bin/hdfs --daemon start datanode

排障

由于太急了,有次配置出了问题,报错:

  1. ERROR: Cannot set priority of resourcemanager process 66447

检查${HADOOP_HOME}/logs目录中的hadoop--resourcemanager-.log
可以看到是配置文件的问题,发现把上面的标签多粘贴了一次,后来又发现有个标签少写了>引起了故障

配置集群

如果要使用三台集群,就安装配置三台虚拟机
在workers(或slaves)文件中相应调整,在hosts文件中相应调整
把ssh-copy-id在每台虚拟机上,都针对其他虚拟机的主机名运行一次,比如ssh-copy-id c2
然后在主节点上启动服务,就可以在任意一台虚拟机上运行示例程序了