快速搭建Hadoop集群指南
准备工作
- VMware Workstation 15 中安装虚拟机 ,版本为centos6.8(我搭建的集群为三台,安装一台克隆两台,)简单的使用三个节点作为集群环境: 一个作为 Master 节点,局域网 IP 为 192.168.1.100;另外两个作为 Slave 节点,局域网 IP 为 192.168.1.101和192.168.1.102。
- JDK1.8
- hadoop2.7.2
准备一台初始化好的主机
在搭建集群之前,需要先准备一台设置了静态网络以及进行了其他配置的主机,方便后面克隆。在这里,我在配置好的主机上加上快照,再通过克隆可以搭建好整个集群。
设置静态IP
1. 查看网络IP和网关
查看虚拟网络编辑器,如下:
修改ip地址为192.168.1.0,如图所示:
查看网关,如图所示(192.168.1.2):
查看windows环境的中VMnet8网络配置,如图所示:
2. 配置网络ip地址
修改IP地址,如图所示:
命令:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx #MAC地址
TYPE=Ethernet #网络类型(通常是Ethemet)
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id
#系统启动的时候网络接口是否有效(yes/no)
ONBOOT=yes
# IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
BOOTPROTO=static
#IP地址
IPADDR=192.168.1.100
#网关
GATEWAY=192.168.1.2
#域名解析器
DNS1=192.168.1.2
IP修改后:
:wq 保存退出
修改了IP地址为静态的192.168.100后,需要通过重启网络服务或重启机器使之生效
执行
service network restart
如图所示:
如果报错,reboot,重启虚拟机
3. 配置主机名
查看当前服务器主机名称
[root@hadoop100 桌面]$ hostname
修改主机名称
1. 修改linux的主机映射文件(hosts文件)
如果感觉此主机名不合适,我们可以进行修改。通过编辑/etc/sysconfig/network文件
[root@hadoop100 桌面]$ vi /etc/sysconfig/network
文件中内容
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME= hadoop100 # 这是我修改后的
打开此文件后,可以看到主机名。修改此主机名为我们想要修改的主机名hadoop100
: wq
保存退出
打开/etc/hosts配置集群中各个机器的主机名和其对应IP地址的映射(配置了之后就可以直接通过主机名来互相通信了)
[root@hadoop100 桌面]$ vim /etc/hosts
添加如下内容
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
192.168.1.105 hadoop105
192.168.1.106 hadoop106
192.168.1.107 hadoop107
192.168.1.108 hadoop108
重启设备,重启后,查看主机名,已经修改成功
2. 修改window10的主机映射文件(hosts文件)
进入C:\Windows\System32\drivers\etc路径
打开hosts文件并添加如下内容(这个映射和前面在linux虚拟机上配置的一定要一致)
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
192.168.1.105 hadoop105
192.168.1.106 hadoop106
192.168.1.107 hadoop107
192.168.1.108 hadoop108
保存退出
4. 关闭防火墙
查看防火墙状态
[root@hadoop100桌面]$ service iptables status
临时关闭防火墙
[root@hadoop100桌面]$ service iptables stop
配置开机启动时关闭防火墙
[root@hadoop100桌面]$ chkconfig iptables off
通过如下命令可以查看防火墙在各个运行级别的启动情况,如果都是关闭,就成功了
[root@hadoop100桌面]$ chkconfig iptables off
检查是否成功
-
可以通过ifconfig来查看IP是否配置成功
-
通过虚拟机ping www.baidu 看看虚拟机能不能通公网
-
通过虚拟机ping 主机 看看虚拟机能不能Ping通主机
-
通过主机ping 虚拟机名 看能不能ping 通
克隆虚拟机搭载集群
1. 克隆虚拟机
1.关闭要被克隆的虚拟机
2.找到克隆选项,如图所示
3.欢迎页面,如图所示
4.克隆虚拟机,如图所示
5.设置创建完整克隆,如图所示
6.设置克隆的虚拟机名称和存储位置,如图所示
7.等待正在克隆
8.点击关闭,完成克隆
9.修改克隆后虚拟机的ip
[root@hadoop101 /]$ vim /etc/udev/rules.d/70-persistent-net.rules
进入如下页面,删除eth0该行;将eth1修改为eth0,同时复制物理ip地址,如图所示
10.修改IP地址
[root@hadoop101 /]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
(1)把复制的物理ip地址更新
HWADDR=00:0C:2x:6x:0x:xx #MAC地址
(2)修改成你想要的ip
IPADDR=192.168.1.101 #IP地址
11.修改主机名称
vi /etc/sysconfig/network
12.重新启动服务器(reboot)
同样的步骤,我们再克隆一个节点hadoop102,通过Xshell
来远程连接3台机器
检查各个节点之间能够互相ping通,虚拟机的集群就搭建好了。
2. 安装jdk8,hadoop2.7.2 并完成相关配置
在安装配置相关软件之前,我们要先创建用户来方便我们管理这些集群(避免使用root用户误操作导致巨大的错误发生)
2.1 创建sudoer用户
创建atguigu用户
因为我是跟着尚硅谷的hadoop教程来搭的集群,所以就直接使用atguigu作为要创建的用户名
useradd atguigu
通过id 用户名
可以查看创建的用户
通过passwd 用户名
指定登陆密码
passwd atguigu
配置atguigu用户具有root权限,在这里需要修改配置文件 /etc/sudoers
vi /etc/sudoers
修改 /etc/sudoers 文件,找到下面一行(91行),在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
atguigu ALL=(ALL) NOPASSWD:ALL # 配置成采用sudo命令时,不需要输入密码
修改完毕,现在可以用atguigu帐号登录,然后用命令 sudo ,即可获得root权限进行操作.
2.2 安装具体的软件
在安装前,我们先在/opt目录下创建module、software文件夹,方便管理软件和包。
[atguigu@hadoop101 opt]$ sudo mkdir module
[atguigu@hadoop101 opt]$ sudo mkdir software
修改module、software文件夹的所有者为atguigu
[atguigu@hadoop101 opt]$ sudo chown atguigu:atguigu module/ software/
[atguigu@hadoop101 opt]$ ll
总用量 8
drwxr-xr-x. 2 atguigu atguigu 4096 1月 17 14:37 module
drwxr-xr-x. 2 atguigu atguigu 4096 1月 17 14:38 software
2.2.1 安装JDK
-
卸载现有JDK
(1)查询是否安装Java软件:[atguigu@hadoop101 opt]$ rpm -qa | grep java
(2)如果安装的版本低于1.7,卸载该JDK:
[atguigu@hadoop101 opt]$ sudo rpm -e 软件包
(3)查看JDK安装路径:
[atguigu@hadoop101 ~]$ which java
-
用SecureCRT工具将JDK导入到opt目录下面的software文件夹下面。
-
在Linux系统下的opt目录中查看软件包是否导入成功
[atguigu@hadoop101 opt]$ cd software/ [atguigu@hadoop101 software]$ ls hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz
-
解压JDK到/opt/module目录下
[atguigu@hadoop101 software]$ tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
- 配置JDK环境变量
(1)先获取JDK路径
[atguigu@hadoop101 jdk1.8.0_144]$ pwd
/opt/module/jdk1.8.0_144
(2)打开/etc/profile文件
[atguigu@hadoop101 software]$ sudo vi /etc/profile
在profile文件末尾添加JDK路径
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
(3)保存后退出:wq
(4)让修改后的文件生效
[atguigu@hadoop101 jdk1.8.0_144]$ source /etc/profile
- 测试JDK是否安装成功
[atguigu@hadoop101 jdk1.8.0_144]# java -version
java version "1.8.0_144"
注意:重启(如果java -version可以用就不用重启)
[atguigu@hadoop101 jdk1.8.0_144]$ sync
[atguigu@hadoop101 jdk1.8.0_144]$ sudo reboot
2.2.2 安装hadoop
-
用SecureCRT工具将hadoop-2.7.2.tar.gz导入到opt目录下面的software文件夹下面
-
进入到Hadoop安装包路径下
[atguigu@hadoop101 ~]$ cd /opt/software/
-
解压安装文件到/opt/module下面
[atguigu@hadoop101 software]$ tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
-
查看是否解压成功
[atguigu@hadoop101 software]$ ls /opt/module/ hadoop-2.7.2
-
将Hadoop添加到环境变量
(1)先获取Hadoop安装路径
[atguigu@hadoop101 hadoop-2.7.2]$ pwd /opt/module/hadoop-2.7.2
(2)打开/etc/profile文件
[atguigu@hadoop101 software]$ sudo vi /etc/profile
在profile文件末尾添加HADOOP路径
##HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
(3)保存后退出:wq
(4)让修改后的文件生效
[atguigu@ hadoop101 hadoop-2.7.2]$ source /etc/profile
-
测试是否安装成功
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop version Hadoop 2.7.2
-
如果Hadoop命令不能用,就重启
[atguigu@ hadoop101 hadoop-2.7.2]$ sync [atguigu@ hadoop101 hadoop-2.7.2]$ sudo reboot
2.3 分布式配置hadoop
2.3.1 同步集群内的机器
在完成配置之前,我们需要在准备的3台虚拟机上同步hadoop以及jdk的安装和环境变量的设置,这里提供了两种方式
方式1:手动进入hadoop101和hadoop102,然后进行如hadoop100的操作(如上)-解压tar-gz包,编辑环境变量
方式2:利用shell脚本,一键同步所有机器。
进入hadoop100机,在/home/atguigu目录下创建bin目录,并在bin目录下创建xsync文件
[atguigu@hadoop100 ~]$ mkdir bin
[atguigu@hadoop100 ~]$ cd bin/
[atguigu@hadoop100 bin]$ touch xsync
[atguigu@hadoop100 bin]$ vi xsync
文件内容如下:shell脚本如下:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环,注意修改100 和 103的区间,根据自己的集群机器名来修改
for((host=100; host<103; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
修改脚本 xsync 具有执行权限
[atguigu@hadoop100 bin]$ chmod 777 xsync
调用脚本形式:xsync 文件名称
[atguigu@hadoop100 bin]$ xsync /home/atguigu /bin # 测试脚本能不能成功运行
如果脚本能成功运行,在各个机器的bin目录下应该都能找到xsync文件
在测试脚本可以成功运行后,我们进入hadoop和jdk的安装目录/opt/module
[atguigu@hadoop100 ~]$ cd /opt/module/
然后运行脚本,把module目录同步到其他节点机器
[atguigu@hadoop100 module]$ xsync hadoop-2.7.2
[atguigu@hadoop100 module]$ xsync jdk1.8.0_144
同步完成就可以开始各个节点的配置了。
2.3.2 集群的配置
1.集群部署规划
hadoop100 | hadoop101 | hadoop102 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2.配置集群
先进入存放配置文件的目录下
[atguigu@hadoop100 module]$ cd hadoop-2.7.2/etc/hadoop/
(1)核心配置文件
- 配置core-site.xml
[atguigu@hadoop100 hadoop]$ vi core-site.xml
在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(2)HDFS配置文件
-
配置hadoop-env.sh
[atguigu@hadoop100 hadoop]$ vi hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置hdfs-site.xml
[atguigu@hadoop100 hadoop]$ vi hdfs-site.xml
在该文件中编写如下配置
<property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定Hadoop辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop102:50090</value> </property>
(3)YARN配置文件
-
配置yarn-env.sh
[atguigu@hadoop102 hadoop]$ vi yarn-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ vi yarn-site.xml
在该文件中增加如下配置
<!-- Reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop101</value> </property>
(4)MapReduce配置文件
-
配置mapred-env.sh
[atguigu@hadoop102 hadoop]$ vi mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置mapred-site.xml
[atguigu@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml [atguigu@hadoop102 hadoop]$ vi mapred-site.xml
在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
3. 在集群上分发配置好的Hadoop配置文件
利用刚刚写的shell脚本完成分发
[atguigu@hadoop100 hadoop]$ xsync /opt/module/hadoop-2.7.2/
查看文件分发情况
[atguigu@hadoop102 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
2.4 集群单点启动
(1)如果集群是第一次启动,需要格式化NameNode
[atguigu@hadoop100 hadoop-2.7.2]$ hadoop namenode -format
注意,在后面的每次启动都不要再初始化NameNode了,否则会出现DataNode启动失败,解决的方案是将hadoop安装目录下的
/opt/module/hadoop-2.7.2/data/tmp/dfs
中的data 文件删除,然后重新启动数据节点
(2)在hadoop100上启动NameNode
[atguigu@hadoop100 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
[atguigu@hadoop100 hadoop-2.7.2]$ jps
3461 NameNode
(3)在hadoop100、hadoop101以及hadoop102上分别启动DataNode
[atguigu@hadoop100 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop100 hadoop-2.7.2]$ jps
3461 NameNode
3608 Jps
3561 DataNode
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop101 hadoop-2.7.2]$ jps
3190 DataNode
3279 Jps
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
3237 Jps
3163 DataNode
(4)在hadoop102上启动secondnamenode
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start secondnamenode
通过浏览器访问http://hadoop100:50070/dfshealth.html#tab-datanode可以看到集群中DataNode的情况,如下:
启动成功,至此完成了hadoop集群的搭建和单点启用。
2.5 群起集群
如果每次集群的启动都是单点式,即在每台机器上进行相关的启动操作如hadoop-daemon.sh start datanode
,会显得很繁琐,所以hadoop官方提供了群起集群的脚本,但是前提是需要配置SSH无密登陆.
2.5.1 SSH无密登陆配置
(1)免密登录原理,如图所示
(2)生成公钥和私钥:
[atguigu@hadoop100 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
[atguigu@hadoop100 .ssh]$ ssh-copy-id hadoop100
[atguigu@hadoop100 .ssh]$ ssh-copy-id hadoop101
[atguigu@hadoop100 .ssh]$ ssh-copy-id hadoop102
同样的操作需要在hadoop101和hadoop102上再来以便,保证所有机器互相免密登陆
-
有一个非常简单的方式来配置无密登陆SSH,直接利用之前编写的xsync将hadoop100上生成的公私钥对以及自己的.ssh/authorized_keys 同步到其他节点即可:
[atguigu@hadoop100 .ssh]$ ssh-copy-id hadoop100 [atguigu@hadoop100 .ssh]$ cd # 跳回到家目录,因为.ssh在家目录下 [atguigu@hadoop100 ~]$ xsync .ssh
附上表 .ssh文件夹下(~/.ssh)的文件功能解释:
known_hosts | 记录ssh访问过计算机的公钥(public key) |
---|---|
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
2.5.2 群起集群
(1) 配置slave
在完成了SSH无密码登陆配置后,还需要配置hadoop安装目录中etc/hadoop/下的slaves,告诉hadoop哪些机器是担当了DataNode的从机器(slave-仆从)
修改salves中的信息为如下(vim slaves):
同步所有节点配置文件
[atguigu@hadoop100 hadoop]$ xsync slaves
每次改完配置文件都一定要同步!!!血泪教训
(2) 启动HDFS
然后在配置了NameNode的节点上启动HDFS,我的NameNode是配置在hadoop100上的,所以执行如下shell
[atguigu@hadoop100 hadoop-2.7.2]$ start-dfs.sh
(3) 启动Yarn
再然后在配置了ResourceManager的节点上 启动YARN,我是ResourceManager配置在hadoop101上。执行如下命令
[atguigu@hadoop101 hadoop]$ start-yarn.sh
检查启动情况
- 通过访问http://hadoop100:50070/检查一下hdfs是否成功启用(hadoop100是hdfs的NameNode,所以ip地址是hadoop100)
- 通过访问http://hadoop101:8088/检查Yarn(ResouceManager是部署在hadoop101的,所以IP地址是hadoop101)
-
再看看能不能跑一个MapReduce(直接用WordCount)
-
在hadoop安装目录里创建一个目录wcinput,并且在里面编辑一个文件wc.input,内容如下:
hadoop yarn hadoop mapreduce atguigu atguigu
-
将本地磁盘的wcinput上传到hdfs文件操作系统中
[atguigu@hadoop100 hadoop-2.7.2]$ hadoop fs -put wcinput / # 将wcinput上传到hdfs的根目录
-
使用hadoop内置examplejar运行wordcount实例
[atguigu@hadoop100 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wcinput /output
命令的解释
执行成功的显示:
-
至此,hadoop集群(完全分布式)的搭建就完成了!!!!
后话
在经历了这次整整三天搭建hadoop集群的过程后,笔者最深的感悟是对linux系统操作的熟悉度对于大数据开发者的重要性,很多命令的不熟悉会导致你各种失误的操作,搭集群是个细活,大家一定要记得在完成每一步操作后检查,否则到后面很难找到原因,同样,快速查看log排错也是大数据开发者需要掌握的技能,共勉!