一.环境说明
集群环境至少需要3个节点(也就是至少3台服务器设备):1个Master
,2个Slave
,节点之间局域网连接,可以相互ping
通,下面举例说明,配置节点IP分配如下:
Hostname | IP | User | Password |
---|---|---|---|
master | 172.19.69.251 | root | * |
slave | 172.19.69.252 | root | * |
slave | 172.19.69.253 | root | * |
三个节点均使用CentOS 7.4.1708
系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoop
、zookeeper
目录结构。
我采用的各组件版本为:
JDK
:jdk1.8.0_45
Hadoop
:hadoop-2.8.5
Zookeeper
:zookeeper-3.4.12
1.修改Linux主机名
2.修改IP
3.修改主机名和IP的映射关系
注意如果你们公司是租用的服务器或是使用的云主机(如华为云主机、阿里云主机等)
/etc/hosts里面要配置的是内网IP地址和主机名的映射关系
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等
准备工作
1. 安装JDK
三台机器下载同版本JDK1.8.0_45
安装
修改配置文件 vim /etc/profile
,配置环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_45
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar
重新加载配置文件使之生效source /etc/profile
source FileName
:source
命令通常用于重新执行刚修改的初始化文档,如.bash_profile
和.profile
等等
2. 修改Linux主机名
2.1 修改hosts
vim /etc/hosts
172.19.69.251 hadoop1
172.19.69.252 hadoop2
172.19.69.253 hadoop3
2.2 修改hostname
# 阿里云服务器用
hostnamectl set-hostname hadoop2
3. 集群之间ssh无密码登录
CentOS
默认安装了ssh
,如果没有你需要先安装ssh
。
集群环境的使用必须通过ssh
无密码登陆来执行,本机登陆本机必须无密码登陆,主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制。
3.1 开启Authentication免登陆
PasswordAuthentication yes
如果是root
用户下进行操作,还要去掉 #PermitRootLogin yes
注释,允许root
用户登录。
3.2 生成authorized_keys
输入命令,ssh-keygen -t rsa
,生成key
,一直按回车。
就会在/root/.ssh
生成:authorized_keys
、id_rsa.pub
、id_rsa
三个文件,为了各个机器之间的免登陆,在每一台机器上都要进行此操作。
3.3 合并公钥到authorized_keys
文件
进入其中一台机器【172.19.69.251
】的/root/.ssh
目录,输入以下命令:
#把本机公钥合并到authorized_keys 中
cat id_rsa.pub>> authorized_keys
#把其他机器的公钥合并到authorized_keys 中
ssh root@172.19.69.252 cat ~/.ssh/id_rsa.pub>> authorized_keys
# 此处需输入其他机器的密码
ssh root@172.19.69.253 cat ~/.ssh/id_rsa.pub>> authorized_keys
#或者
ssh root@hadoop2 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
ssh root@hadoop3 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
#完成之后输入命令,把authorized_keys远程copy到其他机器之中
scp authorized_keys 172.19.69.252:/root/.ssh/
scp authorized_keys 172.19.69.253:/root/.ssh/
拷贝完成后,在每台机器上进行 service sshd restart
操作, 重新启动ssh
服务。
在每台机器输入 ssh 172.19.69.xx
,测试能否无需输入密码连接另外两台机器。
Zookeeper集群安装配置
参考上篇Zookeeper基本介绍
![](https://img.haomeiwen.com/i3409462/51dddd1e3a84a8c0.png)
![](https://img.haomeiwen.com/i3409462/06658b144df9595a.png)
Hadoop集群安装配置
1. 下载解压安装。
![](https://img.haomeiwen.com/i3409462/f1384938db481bcc.png)
![](https://img.haomeiwen.com/i3409462/23fb1caca93d5bde.png)
![](https://img.haomeiwen.com/i3409462/f4bd643e91f50911.png)
2. 修改hadoop配置
解压安装包,并修改配置文件
[root@master apps]# tar -zxvf hadoop-2.8.5.tar.gz
[root@master apps]# mkdir hdptmp
在两台从节点上建立相同的目录(hdfs初始化的时候会用到)
配置文件位置:~/hadoop-2.8.5/etc/hadoop
2.1 hadoop-env.sh
添加JDK
路径:export JAVA_HOME=
#vim hadoop-env.sh
export JAVA_HOME=jdk的安装目录
2.2 core-site.xml
修改Hadoop
核心配置文件core-site.xml
,这里配置的是HDFS
的地址和端口号。
<configuration>
<!-- 指定 hdfs的 nameservice为 ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/apps/hdptmp</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>
</property>
</configuration>
2.3 hdfs-site.xml
修改Hadoop
中HDFS
的配置,配置的备份方式默认为3
。
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master.hadoop:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>master.hadoop:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave1.hadoop:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>slave1.hadoop:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master.hadoop:8485;slave1.hadoop:8485;slave2.hadoop:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/apps/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</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>
<!-- 使用隔离机制时需要ssh免登陆 -->
<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>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
2.4 mapred-site.xml
修改Hadoop
中MapReduce
的配置文件,配置的是JobTracker
的地址和端口。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2.5 配置yarn-site.xml文件
<configuration>
<!-- 以下为YARN HA的配置-->
<!-- 开启YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 指定两个resourcemanager的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master.hadoop</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1.hadoop</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.6 修改slaves文件
[root@master /]# vi slaves
master.hadoop
slave1.hadoop
slave2.hadoop
2.7 配置hadoop环境变量
[root@master /]# vi /etc/profile
#set hadoop enviroment
export HADOOP_HOME=/apps/hadoop-2.8.0/
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#生效
[root@master /]# source /etc/profile
注意:三台机器上都进行相同的配置,都放在相同的路径下。
2.8 远程复制
使用scp命令进行从本地到远程的文件传输操作:
scp -r /usr/local/hadoop slave1:/usr/local/hadoop
scp -r /usr/local/hadoop slave2:/usr/local/hadoop
3. 启动hadoop集群
进入master
的~/hadoop
目录,执行以下操作:
格式化文件系统:
$ bin/hadoop namenode -format
第一次启动前操作,以后无需操作!!!
然后启动hadoop
:
$ sbin/start-all.sh
验证:通过jps
能看到NodeManager
,NameNode
,SecondaryNameNode
,ResourceManager
,DataNode
这几个进程。
启动集群
1. 启动ZooKeeper(三台机器一台一台的启动)
~/zookeeper/bin/zkServer.sh start
[root@master /]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.启动journalnode(三台一台一台启动)
[root@master /]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /apps/hadoop-2.8.5/logs/hadoop-root-journalnode-master.hadoop.out
[root@master /]#
3.启动hdfs
[root@master /]# start-dfs.sh
Starting namenodes on [master.hadoop slave1.hadoop]
slave1.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-slave1.hadoop.out
master.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-master.hadoop.out
slave2.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave2.hadoop.out
master.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-master.hadoop.out
slave1.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave1.hadoop.out
Starting journal nodes [master.hadoop slave1.hadoop slave2.hadoop]
slave2.hadoop: journalnode running as process 1870. Stop it first.
slave1.hadoop: journalnode running as process 2842. Stop it first.
master.hadoop: journalnode running as process 45029. Stop it first.
Starting ZK Failover Controllers on NN hosts [master.hadoop slave1.hadoop]
slave1.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-slave1.hadoop.out
master.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-master.hadoop.out
[root@master /]#
4.启动yarn
[root@master /]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-master.hadoop.out
slave1.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave1.hadoop.out
slave2.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave2.hadoop.out
master.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-master.hadoop.out
[root@master /]#
5.启动单个结点的yarn
进程(因为yarn
的两个resourcemanager
不会同时启动,必须手动启动另一台上的resourcemanager
)
去slave1.hadoop
上启动
[root@slave1 ~]# yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-slave1.hadoop.out
[root@slave1 ~]# jps
3489 Jps
2931 NameNode
2709 QuorumPeerMain
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]#
到此集群搭建完成!!!!!!!!!!!!!!!!!
~/hadoop/sbin/start-all.sh
测试高可用
访问 http://slave1.hadoop:50070/
![](https://img.haomeiwen.com/i3409462/ac65badeee418380.png)
访问 http://master.hadoop:50070/
![](https://img.haomeiwen.com/i3409462/021157427af8fcf4.png)
接下来是一台宕机(关闭slave1.hadoop
上的namenode
进程)杀掉2931
进程
[root@slave1 ~]# jps
2931 NameNode
2709 QuorumPeerMain
3733 Jps
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]# kill -9 2931
[root@slave1 ~]# jps
2709 QuorumPeerMain
3753 Jps
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]#
然后访问 http://slave1.hadoop:50070/
(无响应)
![](https://img.haomeiwen.com/i3409462/3037f1ec0e779ebe.png)
访问http://master.hadoop:50070/
(变成active)
![](https://img.haomeiwen.com/i3409462/cddcc51500f179f8.png)
网友评论