第1章 hadoop 高可用介绍
Hadoop高可用,除了数据存储的多副本机制之外,就是 Namenode和Resourcemanager的高可用。
在Hadoop2.0之前,Namenode只有一个,存在单点问题(虽然Hadoop1.0有SecondaryNamenode,CheckPointNode,BackupNode这些,但是单点问题依然存在),在Hadoop2.0引入了HA机制。Hadoop2.0的HA机制官方介绍了有2种方式,一种是NFS(Network File System)方式,另外一种是QJM(Quorum Journal Manager)方式。
启动了Hadoop2.0的HA机制之后,SecondaryNameNode,CheckpointNode,BackupNode这些都不需要了。
Namenode的高可用依赖于:
JournalNode负责数据交换
ZKFailoverController(又简称为ZKFC),内部会启动HealthMonitor和ActiveStandbyElector组件;HealthMonito做Namenode的健康状态检测;ActiveStandbyElector负责和zookeeper连接做主备选举。
Resourcemanager高可用依赖于:
Resourcemanager内部的主备选择器,连接Zookeeper做主备选举。
第2章 集群规划
Zookeeper集群(笔者zookeeper是单独的集群,不和hadoop放在一起)
| Zookeeper110 | Zookeeper111 | Zookeeper112 |
QuorumPeerMain | √ | √ | √ |
Hadoop集群
| Hadoop100 | Hadoop101 | Hadoop102 |
NameNode | √ | √ |
|
DataNode | √ | √ | √ |
DFSZKFailoverController | √ | √ |
|
JournalNode | √ | √ | √ |
ResourceManager |
| √ | √ |
NodeManager | √ | √ | √ |
第3章 集群部署
3.1 修改配置文件
3.1.1 修改core-site.xml
<configuration>
<!--指定HDFS中NameNode的地址 hadoop100:9000-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://jed/</value>
</property>
<!--指定Hadoop运行时产生文件的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.2/data/tmp</value>
</property>
<!-- 指定 zookeeper 集群访问地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zookeeper110:2181,zookeeper111:2181,zookeeper112:2181</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>
Indicates the number of retries a client will make to establisha server connection.
</description>
</property>
</configuration>
3.1.2 修改hdfs-site.xml
<configuration>
<!--指定HDFS地址 -->
<!-- <property>
<name>dfs.http.address</name>
<value>hadoop100:50070</value>
</property> -->
<!--指定HDFS副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定HDFS中辅助名称节点secondary节点主机配置 -->
<!-- <property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:50090</value>
</property> -->
<!--指定 hdfs 的 nameservice 为 jed,需要和 core-site.xml 中保持一致-->
<property>
<name>dfs.nameservices</name>
<value>jed</value>
</property>
<!-- jed 下面有两个 NameNode,分别是 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.jed</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.jed.nn1</name>
<value>hadoop100:9000</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.jed.nn1</name>
<value>hadoop100:50070</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.jed.nn2</name>
<value>hadoop101:9000</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.jed.nn2</name>
<value>hadoop101:50070</value>
</property>
<!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/jed</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-3.1.2/journaldata</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<!-- 此处配置较长,在安装的时候切记检查不要换行-->
<property>
<name>dfs.client.failover.proxy.provider.jed</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>
<!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/zihao/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间(30s) -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
3.1.3 修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
<!--历史服务器地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!--历史服务器web端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx512M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx512M</value>
</property>
</configuration>
3.1.4 修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- <property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property> -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 开启 RM 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定 RM 的 cluster id,可以自定义-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>haoyarn</value>
</property>
<!-- 指定 RM 的名字,可以自定义 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定各 RM 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop101</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop101:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop102:8088</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zookeeper110:2181,zookeeper111:2181,zookeeper112:2181</value>
</property>
<!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
3.2 初始化
3.2.1 格式化namenode
格式化hadoop100上的namenode,在namenode节点上操作(生产环境不要随便执行,很危险,格式化后,数据不客恢复)
$ hadoop namenode -format
3.2.2 同步namenode元数据
同步namenode元数据到另一个nanenode节点(hadoop102)
$ scp -r /opt/module/hadoop-3.1.2/data/tmp hadoop101: /opt/module/hadoop-3.1.2/data/tmp
或者直接用分发脚本分发
$ xsync /opt/module/adoop-3.1.2/data/tmp
也可以在standby节点上主动同步
$ hadoop namenode -bootstrapStandby
3.2.3 格式化DFSZKFailoverController (ZKFC)
任选一个namenode执行
$ hdfs zkfc -formatZK
3.3 启动集群
3.3.1 先启动zookeeper集群
Namenode和Resourcemanager的高可用都依赖于zookeeper做主备切换,所以必须先启动zookeeper集群
3.3.2 启动JournalNode
可在每台hadoop机器上单独启动journalnode,也可绕过此步,直接启动hdfs(默认启动所有节点的Journalnode)
$ sbin/hadoop-daemon.sh start journalnode
启动后进程
7311 JournalNode
3.3.3 启动hdfs
[zihao@hadoop100 hadoop-3.1.2]$ sbin/start-dfs.sh
Starting namenodes on [hadoop100 hadoop101]
Starting datanodes
Starting journal nodes [hadoop100 hadoop101 hadoop102]
Starting ZK Failover Controllers on NN hosts [hadoop100 hadoop101]
3.3.4启动yarn
[zihao@hadoop101 hadoop-3.1.2]$ sbin/start-yarn.sh
Starting resourcemanagers on [ hadoop101 hadoop102]
Starting nodemanagers
在hadoop102上启动历史服务
$ sbin/mr-jobhistory-daemon.sh start historyserver
*可以自己写一个统一脚本做群起
第4章 检查高可用各进程运行情况
4.1运行进程
[zihao@zookeeper110 apache-zookeeper-3.5.7-bin]$ xsh jps
-----------zookeeper110-----------
7415 QuorumPeerMain
7643 Jps
-----------zookeeper111-----------
7231 QuorumPeerMain
7391 Jps
-----------zookeeper112-----------
7160 QuorumPeerMain
7279 Jps
-----------hadoop100-----------
14690 NodeManager
18309 NameNode
18440 DataNode
18888 DFSZKFailoverController
18666 JournalNode
18942 Jps
-----------hadoop101-----------
13712 DataNode
13618 NameNode
11621 NodeManager
11494 ResourceManager
13977 DFSZKFailoverController
14011 Jps
13820 JournalNode
-----------hadoop102-----------
10544 DataNode
10711 Jps
9256 ResourceManager
9356 NodeManager
10652 JournalNode
4.2 打开web界面
hdfs的namenode,一个为active,另一个为standby
yarn的resourcemanager,一个为active,另一个为standby
当active节点发生故障时,standby节点会立即被切换为active,可自己kill进程检查,到web界面上观察,或到zookeeper下节点查看节点状态。