假设以三台服务器来安装Hadoop
IP | hostname |
192.168.0.102 | hadoop102 |
192.168.0.103 | hadoop103 |
192.168.0.104 | hadoop104 |
组件版本
组件 | 版本 |
Java | 1.8 |
zookeeper | 3.4.14 |
hadoop | 3.1.3 |
一、环境准备
1.三台同时配置hosts文件
vim /etc/hosts
#添加如下文字
192.168.0.102 hadoop102
192.168.0.103 hadoop103
192.168.0.104 hadoop104
2.三台同时安装jdk, 确认版本号相同,否则每台server都需要手动调整java_home的路径
#安装 jdk
yum install -y java-1.8.0-openjdk-devel.x86_64
3.三台同时创建hadoop用户,设定相同的密码(123456)
adduser hadoop
passwd hadoop
4.三台同时创建文件夹并授权给hadoop账户
mkdir /opt/module
mkdir /opt/software
mkdir -p /opt/data/journalnode
mkdir -p /opt/data/journaldata
mkdir -p /opt/data/zookeeper
chown -R hadoop:hadoop /opt/module
chown -R hadoop:hadoop /opt/data
chown -R hadoop:hadoop /opt/software
5.三个台都要配置hadoop用户的JAVA_HOME
vim /etc/profile
#更新原始的path设定
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#使配置文件生效
source /etc/profile
6.在hadoop102,交换免密登录的密钥,保证hadoop102与另外的节点互通
su hadoop
#持续回车即可,最终会产生ssh的key在home下
ssh-keygen -t rsa
#交换密钥
ssh-copy-id hadoop102 #注意:本机也需要执行
ssh-copy-id hadoop103
ssh-copy-id hadoop104
#测试密钥是否交换成功,直接输出即代表成功,如 Thu Jan 2 21:58:40 EST 2020
ssh hadoop102 date
ssh hadoop103 date
ssh hadoop104 date
环境准备到此结束。
二、安装Zookeeper
1.在hadoop102,下载压缩包
cd /opt/software
wget https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xvf zookeeper-3.4.14.tar.gz -C /opt/module
2.复制样例配置文件zoo_sample.cfg为zoo.cfg
cp /opt/module/zookeeper-3.4.14/conf/zoo_sample.cfg /opt/module/zookeeper-3.4.14/conf/zoo.cfg
3.修改zoo.cfg配置文件
vim /opt/module/zookeeper-3.4.14/conf/zoo.cfg
dataDir=/opt/data/zookeeper
server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888
4.在hadoop102,将配置好的zookeeper文件夹,分发到其他节点
scp -r /opt/module/zookeeper-3.4.14 hadoop@hadoop103:/opt/module/zookeeper-3.4.14
scp -r /opt/module/zookeeper-3.4.14 hadoop@hadoop104:/opt/module/zookeeper-3.4.14
5.三台服务器, 每台创建不一样的server id标识
touch /opt/data/zookeeper/myid
vim /opt/data/zookeeper/myid
#hadoop102输入1, hadoop103输入2, hadoop104输入3
6.三台服务器同时启动zk
# 启动zookeeper
/opt/module/zookeeper-3.4.14/bin/zkServer.sh start
# 查看状态
/opt/module/zookeeper-3.4.14/bin/zkServer.sh status
Zookeeper安装完毕!
三、安装hadoop
在一台上配置完毕后,再分发给其他节点,减少配置出错的概率和工作量。
1.在hadoop102,下载压缩包
#下载hadoop
cd /opt/software
wget https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module
2.在hadoop102,给hadoop-env.sh设定java_home,hadoop_home
vim /opt/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
#定位到JAVA_HOME附近,添加如下内容
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/
export HADOOP_HOME=/opt/module/hadoop-3.1.3/
#使配置文件生效
source /opt/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
3.配置core-site.xml
<configuration>
<!-- 把两个NameNode的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-2.7.2/data/tmp</value>
</property>
<!-- zookeeper集群地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<!-- JournalNode守护程序将存储其本地状态的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/apps/journaldata</value>
</property>
</configuration>
4.配置hdfs-site.xml
<configuration>
<!-- 数据的副本数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 此新名称服务的逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 命名空间中namenodes的id -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 每个NameNode监听的标准RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop104:9000</value>
</property>
<!-- 每个NameNode监听的标准HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop104:50070</value>
</property>
<!-- 共享存储目录的位置 -->
<property>
<name> dfs.namenode.shared.edits.dir </name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster </value>
</property>
<!-- HDFS客户端用于连接NameNode的Java类 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 脚本或Java类的列表,这些列表将用于在故障转移期间隔离Active NameNode -->
<!-- 配置ssh 免密登录 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- ssh 链接超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 这是JournalNode进程保持逻辑状态的路径。这里在linux服务器文件的绝对路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/apps/journalnode</value>
</property>
<!-- 设置故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
5.配置yarn-site.xml
<configuration>
<!--mapreduce执行shuffle(洗牌的意思)获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 启用 ResourceManager 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 声明两台resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mycluster</value>
</property>
<!-- RM的逻辑ID列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 对于每个rm-id,指定RM对应的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<!-- 对于每个rm-id,请指定RM https Web应用程序对应的host:port -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop102:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop103:8088</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- zookeeper 集群地址 -->
<property>
<name>hadoop.zk.address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
6.配置mapred-site.xml
<configuration>
<!-- 执行框架设置为Hadoop YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop104:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop104:19888</value>
</property>
</configuration>
7.在hadoop102,修改workers文件
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
8.在hadoop102,将配置好的hadoop文件夹,分发到其他节点
cd /opt/module/hadoop-3.1.3
#拷贝
scp -r /opt/module/hadoop-3.1.3 hadoop@hadoop103:/opt/module/hadoop-3.1.3
scp -r /opt/module/hadoop-3.1.3 hadoop@hadoop104:/opt/module/hadoop-3.1.3
9.格式化hdfs,先启动zookeeper
分别在hadoop102、hadoop103、hadoop104上启动journalnode
/opt/module/hadoop-3.1.3/bin/hdfs --daemon start journalnode
运行jps检查journalnode进程
10.在hadoop102节点,格式化hdfs
/opt/module/hadoop-3.1.3/bin/hdfs namenode -format
11.在hadoop102节点启动namenode
/opt/module/hadoop-3.1.3/bin/hdfs --daemon start namenode
12.在hadoop104上同步hadoop102 namenode元数据
/opt/module/hadoop-3.1.3/bin/hdfs namenode -bootstrapStandby
14.在hadoop102 上关闭namenode
/opt/module/hadoop-3.1.3/bin/hdfs --daemon stop namenode
15.格式化zkfc(仅第一次启动执行)在hadoop102 上执行即可
/opt/module/hadoop-3.1.3/bin/hdfs zkfc -formatZK
16.分别在hadoop102、hadoop103、hadoop104上关闭journalnode
/opt/module/hadoop-3.1.3/bin/hdfs --daemon stop journalnode
17.启动hadoop
分别在hadoop102、hadoop103、hadoop104上启动journalnode
/opt/module/hadoop-3.1.3/bin/hdfs --daemon start journalnode
18.在hadoop102上执行start-all.sh
/opt/module/hadoop-3.1.3/sbin/start-all.sh
19.在hadoop104上启动历史服务器
/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver
#如果一切顺利,运行jps命令查看进程
jps
hadoop安装、启动完毕!下面验证一下hadoop的ha是否有效!
四、验证
1.web访问
HDFS
其中一个是active,一个是standby
YARN
在浏览的时候standby会重定向跳转到active对应的页面
2.HA的验证
namenode HA
访问
其中一个是active,一个是standby
主备切换验证
在hadoop102上kill -9 namenode的进程,这时候namenode会自动切换到hadoop104
YARN HA
主备切换验证
在hadoop102上kill -9 resourcemanager的进程
这时可以访问http://hadoop103:8088
然后在hadoop102上重新启动resourcemanager(yarn --daemon start resourcemanager),再访问http://hadoop102:8088时就会自动跳转到 http://hadoop103:8088