本篇介绍如何使用虚拟机搭建Hadoop集群,此例搭建1个master和2个slave,如要更多的slave,方法如此类推。java
如今已经有安装了一台虚拟机,node
一、查看虚拟机的虚拟网络,设置为NAT模式:linux
编辑——>虚拟网络编辑器web
进入到虚拟网络编辑器界面后,单击VMnet8,apache
这里能够查看网关IP,默认是192.168.112.2,这个很重要,由于等下配置ifcfg-ens33文件时会用到。vim
二、自动获取IP功能初始化浏览器
VMWare须要用到自动获取IP的服务,因此须要对其进行初始化。而初始化是使用桥接模式:bash
在VMWare右下角位置,右击图标——>设置:网络
肯定以后,待机器执行完成,重复一样的操做,不过要选择NAT模式,这样子,自动获取IP服务的功能已经初始化。app
三、配置ifcfg-ens33文件
虚拟机上网的相关配置都在这个文件里面配置:
输入指令:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改ifcfg-ens33文件须要root权限,能够在Linux输入命令su,而后输入密码,再次进入ifcfg-ens33文件,上网的IP地址随便设置,通常咱们都会将网关IP的最后一位修改一下;网关IP就是第一步查看的那个网关IP;DNS1则是提供上网的服务地址,这个地址须要查看本机究竟是连了那个网络服务地址,步骤:本机打开cmd窗口,输入ipconfig命令,下图框框所示就是提供网络服务的地址,
HWADDR则是网卡地址(不必定须要填写编辑),查看网卡地址则须要退出ifcfg-ens33文件进行查看,退出操做:按esc结束编辑,按shift + :,输入命令wq(wq表示保存修改并退出,q!表示不保存修改,直接退出),按enter,在Linux终端输入命令ifconfig:
配置好以后,能够进行网络测试
四、网络测试
重启网络,输入命令:
/etc/init.d/network restart
上图所示,表示重启网络成功,但仍是要测试一下是否能够上网:
输入命令:
curl www.baidu.com
能够正常上网。那么这里,就将192.168.112.10做为本次集群的master节点。
五、建立slave节点
建立slave节点比较简单,首先关闭master节点(这个很重要),找到该节点的镜像所在的文件夹位置,对其整个镜像进行复制,粘贴。
复制、粘贴,修改文件夹名字:
新建两个虚拟机,分别为slave1和slave2,首先分别输入ifconfig查看是否显示正常,
有时候并无像上图那样显示,有可能少了ens33或者某些信息,输入命令“/etc/init.d/network restart”时,出现“Failed to start LSB:Bring up/down networking”的报错,这时要肯定是否关闭NetWorkManager服务,由于刚建立的slave和master容易出现NetWorkManager服务冲突,这时master和slave都要关闭NetWorkManager服务,并禁止开机启动该服务,输入命令:
service NetworkManager stop
chkconfig NetworkManager off
执行命令后,重启虚拟机,以后就能够正常使用。
六、关闭防火墙
不管系统防火墙(指Linux),仍是内核防火墙都要关闭。并且Master和slave都要操做。
(1)关闭系统防火墙
#查看防火墙状态,输入命令:
firewall-cmd --state
若是出现“not running”字样,说明防火墙已经关闭,若是不是这样的字样,则如下操做:
#中止防火墙,临时关闭,输入命令:
systemctl stop firewalld.service
#禁止防火墙开机启动,永久关闭,输入命令:
systemctl disable firewall.service
(2)关闭内核防火墙
#清空系统防火墙,输入命令:
iptable -F
若是没有iptable命令,能够执行下面命令下载,若是有,就忽略:
yum -y install iptable -services
#保存防火墙配置
service iptables save
#临时关闭内核防火墙,输入命令:
setenforce 0
#永久关闭内核防火墙:
vim /etc/selinux/config
添加语句:SELINUX=disabled
七、配置slave1和slave2的ifcfg-ens33文件
参考步骤3,slave1和slave2都须要配置,须要修改的地方有IPADDR,HWADDR(按实际状况修改),根据实际状况而修改,配置好,一样的重启一下网络。
将slave1的IPADDR修改成:192.168.112.11
将slave2的IPADDR修改成:192.168.112.12
八、安装JDK
默认状况下,CentOS7会自动安装了openjdk1.7和jdk1.8,但它们并非咱们想要的,因此要卸载它们。
#查看安装的JDK版本,输入命令:
rpm -q|grep jdk
#卸载原装的Open JDK,输入命令:
yum -y remove java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
yum -y remove java-1.8.0-openjdk-headless-1.7.0.65-3.b17.el7.x86_64
#安装JDK
去到Oracle官网下载Linux版本的JDK,
将压缩包导入到虚拟机里面,导入外部文件有好多种方法,这里介绍两种:(1)没有可视化界面的虚拟机,能够经过命令:rz,而后选择相应的压缩包文件,以下图:
(2)有可视化界面的虚拟机,直接将压缩包文件复制粘贴到虚拟机的桌面:以下图
这里使用了第二种方法。
导入压缩文件后,进入到桌面路径下,将导入的压缩包经过命令的方式,复制到指定的路径下(目的是方便管理),
进入虚拟机桌面路径,输入命令:
cd ~
cd ./Desktop
#复制压缩包到指定路径
复制压缩包到/usr/local/src文件夹下,在当前Desktop目录下输入命令:
cp jdk-8u201-linux-x64.tar.gz /usr/local/src/
#解压压缩包
进入/usr/local/src目录下,输入命令:cd /usr/local/src,解压jdk压缩包,输入命令:
tar -zxvf jdk-8u201-linux-x64.tar.gz
#配置环境变量
解压成功后,输入命令:
vim ~/.bashrc
新增如下参数,并用“wq”进行保存退出:
export JAVA_HOME= /usr/local/src/jdk1.8.0_201 export JRE_HOME=$JAVA_HOME/jre
export CALSSPATH=.$CLASSPATH:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
#生效配置文件
配置完,使文件生效,输入命令:
source ~/.bashrc
#验证
都配置好了就验证一下,看一下jdk版本,输入命令:
java -version
能够用一样的操做方法,将slave1和slave2的JDK也安装好。
九、配置SSH
#修改映射关系,输入命令:
vim /etc/hosts/
新增如下内容(slave1和slave2也要加):
192.168.112.10 master
192.168.112.11 slave1
192.168.112.12 slave2
#修改主机名字,输入命令:
vim /etc/sysconfig/network
新增如下内容:
NETWORKING=yes
HOSTNAME=master
#设置临时主机名称,输入命令:
hostname master
输入验证命令:
hostname
在slave1和slave2也要设置,各自将“master”改成各自机器名
#永久设置hostname名称为xxx(每一个机器都要设置):
在master节点
vim /etc/hostname
添加内容
master
在slave1和slave2也要设置,各自将“master”改成各自机器名
#生成ssh密钥
输入命令(每一个节点都要生成一次):
ssh-keygen -t rsa
在slave1和slave2分别查看id_rsa.pub文件,并将文件内容复制到mastaer中的authorized_keys里,输入命令:
cd ~
cd .ssh
vim ./authorized_keys
复制完就是下面截图这样:
而后经过远程的方式,将authorized_keys文件覆盖到slave1和slave2中(或者用一样的方式在slave1和slave2中操做),输入命令:
scp authorized_keys root@slave1:~/.ssh/
scp authorized_keys root@slave2:~/.ssh/
#验证
最后在每台机器上分别验证,各自输入命令:
ssh slave1
ssh slave2
ssh master
拿master作例子:
首先,输入:ssh slave1,
此时机器已经转到slave1节点上,使用hostname命令验证,证实master能够访问slave1,而后再输入命令:ssh master,使得机器再次回到master节点,
执行成功,说明slave1节点能够访问master;用一样的方法测试master->slave2:
退出命令:exit
十、配置Hadoop2.6.1
#解压
同步骤8同样,复制hadoop压缩包到/usr/local/src/目录中,并解压。
#配置相关文件(这里给出master节点的,slave1和slave2的经过将master的相关文件远程复制过去)
进入hadoop路径,全部操做都在该文件夹路径下操做:
cd /usr/local/src/hadoop-2.6.1/etc/hadoop
(1)为hadoop配置jdk环境
vim hadoop-env.sh
添加内容:export JAVA_HOME=/usr/local/src/jdk1.8.0_201
(2)为分布式资源管理系统配置jdk环境
vim yarn-env.sh
添加内容:export JAVA_HOME=/usr/local/src/jdk1.8.0_201
(3)配置hadoop其余节点名称
vim slaves
添加内容:
slave1
slave2
(4)配置Hadoop Core
vim core-site.xml
添加内容:
<configuration>
<!--指定namenode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!--用来指定使用hadoop时产生文件的存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/tmp</value>
</property>
</configuration>
(5)配置Hadoop hdfs
vim hdfs-site.xml
添加内容:
<configuration>
<!--配置namenode.secondary地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<!--指定hdfs中namenode的存储位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/dfs/name</value>
</property>
<!--指定hdfs中datanode的存储位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/dfs/data</value>
</property>
<!--指定hdfs保存数据的副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
(6)配置Hadoop mapper
注意:hadoop2.x没有mapred-site.xml,因此先拷贝并建立这个文件,输入命令:
cp mapred-site.xml.template mapred-site.xml
进入mapreduce配置文件:
vim mapred-site.xml
编辑文件:
<configuration>
<!--告诉hadoop之后MR(Map/Reduce)运行在YARN上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(7)配置Hadoop yarn
vim yarn-site.xml
添加内容:
<configuration>
<!--nomenodeManager获取数据的方式是shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--配置shuffle,由于map和reduce之间有个shuffle过程,-->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--为每一个rm-id设置主机:端口用来提交做业。-->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<!--调度器接口的地址。-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<!--对每一个rm-id设置NodeManager链接的host-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<!--对每一个rm-id指定管理命令的host-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<!--对每一个rm-id,指定RM webapp对应的host-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<!-- 关闭虚拟内存检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
#建立临时目录和文件目录
mkdir /usr/local/src/hadoop-2.6.1/tmp
mkdir -p /usr/local/src/hadoop-2.6.1/dfs/name
mkdir -p /usr/local/src/hadoop-2.6.1/dfs/data
#配置Hadoop的环境变量(master、slave1和slave2都要配置)
vim ~/.bashrc
添加内容:
HADOOP_HOME=/usr/local/src/hadoop-2.6.1
export PATH=$PATH:$HADOOP_HOME/bin
#从新启动资源文件
source ~/.bashrc
这个时候能够将上面再master节点下的hadoop文件下的配置文件copy到slave1和slave2里,输入命令:
scp -f /usr/local/src/hadoop-2.6.1/ root@slave1:usr/local/src/
scp -f /usr/local/src/hadoop-2.6.1/ root@slave2:usr/local/src/
十一、启动集群
#初始化Namenode,只在master节点操做,
hadoop namenode -format
注意:该命令重复执行的话,有可能会出现异常。这时须要,删除相关文件(这个后面再讲),从新初始化hadoop
#启动集群
在master节点操做
/usr/local/src/hadoop-2.6.1/sbin/start-all.sh
启动后,分别在master、slave1和slave2节点上输入命令:jps,查看节点:
(1)master节点
(2)slave1节点
(3)slave2节点
上面说起到:重复初始化hadoop会带来了异常,致使某些node没法正常启动,解决方法:
一、关闭集群,./sbin/stop-all.sh
二、删除/usr/local/src/hadoop-2.6.1/dfs/name下面的文件[每一个节点都操做]
三、删除/usr/local/src/hadoop-2.6.1/dfs/data下面的文件[每一个节点都操做]
四、删除/usr/local/src/hadoop-2.6.1/tmp下面的文件[每一个节点都操做]
五、删除/usr/local/src/hadoop-2.6.1/logs下面的文件[每一个节点都操做]
六、从新格式化hadoop,输入命令:hadoop namenode -format [只在master节点操做]
七、启动集群,./sbin/start-all.sh
#监控网页
在浏览器输入地址:192.168.112.10:8088(这个是master:8088)
#关闭集群
/usr/local/src/hadoop-2.6.1/sbin/stop-all.sh