环境准备
编号 | 主机名 | 类型 | 用户 | IP |
1 | master | 主节点 | root | 192.168.231.247 |
2 | slave1 | 从节点 | root | 192.168.231.248 |
3 | slave2 | 从节点 | root | 192.168.231.249 |
环境搭建
一、基础配置
1、安装VMware tools
将其复制到桌面
注:遇到提示按 '回车' 键,遇到 'yes/no' 输入yes
安装完成Tools后的效果如图
2、修改root密码
3、更新 apt,安装vim编译器
apt-get update
apt-get install vim
注:vim 编译器相对于 vi 编译器 对用户来说更友好,使用便捷,且有高亮关键字的功能
4、安装ssh服务
apt-get install openssh-server
5、修改ssh配置文件,允许root远程登录
vim /etc/ssh/sshd_config
更改前:
更改后:
注:将 prohibit-password 更改为 yes
6、去掉初始询问
vi /etc/ssh/ssh_config
更改前:
更改后:
7、关闭防火墙
ufw disable
ufw status
8、环境配置
(1)修改hosts文件
vim /etc/hosts
(2)添加环境变量
vim /etc/profile
(3)解压 jdk
tar -zxvf jdk1.8.0_221.tar.gz -C /usr/local/src/
重命名其名称为 jdk
mv jdk1.8.0_221 jdk
(4)hadoop配置
tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local/
重命名其名称为hadoop
mv hadoop-2.7.1 hadoop
在hadoop安装目录下创建 tmp 和 logs目录
在tmp目录下创建 data 和 name 和 journal 目录
进入hadoop配置文件目录进行修改配置文件
hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml yarn-env.sh slaves
其中hadoop-env.sh 与 yarn-env.sh 只需要修改其中的 jdk 路径
hadoop-env.sh
yarn-env.sh注:yarn-env.sh 文件中jdk路径需要去掉注释,否则无法生效
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>30000</value> <description>ms</description> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
hdfs-site.xml
<configuration> <property> <name>dfs.qjournal.start-segment.timeout.ms</name> <value>60000</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>master,slave1</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.master</name> <value>master:9000</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.slave1</name> <value>slave1:9000</value> </property> <property> <name>dfs.namenode.http-address.mycluster.master</name> <value>master:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.slave1</name> <value>slave1:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/tmp/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/tmp/data</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/tmp/journal</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> </configuration>
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration>
yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slave1</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>86400</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
slaves
master slave1 slave2
(5)zookeeper配置
解压zookeeper
tar -zxvf zookeeper-3.4.8.tar.gz -C /usr/local/src/
重命名其名称为zookeeper
mv zookeeper-3.4.8 zookeeper
在zookeeper安装目录下创建 logs 目录和 data 目录
在data目录下创建myid文件并写入内容 “1”
进入zookeeper/conf目录下,重命名 zoo_sample.cfg 为 zoo.cfg
编辑zoo.cfg文件
修改前:
修改后:
二、三台机器集群搭建
1、关机状态下克隆出另外两台虚拟机
2、三台机器分别修改静态IP
3、重启三台机器网络服务
service networking restart
4、内网与外网的检查
5、三台机器分别修改其主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
6、修改其他两台机器zookeeper/data/myid文件分别为2和3
7、重启三台机器
reboot
8、设置ssh免密
生成密钥
ssh-keygen -t rsa
分发密钥
ssh-copy-id 192.168.231.248 ssh-copy-id 192.168.231.249
9、使三台机器的环境变量生效
source /etc/profile
10、启动三台机器的zookeeper集群
bin/zkServer.sh start
bin/zkServer.sh status
11、格式化zookeeper在HA中的状态
bin/hdfs zkfc -formatZK
12、启动三台机器的 journalnode进程
sbin/hadoop-daemon.sh start journalnode
13、格式化namenode
bin/hdfs namenode -format
注:观察是否有报错信息,status是否为0,0即为初始化成功,1则报错,检查配置文件是否有误
14、启动hadoop所有进程
sbin/start-all.sh
15、格式化主从节点
复制namenode元数据到从节点
scp -r /usr/local/hadoop/tmp/* slave1:/usr/local/hadoop/tmp/
scp -r /usr/local/hadoop/tmp/* slave2:/usr/local/hadoop/tmp/
注:由于之前namenode,datanode,journalnode的数据全部存放在hadoop/tmp目录下,所以直接复制 tmp 目录至从节点
16、启动slave1的resourcemanager 和 namenode 进程
sbin/yarn-daemon.sh start resourcemanager
sbin/hadoop-daemon.sh start namenode
17、访问 resourcemanager 和 namenode 的web页面
18、杀死master端的namenode(模拟master宕机后HA的故障转移)
kill -9 (namenode进程号)
注: 可见,在naster宕机后,slave自动接替了master的工作,成为活跃状态,此为HA 的故障转移机制
19、重启master端的namenode进程,观察工作状态
sbin/hadoop-daemon.sh start namenode
注:可见,在master重新恢复状态后,slave依然为active状态,master为备用状态