01 前言
hadoop是由Apache基金会所开发的一个分布式的大数据计算与存储平台,特点是:可靠性高、易扩展、计算高效与成本低。
它有两个核心项目,其中HDFS负责数据存储,MapReduce负责分布式计算。本文主要讲解HDFS项目的HA架构搭建
本文转自我个人的公众号:天目星 ,请大家多多关注。
一、使用的软件版本与架构图。
linux:CentOS 7.5.1804
hadoop:hadoop-3.2.0.tar.gz
zookeeper:zookeeper-3.4.14.tar.gz
java:jdk-8u201-linux-x64.rpm
在之前的架构中,namenode是HDFS集群的单点故障所在,所以官方推出使用JournalNode来管理namenode的edit log,并自动切换两个namenode节点的状态(Standby/Active)
官方文档路径:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
使用三台主机搭建测试环境,角色如下
角色 | namenode | datanode | journalnode | zookeeper |
node1 | √ | × | √ | √ |
node2 | √ | √ | √ | √ |
node3 | × | √ | √ | √ |
NameNode:负责管理fsimage(文件系统目录)与edits log(操作日志)
DataNode:负责具体数据块存储,并向NameNode发送Blockreport
JournalNode:负责管理主备节点的fsimage与edits一致性
zookeeper:负责NameNode主备状态监控与故障转移
二、安装
三台节点配置好hosts文件,并配置ssh免密登录
三台主机都需要配置,并拷贝密匙到其他两台主机
$ ssh-keygen
$ ssh-copy-id $hostname
依赖包:需要安装JDK,本例使用了RPM包安装
$ rpm -ivh jdk-8u201-linux-x64.rpm
$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
1、安装zookeeper
在三台节点中安装zookeeper,安装方式之前有说过,请参考ELK集群组件-kafka这篇文章的zookeeper安装步骤。
2、安装hadoop
在官网下载hadoop并解压至相应的路径
$ tar xvf hadoop-3.2.0.tar.gz -C /opt
$ mv /opt/hadoop-3.2.0 /opt/hadoop
新建以下文件夹,用于hadoop相关角色的使用
$ mkdir -p /opt/data/{datanode,journal,namenode,tmp}
3、配置hadoop
配置环境设置:hadoop-env.sh
$ cat >> hadoop-env.sh <<EOF
export JAVA_HOME=/usr/java/latest
EOF
配置:core-site.xml
$ vim /opt/hadoop/etc/hadoop/core-site.xml
<configuration>
<!-- 默认的文件系统名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://tkscluster</value>
</property>
<!-- TMP存放路径,如不配置namenode.dir与datanode.dir将存放此处 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/tmp</value>
</property>
<!-- 回收站文件保留时间 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 提供故障转移的zookeeper列表 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
配置:hdfs-site.xml
$ vim /opt/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<!-- Hadoop 3.x HA Configuration -->
<!-- hdfs集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>tkscluster</value>
</property>
<!-- 设置两个namenode节点 -->
<property>
<name>dfs.ha.namenodes.tkscluster</name>
<value>nn1,nn2</value>
</property>
<!-- namedoe的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.tkscluster.nn1</name>
<value>node1:9820</value>
</property>
<property>
<name>dfs.namenode.rpc-address.tkscluster.nn2</name>
<value>node2:9820</value>
</property>
<!-- namedoe的http地址 -->
<property>
<name>dfs.namenode.http-address.tkscluster.nn1</name>
<value>node1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.tkscluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- journalNode的URI地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/tkscluster</value>
</property>
<!-- journalNode存放edits目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/journal</value>
</property>
<!-- 用于dfs客户端连接活动namenode -->
<property>
<name>dfs.client.failover.proxy.provider.tkscluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 用于ha故障转移时使用ssh方式 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- ssh登录时使用的密匙,配合上一条配置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 启动HA故障自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 数据块副本的数量,按实际情况设置 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- namenode文件的存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/namenode</value>
</property>
<!-- datanode的数据存储路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/datanode</value>
</property>
<!-- 测试环境关闭了权限管理,如生产环境需开启 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- datanode故障时的replace方式 -->
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
<value>false</value>
</property>
<!-- datanode故障时的replace策略 -->
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
<value>DEFAULT</value>
</property>
<!-- 支持文件append,主要是支持hbase -->
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
</configuration>
配置:workers
添加datanode节点角色列表
$ vim /opt/hadoop/etc/hadoop/workers
node2
node3
3、启动hadoop
初始化HDFS
先启动三个节点的journalnode进程
$ /opt/hadoop/bin/hdfs --daemon start journalnode
初始化namenode
$ /opt/hadoop/bin/hdfs namenode -format
初始化ZKFC
$ /opt/hadoop/bin/hdfs zkfc -formatZK
配置HDFS启动脚本的权限
PS:以下两个脚本都需要添加
$ vim /opt/hadoop/sbin/start-dfs.sh
$ vim /opt/hadoop/sbin/stop-dfs.sh
在配置文件以下段添加
# defined. e.g., HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs
#
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
准备开启HDFS服务
先关闭三个节点之前开启的journalnode进程,因ZKFC服务未启动
$ /opt/hadoop/bin/hdfs --daemon stop journalnode
启动HDFS
$ /opt/hadoop/sbin/start-dfs.sh
关闭HDFS
$ /opt/hadoop/sbin/stop-dfs.sh
启动后的状态检查
在node1使用java的jps命令
$ jps
43618 QuorumPeerMain #zk服务
69988 NameNode #namenode服务
70615 JournalNode #journalnode服务
71067 DFSZKFailoverController #ZKFC服务
71628 Jps
在node2使用jps命令查看
$ jps
43324 QuorumPeerMain #zk服务
64563 NameNode #namenode服务
70654 JournalNode #journalnode服务
71342 DFSZKFailoverController #ZKFC服务
65726 DataNode #datanode服务
71642 Jps
使用jps查询node3的情况
43214 QuorumPeerMain #zk服务
70512 JournalNode #journalnode服务
64365 DataNode #datanode服务
71428 Jps
登录网站查看状态
http://192.168.159.45:9870/