本文基于Hadoop3系列——(一)HDFS完全分布式搭建上修改

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop高可用集群6节点分布

节点分配图:

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop高可用集群6节点分布_02

 

说明下每个节点的作用:

NN:两个NN节点有两种状态:Active(活动)和Standby(备份)。

ZKFC:监控和控制NameNode的状态切换,当集群的Active(活动)NameNode挂掉时会把Standby(备份)切换成Active状态

JN:共享edits日志文件,edits文件一旦丢失,会导致元数据的丢失,DN也就丢了,JN往往是一个集群,保证edits不会丢失

ZK:ZooKeeper,选择其中一个备用的NameNode为Active。两个NN并非其中一个是Secondary NameNode节点,替代它的是Standby的NameNode

 

一、配置Zookeeper

(1)先下载zookeeper这里用的是zookeeper-3.4.14.tar.gz

可以从官网下载:http://zookeeper.apache.org/  或

(2)下载完上传到linux上

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop高可用集群6节点分布_03

(3)切换到/opt/software目录下,解压zookeeper:tar -zxvf zookeeper-3.4.14.tar.gz

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop高可用集群6节点分布_04

配置环境变量

切换到~目录:cd ~

编辑.bash_profile文件:vi .bash_profile,加入ZOOKEEPER_HOME和把ZOOKEEPER_HOME追加到PATH

JAVA_HOME=/usr/java/jdk1.8.0_261-amd64
HADOOP_HOME=/opt/software/hadoop-3.1.4
ZOOKEEPER_HOME=/opt/software/zookeeper-3.4.14
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

export PATH

(4)配置zoo.cfg文件

进入zookeeper.3.4.14文件夹下,进入conf目录:cd zookeeper.3.4.14/conf

把zoo_sample.cfg复制为zoo.conf

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop_05

打开编辑zoo.conf文件:vi zoo.conf,修改箭头的几行配置和添加方框内的代码,node1,node2,node3分别是对应节点的机器名(根据实际名称配置)

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop_06

(5)给每个节点创建myid

node1:

hadoop高可用集群6节点分布 部署hdfs高可用集群_zookeeper_07

node2:

hadoop高可用集群6节点分布 部署hdfs高可用集群_hdfs_08

node3:

hadoop高可用集群6节点分布 部署hdfs高可用集群_hdfs_09

 

(6)把node1节点的zookeeper复制到node2和node3节点上

cd到/opt/software/

执行scp -r zookeeper-3.4.14 root@node2:/opt/software/和scp -r zookeeper-3.4.14 root@node3:/opt/software/

(7)启动zookeeper()

进入到zookeeper的bin目录执行命令:./zkServer.sh start。如图1.

启动完成后会出现QuorumPeerMain进程,如图2.

图1.

hadoop高可用集群6节点分布 部署hdfs高可用集群_hdfs_10

图2.

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop_11

 

二、配Hadoop配置文件

一共要配置4个,分别是:hadoop-env.sh,core-site.xml,hdfs-site.xml,workers

切换到hadoop家目录下的etc/hadoop目录

hadoop高可用集群6节点分布 部署hdfs高可用集群_zookeeper_12

(1)编辑hadoop-env.sh,修改javahome和配置运进程的用户

#修改javahome的路径
export JAVA_HOME=/usr/java/jdk1.8.0_261-amd64

# 在文件最后追加下面5行
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USer=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root

(2)编辑core-site.xml,

在configuration标签加入下面内容

<!-- /mycluster是HDFS集群ID,在hdfs-site.xml里配置 -->
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
</property>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoopdata</value>
</property>
<!-- 定义在网页界面访问数据时使用的用户名 -->
<property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
</property>
<!-- 定义ZooKeeper集群 -->
<property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
</property>

(3)编辑hdfs-site.xml文件

在configuration标签加入下面内容

<!-- 配置HDFS集群ID -->
<property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
</property>
<!-- 配置NameNode的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>node1:8020</value>
</property>
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>node2:8020</value>
</property>
<!-- 定义NameNode的主机名和http协议的端口 -->
<property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>node1:9870</value>
</property>
<property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>node2:9870</value>
</property>
<!-- 定义共享edite的URL -->
<property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!-- 定义返回active namenode的类 -->
<property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 定义NameNode切换时的隔离方法 -->
<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>
<!-- 保存edits文件的目录 -->
<property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/journalnode/data</value>
</property>
<!-- 定义开启自动切换 -->
<property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
</property>

(4)编辑workers文件

加入DataNode节点

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop高可用集群6节点分布_13

三,格式化和复制文件

(1)执行下面命令把配置文件复制到其他机器上

scp hadoop-env.sh root@node1:/opt/software/hadoop-3.1.4/etc/hadoop/

scp hadoop-env.sh root@node2:/opt/software/hadoop-3.1.4/etc/hadoop/

scp core-site.xml root@node1:/opt/software/hadoop-3.1.4/etc/hadoop/

scp core-site.xml root@node2:/opt/software/hadoop-3.1.4/etc/hadoop/

scp hdfs-site.xml root@node1:/opt/software/hadoop-3.1.4/etc/hadoop/

scp hdfs-site.xml root@node2:/opt/software/hadoop-3.1.4/etc/hadoop/

scp workers root@node1:/opt/software/hadoop-3.1.4/etc/hadoop/

scp workers root@node2:/opt/software/hadoop-3.1.4/etc/hadoop/

 

(2)启动JN节点,在每台机器上执行命令:hdfs --daemon start journalnode。启动完成后会有一条JournalNode线程

(3)格式化,执行:hdfs namenode -format

(4)把元数据复制到node2节点上:scp -r /opt/hadoopdata root@node2:/opt/

(5)格式化ZKFC:在note1节点上执行hdfs zkfc -formatZK

四、启动集群和验证

(1)启动集群:执行./start-dfs.sh

node1ip:9870,node1是active状态

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop_14

node2ip:9870,node2是standby状态

hadoop高可用集群6节点分布 部署hdfs高可用集群_hdfs_15

 

把node1的namenode kill掉后node2会变为active状态

[root@node1 opt]# jps
2642 Jps
1417 QuorumPeerMain
2588 DFSZKFailoverController
2174 DataNode
2046 NameNode
1695 JournalNode
[root@node1 opt]# kill -9 2046

hadoop高可用集群6节点分布 部署hdfs高可用集群_hadoop_16