[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

HDFS-HA高可用完全分布式搭建

环境背景

1 修改hosts文件

2 免密钥登录

3 安装zookeeper

4 安装hadoop

5 第一次启动

6 之后的启动和关闭

环境背景

各虚拟机的系统时间需要同步, 各节点预先安装好jdk1.7 因为多节点有相同操作,使用xshell的同步命令能简化步骤
使用的各节点虚拟机操作系统为CentOS_6.5
共四个节点node01,node02,node03,node04,ip分别为
node01 192.168.110.101
node02 192.168.110.102
node03 192.168.110.103
node04 192.168.110.104
将以node01作为NameNode-1,node02作为NameNode-2
node02,node03,node04作为DataNode,并在q其上zookeeper集群
ZKFC分别位于node01,node02节点
journalnode位于node01,node02,node03节点

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
登录用户为root

选择node01为管理节点,若没有特殊说明,默认操作的都是node01节点

hadoop-2.6.5资源链接:
链接:https://pan.baidu.com/s/1NHTCtqHbsuKztpruSRyB-A
提取码:j0sg

zookeeper-3.4.6资源链接:
链接:https://pan.baidu.com/s/1CNzFnVDqOst5JuHsh5K61g
提取码:chzx

1 修改hosts文件

在每个节点的hosts文件末尾加上节点地址
192.168.110.101 node01
192.168.110.102 node02
192.168.110.103 node03
192.168.110.104 node04

vim /etc/hosts

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

2 免密钥登录

为了使用hadoop的管理脚本控制所有节点,要使node01 获得其他节点的免密钥登录权限
另外为了node01和node02之间可以互相免登录(zkfc的需要)还要使node02节点获得node01节点的免密钥登陆权限

先完成node01对其他节点的免密钥登录

node01输入命令
ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa
在/root目录生成.ssh目录

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
进入.ssh目录,其中有密钥id_dsa和公钥id_dsa.pub
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
把公钥放到访问方的认证文件里即可获得免密钥登陆权限
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
原本需要密码
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
完成免密钥登录后不需要密码
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

接下来做其他节点的免密钥登录
先在每个节点做一遍以下操作
① ssh root@localhost
② 输入密码
③ exit

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

将node01的公钥复制给其他三个节点,分别使用命令(此时还需要输入其他节点的登陆密码)

scp id_dsa.pub  root@node02:/root/.ssh/node01.pub
scp id_dsa.pub  root@node03:/root/.ssh/node01.pub
scp id_dsa.pub  root@node04:/root/.ssh/node01.pub

在其他三个节点的/root/.ssh目录创建认证文件

cat node01.pub >>authorized_keys

成功免密登录

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

接下来做node02对node01的免密钥登录

在node02输入命令

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
先对自己做免密钥登录
cat id_dsa.pub >> authorized_keys
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

然后把node02的公钥分发给node01

scp id_dsa.pub node01:/root/.ssh/node02.pub

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
在node01中将node02的公钥添加到认证文件中

cat node02.pub >> authorized_keys

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
免密钥登陆成功

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

3 安装zookeeper集群

要在node02/03/04三个节点安装zookeeper集群

3.1 修改环境变量
先在三个节点修改环境变量

vi /etc/profile

修改添加:

export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_PREFIX=/opt/hdfs/hadoop-2.6.5
export ZOOKEEPER_HOME=/opt/hdfs/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$ZOOKEEPER_HOME/sbin:$ZOOKEEPER_HOME/bin

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
使环境变量生效,输入

source /etc/profile

3.2 解压安装
使用node02先安装zookeeper,安装完后分发给其他节点即可
解压zookeeper,将文件夹移动到/opt/hdfs/zookeeper-3.4.6
进入conf目录
备份一个zoo_sample.cfg,重命名为zoo.cfg,修改zoo.cfg文件(此为被使用的配置文件)
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
编辑第12行
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
改为
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
在文件末尾加上

server.1=192.168.110.102:2888:3888
server.2=192.168.110.103:2888:3888
server.3=192.168.110.104:2888:3888

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

3.3 分发zookeeper
由node02节点分发zookeeper

scp -r zookeeper-3.4.6/ node03:/opt/hdfs/
scp -r zookeeper-3.4.6/ node04:/opt/hdfs/

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

3.4 根据上面配置的server.x设定每个节点的zookeeper的id
举例在node04节点

mkdir -p /var/hdfs/zk	(之前设置的dataDir)

echo 3 > /var/hdfs/zk/myid && cat /var/hdfs/zk/myid	(node02为1,node03为2,node04为3)

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

3.5 启动zookeeper
在个节点输入命令

zkServer.sh start

并检查启动是否成功(需要关闭防火墙)

zkServer.sh status

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

4 安装hadoop

4.1 环境变量

首先在四个节点创建安装目录/opt/hdfs

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
预先在四个节点修改环境变量
在/etc/profile文件末尾加上(含java环境变量,按自己实际情况更改)

export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_PREFIX=/opt/hdfs/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin

使环境变量生效

source /etc/profile

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

接下来只要在第一个节点完成hadoop的安装,再分发给其余三个节点即可

4.2 解压hadoop

将安装包文件上传至linux虚拟机(在环境背景中有资源链接)

解压,获得hadoop-2.6.5文件夹

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
将其移动至新建的/opt/hdfs目录
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

4.3 修改管理脚本

因为要远程执行hadoop的管理脚本,而远程执行时不会与先读取profile文件,即环境变量失效,解决办法为修改脚本中的命令为绝对路径查找
进入/opt/hdfs/hadoop-2.6.5/etc/hadoop目录,逐个修改”env”后缀的文件

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

hadoop-env.sh 第25行
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
改为
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
mapred-env.sh 第16行
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
改为
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
yarn-env.sh 第26行
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
改为
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
4.4 修改配置文件
仍然在/opt/hdfs/hadoop-2.6.5/etc/hadoop目录
core-site.xml文件中做修改
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
修改内容

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hdfs/hadoop/ha</value>
    </property>
    <property>
       <name>ha.zookeeper.quorum</name>       
       <value>node02:2181,node03:2181,node04:2181</value>
    </property>

</configuration>

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
其中fs.defaultFS指定meNode的位置
hadoop.tmp.dir位置的修改是出于安全性的考虑

继续修改hdfs-site.xml
hadoop框架默认副本数为3,这里修改为2
dfs.namenode.secondary.http-address设置SencondNameNode位置

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <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>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
</property>
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hdfs/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_dsa</value>
</property>
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>
</configuration>

slaves文件
slaves文件用于设定DataNode节点
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

4.5 分发hadoop

给其他节点做拷贝,输入命令

scp -r /opt/hdfs/hadoop-2.6.5/ node02:/opt/hdfs/
scp -r /opt/hdfs/hadoop-2.6.5/ node03:/opt/hdfs/
scp -r /opt/hdfs/hadoop-2.6.5/ node04:/opt/hdfs/

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5 第一次启动

5.1 先启动journalnode 分别在node01/02/03节点手动启动,输入
hadoop-daemon.sh start journalnode

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.2 格式化namenode
在node01节点输入

hdfs namenode -format

注意成功提示

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.3 启动namenode
在node01输入

hadoop-daemon.sh start namenode

在node02输入

hdfs namenode -bootstrapStandby

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.4 格式化zookeeper
在node01输入

hdfs zkfc -formatZK

注意是否格式化成功
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
可以从node04节点开启zookeeper客户端检测znode节点创建情况,在node04输入

zkCli.sh

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.5 启动hdfs
在node01输入

start-dfs.sh

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.6 检查各节点角色运行状态
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
5.7 登录查看node01/02状态
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

5.8 检测高可用性
结束node01的namenode进程
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
Node02上位成功

再重新启动node01的namenode

hadoop-daemon.sh start namenode

[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
结束node02的zkfc
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
[Hadoop]HDFS-HA高可用完全分布式搭建(基于hadoop-2.6.5的多NameNode形式)
node01光复成功

6 之后的启动和关闭

启动

环境搭建完毕, 以后想要启动hdfs-ha只需要:
1 启动zookeeper集群
2 在node01输入命令

start-dfs.sh

关闭
node01输入命令

stop-dfs.sh
上一篇:corosync+pacemaker+httpd


下一篇:node02