一、准备阶段
分布式思想
分布式集群规划
主机名 | IP地址 | NN-1 | NN-2 | DN | ZK | ZKFC | JNN |
Hadoop1 | 192.168.23.133 | √ | √ | √ | |||
Hadoop2 | 192.168.23.130 | √ | √ | √ | √ | √ | |
Hadoop3 | 192.168.23.132 | √ | √ | √ | |||
Hadoop4 | 192.168.23.131 | √ | √ |
二、操作步骤
1、搭建zookeeper集群
(1)先在节点2上解压zookeeper-3.4.10.tar.gz
(2)修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
mv zoo_sample.cfg zoo.cfg
(3)在2、3、4节点上创建/var/hpe/zookeeper,修改zoo.cfg
dataDir=/var/hpe/zookeeper
server.1=Hadoop2:2888:3888
server.2=Hadoop3:2888:3888
server.3=Hadoop4:2888:3888
(4)在dataDir目录下创建一个myid文件,在这个文件中写上当前节点ID号
(5)将配置好的zookeeper安装包发送到Hadoop3 Hadoop4
(6)发送完毕后,在各自节点上创建myid号,ID号要依次递增
2、搭建HA完全分布式
(1)查看每个节点的防火墙状态,若防火墙服务启动,则关闭防火墙服务
service iptables status //查看防火墙状态
iptables: Firewall is not running. //说明没有开启
service iptables stop //关闭防火墙服务。
chkconfig iptables off //禁止防火墙开机自启。
(2)在每个节点上执行以下命令,用来存放所需文件
mkdir -p /hpe/hadoop
(3)解压Hadoop-2.4.5.gz、jdk.gz、zookeeper-3.4.10.tar.gz
tar -zxvf Hadoop-2.4.5.gz
tar -zxvf jdk.gz
tar -zxvf zookeeper-3.4.10.tar.gz
(4)分别配置四台节点的Hadoop环境变量和jdk
输入 vim ~/.bashrc
在文件中添加如下代码:
//配置Hadoop环境变量
export HADOOP_HOME=/hpe/hadoop/Hadoop-2.6.5
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
//配置JDK环境变量
export JAVA_HOME=/hpe/hadoop/jdk1.8.0_151
export PATH=$PATH:$JAVA_HOME/bin
(5)为了不产生数据延迟首先使4个节点的时间同步
①各个节点安装ntp :
yum install ntp
②安装完成后每个节点都执行如下命令从而达到时间同步
/*ntp1.aliyun.com为阿里的时间服务器*/
ntpdate ntp1.aliyun.com
(6)配置hosts文件
vi /etc/hosts
// 实现主机名映射
192.168.23.133Hadoop1
192.168.23.130Hadoop2
192.168.23.132Hadoop3
192.168.23.131Hadoop4
(7)配置免密登录
Hadoop1->Hadoop1、Hadoop1->Hadoop2、Hadoop1->Hadoop3 Hadoop1->Hadoop4、Hadoop2->Hadoop1(主备切换)
①在所有节点执行以下命令
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
②在Hadoop1节点执行以下命令,将Hadoop1的公钥加入到其他节点的白名单中
ssh-copy-id -i ~/.ssh/id_rsa.pub root@Hadoop1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@Hadoop2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@Hadoop3
ssh-copy-id -i ~/.ssh/id_rsa.pub root@Hadoop4
③在Hadoop2节点执行以下命令,将Hadoop2的公钥加入到Hadoop1节点的白名单中
ssh-copy-id -i ~/.ssh/id_rsa.pub root@Hadoop1
④验证免密是否成功ssh Hadoop2
(8)修改hdfs-site.xml配置文件
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>Hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value> Hadoop2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value> Hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value> Hadoop2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://Hadoop1:8485; Hadoop2:8485; Hadoop3:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</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</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(9)修改core-site.xml配置文件
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>Hadoop2:2181,Hadoop3:2181,Hadoop4:2181</value> //设置zookeeper启动的节点位置
</property>
(10)修改slaves配置文件
Hadoop2
Hadoop3
Hadoop4
(11)在Hadoop1节点上将配置好的HDFS安装包发送到Hadoop2 Hadoop3 Hadoop4
scp -r hadoop-2.6.5 root@Hadoop2:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@Hadoop3:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@Hadoop4:/opt/software/hadoop/
(12)格式化NameNode(创建目录以及文件)
- ①在Hadoop1、Hadoop2、Hadoop3分别执行如下命令
1) hadoop-daemon.sh start journalnode //启动JNN
- ②随机选择一台NameNode执行
1) hdfs namenode -format
2) hadoop-daemon.sh start namenode
- ③另外一台NameNode节点执行
1) hdfs namenode -bootstrapStandby
(13)在Hadoop1和Hadoop2上分别执行以下命令,格式化zookeeper
hdfs zkfc -formatZK
(14)关闭所有节点上的进程
stop-dfs.sh
(15)启动HDFSstart-dfs.sh
(16)在每台节点上查看进程
说明每个进程在节点上启动成功。
若界面如下图所示,则证明HA分布式搭建成功
三、搭建过程中遇见的错误
(1)在搭建完全分布式的时候,防火墙状态是临时关闭的,所以系统重启后,防火墙状态又重新开启,导致集群内通信出现问题。
(2)slaves文件忘记配置。
(3)由于多次格式化的时候选择覆盖,出现clusterId不一致的问题,导致部分DataNode节点无法正常启动。查看clusterId后,修改为一致,即可解决。
(4)zookeeper集群没最先启动便在节点一二上执行hdfs zkfc -formatZK
,导致报错。