目录

Hadoop3分布式高可用部署

CentOS7.4系统部署Hadoop3集群高可用

目的

本篇文章介绍如何使用Zookeeper来部署Hadoop的高可用配置。

准备环境

4个虚拟机

1
2
3
4
10.4.53.78 bigdata-1
10.4.53.79 bigdata-2
10.4.53.80 bigdata-3
10.4.53.81 bigdata-4

分配环境

  1. Zookeeper集群,在bigdata-2bigdata-3bigdata-4上部署。具体可以参考这篇文章
  2. Hadoop分布式集群参考这篇文章 ,2个NameNode节点管理HDFS,2个ResourceManager节点管理资源,3个JournalNode节点用于NameNode通信,3个DataNode节点用于干活,3个NodeManager跟着DataNode
bigdata-1bigdata-2bigdata-3bigdata-4
Zookeeper
NameNode
ResourceManager
DataNode
NodeManager
JournalNode

配置HDFS高可用

bigdata-1服务器上修改$HADOOP_HOME/etc/hadoop下的配置文件

  1. core-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
  <!-- 指定 namenode 的 hdfs 协议文件系统的通信地址的别名 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <!-- 指定 hadoop 集群存储临时文件的目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop/ha</value>
  </property>
  <!-- ZooKeeper 集群的地址 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>bigdata-2:2181,bigdata-3:2181,bigdata-4:2181</value>
  </property>
  <!-- ZKFC 连接到 ZooKeeper 超时时长 -->
  <property>
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>10000</value>
  </property>
</configuration>
  1. hdfs-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<configuration>
  <!-- 指定 HDFS 副本的数量 -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <!-- namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/opt/hadoop/ha/nn/data</value>
  </property>
  <!-- datanode 节点数据(即数据块)的存放位置 -->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/opt/hadoop/ha/dn/data</value>
  </property>
  <!-- 集群服务的逻辑名称 -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <!-- NameNode ID 列表-->
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  <!-- nn1 的 RPC 通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>bigdata-1:8020</value>
  </property>
  <!-- nn2 的 RPC 通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>bigdata-2:8020</value>
  </property>
  <!-- nn1 的 http 通信地址 -->
  <property>
	<!--Hadoop2中的端口默认是50070-->
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>bigdata-1:9870</value>
  </property>
  <!-- nn2 的 http 通信地址 -->
  <property>
	<!--Hadoop2中的端口默认是50070-->
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>bigdata-2:9870</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 元数据在 JournalNode 上的共享存储目录 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://bigdata-1:8485;bigdata-2:8485;bigdata-3:8485/mycluster</value>
  </property>
  <!-- Journal Edit Files 的存储目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/hadoop/ha/jnn/data</value>
  </property>
  <!-- 配置隔离机制,确保在任何给定时间只有一个 NameNode 处于活动状态 -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <!-- 使用 sshfence 机制时需要 ssh 免密登录 -->
  <property>  
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>
  <!-- SSH 超时时间 -->
  <property>  
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>
  <!-- 开启NN故障自动转移 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>

配置hive时需要core-site.xml添加如下配置,不然root用户无法访问hive。

1
2
3
4
5
6
7
8
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

配置YARN高可用

修改$HADOOP_HOME/etc/hadoop下的配置文件

  1. yarn-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<configuration>
    <!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 启用 RM HA -->
    <property>
       <name>yarn.resourcemanager.ha.enabled</name>
       <value>true</value>
    </property>
    <!-- ZooKeeper 集群的地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>bigdata-2:2181,bigdata-3:2181,bigdata-4:2181</value>
    </property>
    <!-- RM 集群标识 -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>my-yarn-cluster</value>
    </property>
    <!-- RM 的逻辑 ID 列表 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <!-- RM1 的服务地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>bigdata-3</value>
    </property>
    <!-- RM2 的服务地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>bigdata-4</value>
    </property>
    <!-- 是否启用日志聚合 (可选) -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 聚合日志的保存时间 (可选) -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    <!-- RM1 Web 应用程序的地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>bigdata-3:8088</value>
    </property>
    <!-- RM2 Web 应用程序的地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>bigdata-4:8088</value>
    </property>
    <!-- 启用自动恢复 -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <!-- 用于进行持久化存储的类 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</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>
</configuration>
  1. mapred-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<configuration>
  <!--指定 mapreduce 作业运行在 yarn 上-->
  <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>
</configuration>

分发配置文件

将配置文件分发到所有Hadoop集群节点

1
2
3
4
5
root@bigdata-1:# cd $HADOOP_HOME/etc/hadoop
root@bigdata-1:# pdcp -w bigdata-[2-4] core-site.xml $PWD
root@bigdata-1:# pdcp -w bigdata-[2-4] hdfs-site.xml $PWD
root@bigdata-1:# pdcp -w bigdata-[2-4] yarn-site.xml $PWD
root@bigdata-1:# pdcp -w bigdata-[2-4] mapred-site.xml $PWD

第一次启动

  1. 启动Zookeeper集群
1
root@bigdata-1:# pdsh -w bigdata-[2-4] "source /etc/profile;zkServer.sh start"
  1. 在3台虚拟机上分别启动 JournalNode
1
root@bigdata-1:# pdsh -w bigdata-[1-3] "source /etc/profile;$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode"
  1. bigdata-1格式化NameNode
1
root@bigdata-1:# $HADOOP_HOME/bin/hdfs namenode -format
  1. bigdata-1启动NameNode
1
root@bigdata-1:# $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
  1. bigdata-2同步NameNode元数据,因为NameNode是通过JournalNode通信的,所以先启动的JournalNode
1
root@bigdata-2:# $HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
  1. 在任意一台NameNode上使用以下命令来初始化 ZooKeeper 中的 HA 状态
1
root@bigdata-1:# $HADOOP_HOME/bin/hdfs zkfc -formatZK
  1. 启动dfs
1
root@bigdata-1:# $HADOOP_HOME/sbin/start-dfs.sh

这里启动的时候会提示1个NameNode 和3个JournalNode 都已经启动了,不需要担心。等下次再启动的时候,直接来执行这个命令就可以了。 8. 在bigdata-3上启动YARN

1
root@bigdata-3:# $HADOOP_HOME/sbin/start-yarn.sh
  1. 当前配置,YARN的standby节点不会自动启动,所以还需要手动启动。
1
root@bigdata-4:# $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager

至此,Hadoop分布式高可用部署启动完成。