目标
说明
除了本地模型直接运行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的网络设备。
安装虚拟机系统
- 开机选择Install
- 时区可以改成中国
- 硬盘需要点进去确认一下
- 网络需要点进去打开(Enable)一下,确认配置了ip地址,建议写一个主机名,比如c1
- 如果打算安装三台,另外两台主机可以写成c2,c3
- 安装开始后,可以配置root用户的密码
- 推荐新建一个用户,设置为管理员权限,并配置自己的密码
创建文件夹
创建文件夹,并设置为自己的用户权限
sudo mkdir /hadoop
sudo chown cdarling:cdarling /hadoop
安装Java和解压Hadoop软件
在主机使用winscp,通过虚拟机的ip地址,连接到虚拟机
官网下载java(版本SE 8),linux rpm文件,放到/hadoop目录
把hadoop-3.1.1.tar.gz放到/hadoop目录
在虚拟机上安装、解压
yum install java-8.rpm
tar xzf hadoop-3.1.1.tar.gz
配置/etc/hosts文件
虽然每台虚拟机可能自动获得ip地址,但如果它们没有在统一的DNS中注册(如果你看不懂,就肯定没有),那么相互还是不能通过c1,c2,c3这样的主机名找到彼此,因此需要配置hosts文件。
先查看ip地址
ip addr
再修改hosts文件
sudo vi /etc/hosts
比如,配置如下
192.168.1.111 c1
192.168.1.112 c2
192.168.1.113 c3
在主机上也可以进行相应配置,就能方便地通过主机名连接虚拟机了,文件位于
C:\Windows\System32\drivers\etc\hosts
关防火墙
一次性关闭
sudo systemctl stop firewalld
永久关闭(不随系统启动)
sudo systemctl disable firewalld
配置ssh连接
为了在虚拟机系统间远程访问时,不再提示输入密码,需要配置ssh连接。
ssh-keygen
cd ~/.ssh
cat id_rsa.pub >> authorized_hosts
ssh-copy-id localhost
配置Hadoop的XML配置
配置文件都在hadoop解压后文件夹中,etc/hadoop/
首先配置JAVA_HOME,没有它,单机(standalone)模式也无法运行
在hadoop-env.sh文件中找到export JAVA_HOME这一行,去掉注释,改成:
export JAVA_HOME=/usr/java/default
这时就可以运行官网的standalone示例了
下面修改配置,配置为(伪)分布式服务
core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://c1:8020</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
</configuration>
上面比官网多了个tmp.dir配置,这是为了重启虚拟机后不会自动删除hadoop相关的namenode/datanode的数据文件,不然可能随机出现故障。
这时HDFS的配置就完成了,第一次启动HDFS服务前,要格式化。后续不要随意格式化,不然datanode找不到原来的namenode了
bin/hdfs namenode -format
启动HDFS
sbin/start-dfs.sh
#OR
#bin/hdfs --daemon start namenode
#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
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>c1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
这里比官网多了个RM的hostname配置,这是为了多个主机运行的时候,知道哪个是RM主节点
workers(文件),这个文件在hadoop 2时代叫做slaves
c1
这个文件是让主节点或工作节点知道,都有哪些工作节点
启动YARN:
sbin/start-yarn.sh
#OR
#bin/yarn --daemon start resourcemanager
#bin/yarn --daemon start nodemanager
这时再运行示例程序,就会把程序提交到YARN上运行了
可以使用jps检查进程,也可以使用网页查看服务情况,http://c1:8088
用完之后,可以关闭HDFS和YARN
sbin/stop-yarn.sh
#OR
#bin/yarn --daemon start resourcemanager
#bin/yarn --daemon start nodemanager
sbin/stop-dfs.sh
#OR
#bin/hdfs --daemon start namenode
#bin/hdfs --daemon start datanode
排障
由于太急了,有次配置出了问题,报错:
ERROR: Cannot set priority of resourcemanager process 66447
检查${HADOOP_HOME}/logs目录中的hadoop-
可以看到是配置文件的问题,发现把上面的
配置集群
如果要使用三台集群,就安装配置三台虚拟机
在workers(或slaves)文件中相应调整,在hosts文件中相应调整
把ssh-copy-id在每台虚拟机上,都针对其他虚拟机的主机名运行一次,比如ssh-copy-id c2
然后在主节点上启动服务,就可以在任意一台虚拟机上运行示例程序了