hadoop高可用架构

hadoop高可用

|-----------------|---------|--------------------------------------------------|
| IP | 主机名 | 角色 |
| 192.168.150.172 | server1 | NameNode DFSZKFailoverController ResourceManager |
| 192.168.150.173 | server2 | JournalNode QuorumPeerMain DataNode NodeManager |
| 192.168.150.174 | server3 | JournalNode QuorumPeerMain DataNode NodeManager |
| 192.168.150.175 | server4 | JournalNode QuorumPeerMain DataNode NodeManager |
| 192.168.150.176 | server5 | NameNode DFSZKFailoverController ResourceManager |

zookeeper集群部署

Zookeeper集群至少三台,总节点数为奇数个。

安装JDK

安装zookeeper

复制代码
tar zxf apache-zookeeper-3.8.6-bin.tar.gz
# 编辑zoo.cfg文件:
cd apache-zookeeper-3.8.6-bin/conf/
cp zoo_sample.cfg zoo.cfg
vim  zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
server.1=192.168.150.173:2888:3888
server.2=192.168.150.174:2888:3888
server.3=192.168.150.175:2888:3888

各节点配置文件相同,并且需要在/tmp/zookeeper目录中创建myid文件,写入

一个唯一的数字,取值范围在1-255。比如:192.168.36.167节点的myid文件写入数

字"1",此数字与配置文件中的定义保持一致,(server.1=192.168.150.173:2888:3888

)其它节点依次类推。

复制代码
mkdir -p /tmp/zookeeper
echo 1 > /tmp/zookeeper/myid

在各节点启动服务:(server2、server3、server4)

bin/zkServer.sh start

查看节点状态

bin/zkServer.sh status

hadoop配置

复制代码
[hadoop@server1 ~]$ cd hadoop/etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://masters</value>
    </property>

<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.150.173:2181,192.168.150.174:2181,192.168.150.175:2181</value>
</property>

</configuration>
复制代码
[hadoop@server1 hadoop]$ vim hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>

<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>

<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>192.168.150.172:9000</value>
</property>

<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>192.168.150.172:9870</value>
</property>

<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>192.168.150.176:9000</value>
</property>

<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>192.168.150.176:9870</value>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.150.173:8485;192.168.150.174:8485;192.168.150.175:8485/masters</value>
</property>

<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value>
</property>

<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<property>
<name>dfs.client.failover.proxy.provider.masters</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>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>

</configuration>

启动hdfs集群(按顺序启动)

1)确认启动zookeeper集群(server2、server3、server4)
复制代码
[hadoop@server2~]$ jps

1222QuorumPeerMain

1594 Jps
2)在三个DN上依次启动journalnode(第一次启动hdfs必须先启动journalnode)
复制代码
[hadoop@server2 ~]$ cd hadoop
[hadoop@server2 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server2 hadoop]$ jps
2337 JournalNode
2180 QuorumPeerMain
2379 Jps
3)格式化HDFS集群(server1上执行)
复制代码
$ bin/hdfs namenode -format
Namenode数据默认存放在/tmp,需要把数据拷贝到h2
$ scp -r /tmp/hadoop-hadoop server5:/tmp
4)格式化zookeeper (只需在h1上执行即可)
复制代码
$ bin/hdfs zkfc -formatZK (注意大小写)
5)启动hdfs集群(只需在h1上执行即可)
复制代码
$ sbin/start-dfs.sh
6)查看集群状态

7)测试故障自动切换

杀掉h2主机的namenode进程后依然可以访问,此时h1转为active状态接

管namenode

复制代码
[hadoop@server5 ~]$ jps
2883 Jps
2373 DFSZKFailoverController
2670 NameNode
[hadoop@server5 ~]$ kill -9 2670
[hadoop@server5 ~]$ jps
2915 Jps
2373 DFSZKFailoverController
[hadoop@server5 ~]$ cd hadoop
[hadoop@server5 hadoop]$ bin/hdfs --daemon start namenode
[hadoop@server5 hadoop]$ jps
2373 DFSZKFailoverController
2972 NameNode
3006 Jps


启动h1上的namenode,此时为standby状态。

yarn高可用

修改配置文件

复制代码
[hadoop@server1 hadoop]$ vim mapred-site.xml
复制代码
[hadoop@server1 hadoop]$ vim yarn-site.xml

<configuration>
    <!-- ======================== NodeManager 基础配置 ======================== -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        <!-- 辅助服务:MapReduce 任务运行时需要 Shuffle 服务来传输 Map 输出结果 -->
        <!-- 这是 YARN 运行 MapReduce 作业的必备配置,不能更改名称 -->
    </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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
        <!-- 环境变量白名单:NodeManager 在启动容器时会传递这些环境变量给作业 -->
        <!-- 确保 MapReduce 任务能正确找到 Hadoop 各组件路径和 Java 环境 -->
    </property>

    <!-- ======================== ResourceManager HA 核心配置 ======================== -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
        <!-- 启用 ResourceManager 高可用(HA)模式 -->
        <!-- true = 启动两个 RM(Active/Standby),false = 单 RM 模式 -->
    </property>

    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>RM_CLUSTER</value>
        <!-- 集群标识符:用于区分不同 YARN 集群,多个 HA 集群必须不同 -->
        <!-- 该 ID 会写入 ZooKeeper,供客户端识别当前连接的 RM 集群 -->
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
        <!-- 定义两个 ResourceManager 的逻辑 ID(名称自定义) -->
        <!-- rm1 和 rm2 分别对应下面配置的主机名 -->
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>server1</value>
        <!-- 第一个 ResourceManager 运行的主机名(对应 rm1) -->
        <!-- 确保 server1 已启动 ResourceManager 服务 -->
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>server5</value>
        <!-- 第二个 ResourceManager 运行的主机名(对应 rm2) -->
        <!-- server5 的 RM 作为 Standby 备用 -->
    </property>

    <!-- ======================== 状态存储与故障恢复 ======================== -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
        <!-- 启用 RM 状态恢复功能 -->
        <!-- RM 重启/故障切换时能从 ZooKeeper 恢复之前的状态(队列、应用等) -->
    </property>

    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        <!-- 状态存储类型:使用 ZooKeeper 存储 RM 状态 -->
        <!-- 这是 HA 模式下推荐的存储方式,保证 RM 切换时状态不丢失 -->
    </property>

    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>192.168.150.173:2181,192.168.150.174:2181,192.168.150.175:2181</value>
        <!-- ZooKeeper 集群地址(端口默认 2181) -->
        <!-- RM 通过 ZooKeeper 实现选举和状态同步,三个节点构成高可用 -->
    </property>
</configuration>

启动yarn服务

复制代码
[hadoop@server1 hadoop]$ sbin/start-yarn.sh
Starting resourcemanagers on [ server1 server5]
Starting nodemanagers
[hadoop@server1 hadoop]$ jps
13492 DFSZKFailoverController
15925 Jps
15798 ResourceManager
13720 NameNode

测试yarn故障切换

初始是server5是active

相关推荐
千里码aicood1 天前
基于Hadoop的汽车销量分析与可视化
大数据·hadoop·分布式
wxchyy3 天前
手把手教你入门云计算(二):这些技术改变了世界,你也能轻松掌握
hadoop·阿里云·docker·云原生·华为云·云计算·运维开发
BD_Marathon3 天前
Hadoop组成
大数据·hadoop·分布式
邀星月为媒3 天前
正式迁移 Gitee:core-site-hive 与 core-hive-agent 后续更新只认这两个地址
hive·hadoop·gitee
BD_Marathon3 天前
Hadoop常用端口号
java·大数据·hadoop
fastjson_4 天前
Hive 复杂数据类型
数据仓库·hive·hadoop
爱吃面的猫4 天前
大数据Hadoop之——集群环境搭建(了解)
大数据·hadoop·flume
一路向北finish4 天前
《Hadoop 高可用集群与 OpenStack Mitaka 控制节点部署全流程实操排坑指南》
大数据·linux·运维·服务器·hadoop·openstack
insertYam4 天前
[hadoop高可用架构]
大数据·hadoop·架构