Hadoop完全分布式平台搭建
【讲在前面】
Hadoop完全分布式集群的搭建需要多台虚拟机,每台虚拟机单独安装配置比较麻烦,因此我们可以在VMware中创建一个虚拟机后完成公共的基础配置然后直接创建完整克隆,这样效率比较高。
Hadoop完全分布式集群的搭建是典型的主从架构,即一台master节点多台slave节点,这里我采用三台虚拟机,一台作为master
节点,另外两台作为slave1
节点和slave2
节点。
所需安装包:jdk安装包、Hadoop安装包(资源里面有我用的版本) 如果没有特殊说明本操作都是在Xshell中完成的。
安装建议:我这里安装统一在根目录下创建一个export文件夹,然后在export文件夹中创建两个文件夹servers(安装软件的文件夹),softwares(存放安装包的目录) or 在/usr/local/
下安装。
mkdir -p /export/servers
mkdir -p /export/softwares
1. 静态IP的配置
centos7安装完成后网卡默认是不启动的首先 ifconfig
或 ip a
查看网卡名称。然后修改相关的配置文件。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将BOOTPROTO修改为static
BOOTPROTO=static
最后一行ONBOOT改为yes
ONBOOT=yes
添加如下内容:
IPADDR=填IP地址
NETMASK=子网掩码
GATEWAY=网关IP
DNS1=8.8.8.8
DNS2=8.8.4.4
重启网络服务:
代码语言:javascript复制systemctl restart network
如果能ping同外网说明静态IP配置成功
代码语言:javascript复制ping www.qq.com
2. jdk的安装
将jdk安装包上传至softwares文件夹中,并解压缩至servers文件夹中。
代码语言:javascript复制 cd /export/softwares/
rz
选中jdk压缩包,上传至当前目录下
代码语言:javascript复制 mv jdk-8u161-linux-x64.tar.gz jdk
tar -zxvf jdk -C ../servers/
如果rz命令报错,则执行如下安装后再执行
代码语言:javascript复制 yum -y install lrzsz
配置jdk的环境变量
在/etc/profile文件的末尾添加如下环境变量:
代码语言:javascript复制export JAVA_HOME=/export/servers/jdk
export PATH=$PAHT:$JAVA_HOME/bin
保存后退出。
重新加载配置文件使刚才配置的环境变量生效。
代码语言:javascript复制 source /etc/profile
查看是否配置成功:
输入java -version出现jdk的版本信息即为安装配置成功。
上面的静态IP配置和jdk的安装在每台机器上都需要配置,所以在一台机器上配置成功后直接克隆该虚拟机(注意要创建完整克隆),注意,克隆完成后IP地址三台都相同,需要你把克隆的两台虚拟机在配置文件中把IP修改一下,修改完成后,重启网络服务,看看相互间能不能ping通,如果能ping通则说明IP修改成功。
重启网路服务:
代码语言:javascript复制systemctl restart network
————————————————
3. 修改虚拟机的主机名,并添加映射
修改/etc/hostname文件,将默认的第一行删掉,然后改为master,重启虚拟机,主机名修改生效。
同样的做法修改其他的两台虚拟机的主机名分别为:slave1、slave2,并重启虚拟机。
编辑/etc/hosts文件,追加如下内容(注意IP地址要改成自己的IP地址):
代码语言:javascript复制 192.168.200.200 maste
192.168.200.201 slave1
192.168.200.202 slave2
在其他两台机器上也追加同样的内容。
验证是否更改成功就看相互间能不能ping通。例如在任意一台机器上执行如下命令:
代码语言:javascript复制ping master
ping slave1
ping slave2
4. 配置SSH免密登录
检查SSH是否已经安装(centos7默认是安装了的)
rpm -qa | grep ssh
出现如下结果即为已经安装:
代码语言:javascript复制 openssh-7.4p1-21.el7.x86_64
libssh2-1.8.0-3.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
如果没有安装的话则需手动安装:
代码语言:javascript复制 yum -y install openssh-serve
yum -y install openssh-clients
提示:如果没有安装openssh-clients的话,当执行ssh和scp命令的时候会报错,提示找不到该命令。
测试SSH是否可用(该IP地址为要登录目标机器的IP地址:也就是子节点的IP地址)
代码语言:javascript复制 ssh 192.168.200.201
按照提示输入目标机器的登录密码,登陆成功后说明ssh可用,然后执行如下命令返回最初的主机
代码语言:javascript复制 exit
生成密钥
代码语言:javascript复制 ssk-keygen
该过程需要反复确认,之间按回车就可以,注意:有时候需要回答yes或者no!!!
在master节点上对所有节点进行免密登录操作,包括master节点:
代码语言:javascript复制 ssh-copy-id maste
ssh-copy-id slave1
ssh-copy-id slave2
由于master需要启动slave节点上的服务,所以需要master登录slave,因此把在master节点上执行上面的命令。
5. 配置时间同步服务
检查是否安装ntp服务
代码语言:javascript复制 rpm -qa | grep ntp
没有安装的话安装ntp服务
代码语言:javascript复制 yum -y install ntp
设置master节点为NTP时间同步服务的主节点(即以master节点的时间为准)
编辑/etc/ntp.conf文件,注释掉以server开头的行,并添加如下代码:
代码语言:javascript复制 restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10
配置节点时间同步(从master节点上获取时间)
在slave1、slave2节点中同样修改/etc/ntp.conf文件,注释掉以server开头的行,添加如下代码:
代码语言:javascript复制 server maste
设置子节点每10分钟和master(时间服务器)同步一次时间
代码语言:javascript复制 crontab -e
编写定时任务:
代码语言:javascript复制 */10 * * * * /usr/sbin/ntpdate maste
启动NTP服务
在master节点上启动ntp服务并加入开机自启
代码语言:javascript复制 service ntpd start & chkconfig ntpd on
在从节点上(slave1、slave2)上手动同步一次时间
代码语言:javascript复制 ntpdate maste
在从节点上(slave1、slave2)上启动ntp服务并加入开机自启
代码语言:javascript复制 service ntpd start & chkconfig ntpd on
查看ntp服务器有无和上层ntp连通
代码语言:javascript复制 ntpstat
这个命令可能会看到 unsynchronised 这是正常情况,因为配置完成后,需要等待一会儿才能和/etc/ntp.conf中配置的标准时间进行同步。
查看ntp服务器和上层ntp的状态
代码语言:javascript复制 ntpq -p
代码语言:javascript复制 参数说明:
when: 多少秒前进行过时间同步
poll: 下次更新在多少秒后
reach: 已经向上层ntp服务器要求更新的次数
delay: 网络延迟
offser: 时间补偿值
jitter: 系统时间与BIOS时间差
测试是否配置成功
在任意节点上修改时间:
代码语言:javascript复制 date -s "2011-11-11 11:11:11"
等待十分钟后查看时间是否同步(实验时可以把10分钟调整为1分钟,节省时间)
代码语言:javascript复制 date
扩展:如果需要和外网时间保持时钟同步的话就需要设置定时任务(其实虚拟机时间已经和网络上的时间同步了),我这里使用阿里云服务器的时间。----在master上操作
启动定时任务:
代码语言:javascript复制 crontab -e
添加如下代码:分别代表 分 时 日 月 周
代码语言:javascript复制 */1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com
6. Hadoop安装(master上操作)
注:有关更多详细的配置信息,可以去Hadoop官网查看,打开后滑到页面的最下方,左下角Configuration下就有各个配置文件详细信息的链接。
解压Hadoop安装包
进入到softwares目录
代码语言:javascript复制 tar -zxvf hadoop-2.7.2.tar.gz -C ../servers/
cd ../servers/
mv hadoop-2.7.2.tar.gz hadoop
配置环境变量
在/etc/profile文件中添加如下内容:
代码语言:javascript复制 export HADOOP_HOME=/export/servers/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存后记得source /etc/profile
修改配置文件
所有的配置文件都在如下路径中:
代码语言:javascript复制 hadoop/etc/hadoop/
1
slaves
该配置文件保存slave节点的信息即节点的机器名称,删掉localhost修改为如下内容:
代码语言:javascript复制 slave1
slave2
代码语言:javascript复制core-site.xml
Hadoop的核心配置文件
代码语言:javascript复制在<configuration></configuration>之间添加如下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/export/servers/hadoop/tmp</value>
</property>
fs.defaultFS属性是指定默认文件系统,他的值为hdfs以及master节点端口。
hadoop.tmp.dir属性是指定hdfs临时数据保存在哪个目录,默认值是Linux的tmp目录。
hdfs-site.xml
HDFS相关的配置文件
代码语言:javascript复制在<configuration></configuration>之间添加如下内容:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/export/servers/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/export/servers/hadoop/tmp/dfs/data</value>
</property>
dfs.replication属性表示数据块副本的数量,它的值默认为3,这里我们为了方便测试将它设置为1。
dfs.namenode.name.dir属性表示NameNode的临时数据存放目录。
dfs.namenode.data.dir属性表示DataNode的临时数据存放目录。
mapred-site.xml
MapReduce的相关配置
对文件mapred-site.xml重命名,默认文件名为mapred-site.xml.template,并更改mapred-site.xml配置:
代码语言:javascript复制 mv mapred-site.xml.template mapred-site.xml
在<configuration></configuration>之间添加如下内容:
代码语言:javascript复制 <property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
mapreduce.framework.name属性表示MapReduce程序的运行框架,默认值为local,也就是本地运行,这里我们设置为yarn,让MapReduce程序运行在YARN框架上。
代码语言:javascript复制yarn-site.xml
YARN框架的配置
代码语言:javascript复制在<configuration></configuration>之间添加如下内容:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
yarn.resourcemanager.hostname属性指定ResourceManager运行在哪个节点上。
yarn.nodemanager.aux-services属性指定YARN的默认混洗方式,设置为MapReduce的默认混洗算法。
hadoop-env.sh
代码语言:javascript复制Hadoop运行基本环境配置,自动化脚本启动的时候要用。
export JAVA_HOME=/export/servers/jdk
在文件的第25行位置,把前面的注释去掉,然后把后面的路径改为你JAVA_HOME的路径。
自此Hadoop就算配置完成了,这只是设置了正常启动所必须的设置项!!
7. Hadoop文件夹的分发
在master节点上配置好所有的配置文件后,将Hadoop文件夹分发给另外的两台子节点
代码语言:javascript复制scp -r /export/servers/hadoop slave1:/export/servers/
scp -r /export/servers/hadoop slave2:/export/servers/
8. 集群启动
启动集群前一定要关闭防火墙,注意,每台机器的防火墙都要关闭!!!
代码语言:javascript复制查看防火墙状态:
systemctl status firewalld
关闭防火墙:
systemctl stop firewalld
设置防火墙开机不启动(永久关闭防火墙,如果后面需要还可以手动打开):
systemctl disable firewalld
打开防火墙:
systemctl start firewalld
第一次启动前要格式化NameNode(后面启动的时候就不需要格式化了)
代码语言:javascript复制 hdfs namenode -format
如果忘记格式化启动后,需要关掉所有namenode和datanode进程,然后删掉data和log数据,然后重新格式化。
集群启动方式分为两种,一种是手动启动,一种是自动化脚本启动
手动启动
代码语言:javascript复制 1. 启动HDFS :
启动NameNode(master节点):
hadoop-daemon.sh start namenode
启动DataNode(在Slave节点):
hadoop-daemon.sh start datanode
启动SecondaryNameNode(在任意节点):
hadoop-daemon.sh start secondarynamenode
2. 启动YARN :
启动ResourceManager(在Master节点):
yarn-daemon.sh start resourcemanage
启动NodeManager(在Slave节点):
yarn-daemon.sh start nodemanage
3. 启动历史任务服务:
mr-jobhistory-daemon.sh start historyserve
自动化脚本启动(master节点上执行)
1. 启动HDFS :
代码语言:javascript复制
start-dfs.sh
2. 启动YARN :
start-yarn.sh
3. 启动历史任务服务:
代码语言:javascript复制 mr-jobhistory-daemon.sh start historyserve
注:还有一个脚本是:start-all.sh,但是一般不建议使用,容易出错。
14
查看进程
jps
在master上看到如下进程即为启动成功:
代码语言:javascript复制 [root@master ~]# jps
2016 ResourceManage
2353 Jps
1636 NameNode
1845 SecondaryNameNode
2310 JobHistoryServe
[root@master ~]#
在slave上看到如下进程即为启动成功:
代码语言:javascript复制
[root@slave1 ~]# jps
1554 DataNode
1830 Jps
1671 NodeManage
[root@slave1 ~]#
说明:
NameNode、SecondaryNameNode是HDFS在master上的进程,DataNode是HDFS在slave上的进程,这三个进程存在,说明HDFS启动成功。
ResourceManager是YARN在master上的进程,NodeManager是YARN在slave上的进程,这两个进程存在,说明YARN启动成功。
JobHistoryServer是历史服务的进程。
查看网页
集群启动后可以在浏览器中输入IP地址加端口号,访问它的UI页面,查看集群的详细信息。
代码语言:javascript复制 查看HDFS集群详细信息:
192.168.200.200:50070
查看YARN集群详细信息:
192.168.200.200:8088
查看historyserver历史服务详细信息:
192.168.200.200:19888
关闭进程
把开启服务命令中的start改为stop即可。